小言_互联网的博客

JavaWeb核心技术系列教程(26)——EL表达式基本语法

250人阅读  评论(0)

C语言自学完备手册(33篇)

Android多分辨率适配框架

JavaWeb核心技术系列教程

HTML5前端开发实战系列教程

MySQL数据库实操教程(35篇图文版)

推翻自己和过往——自定义View系列教程(10篇)

走出思维困境,踏上精进之路——Android开发进阶精华录

讲给Android程序员看的前端系列教程(40集免费视频教程+源码)


版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

概述

Servlet和JSP分工明确,各司其职:Servlet负责业务逻辑,即:获取表单数据、流程处理、分发与重定向;而JSP负责数据的显示 。假若,我们在开发过程中仍然在JSP中编写Java代码则显然违背了Servlet和JSP这两者的分工原则,而且造成JSP页面繁杂、可读性较差、且不易维护。为进一步简化JSP页面中访问数据的操作JSP2.0规范推出了表达式语言Expression Language,简称EL表达式。EL表达式核心用途在于替代基于<%= %>形式的Java表达式以及基于<% %>形式的Java片段使得JSP页面更加简洁易维护。

EL书写规范

EL表达式的书写非常简单,格式如下:

${表达式}

在该书写方式中,表达式必须满足EL语法规范。

EL语法规范

每一种语言都有自己的语法规范,EL表达式语言也不例外。在此,介绍EL的基本语法。

EL标识符

在EL表达式中,使用符号来标记如变量名、自定义函数名等, 这些符号被称为标识符。EL表达式中的标识符可以由任意顺序的大小写字母、数字和下划线组成;规范如下:

  • EL表达式的标识符不能以数字开头
  • EL表达式的标识符不能是EL中的保留字,例如:and、or、gt
  • EL表达式的标识符不能是EL隐式对象,例如:pageContext
  • EL表达式的标识符不能包含单引号、双引号、减号和正斜线等特殊字符

EL保留字

EL表达式常见保留字如下:

and、eq、gt、true、false、instanceof、or、ne

false、empty、not、lt、ge、null、div、mod、le

EL表达式的保留字不能作为标识符,以免程序在编译时报错。

EL变量

EL表达式的变量与JSP和Java中的局部变量、实例变量均不同。EL变量被称为命名变量,表示特定范围(域)中的属性对应的值。也就是说:${变量名}等价于pageContext.findAttribute(变量名)

请看如下示例。

${username}

等价于

<%
String username=(String)pageContext.findAttribute("username");
if(username!=null){
%>
<%=username %>
<%}%>

从本质上来说:EL表达式语句在执行时会调用pageContext.findAttribute( )方法,分别从page域、request域、session域、application域中查找数据直至找到为止;若在各域中均未找到则返回空字符串。

接下来我们来看一个错误示例:

<%
String city="BeiJing";
%>
${city}

此处,无法获取city的值,因为在page域、request域、session域、application域中均不存在city及其对应的值。

修正如下:

<%
String city="BeiJing";
pageContext.setAttribute("city", city, PageContext.SESSION_SCOPE);
%>
${city}

EL常量

在此,分类介绍EL中的常量。

布尔常量

布尔常量只有两种取值,分别是true和false

整型常量

El表达式中整型常量的范围为Java语言定义的Long.MIN_VALUE和Long.MAX_VALUE之间的整数

浮点数常量

El表达式中浮点数常量的范围为Java语言定义的Double.MIN_VALUE和Double.MAX_VALUE之间的小数

字符串常量

字符串常量时用单引号或双引号包含的字符串

Null常量

Null常量用于表示变量引用的对象为空,它只有一个值null

EL运算符

在此,详细介绍EL常用运算符。

算数运算符

算数运算符 说 明 示 例 结 果
+ ${13+3} 16
- ${19-2} 17
* ${2*5} 10
/或div $ {10/4} 或 $ {10 div 4} 2.5
%或mod 取模 $ {10%4} 或 ${10 mod 4} 2

比较运算符

比较运算符 说 明 示 例 结 果
==或eq 等于 $ {13==3} 或 $ {13 eq 2} false
!=或ne 不等于 $ {14!=5} 或 $ {14 ne 5} true
<或lt 小于 $ {9<5} 或 $ {9 lt 5} false
>或gt 大于 $ {7>3} 或 $ {7 gt 3} true
<=或le 小于等于 $ {6<=2} 或 $ {6 le 2} false
>=或ge 大于等于 $ {8>=5} 或 $ {8 ge 5} true

为避免与JSP页面标签产生冲突,在EL表达式中常用lt替换<表示小于;其余类似,不再赘述。

逻辑运算符

逻辑运算符 说 明 示 例 结 果
&&或and 逻辑与 $ {false&&true} 或 $ {false and true} false
| | 或or 逻辑或 $ {false||true} 或 $ {false or true} true
!或not 逻辑非 $ {!true} 或 $ {not true} false

.运算符

EL表达式中的.运算符用于访问JSP页面中对象的属性,示例如下:

${user.address}

在该示例中访问user对象的address的属性;类似于调用user对象的getAddress( )方法。

[ ]运算符

在此,介绍[ ]运算符两种常见的用途。

[ ]运算符第一种用途
与.运算符相似也用于访问JSP页面中对象的属性,只不过当属性名中包含特殊字符(例如:-、?、/)时就只能使用[ ]运算符获取属性值,示例如下:

${user["first-name"]}

[ ]运算符第二种用途
依据下标访问集合或者数组中的元素,示例如下:

${usersList[0]}

empty运算符

EL表达式的empty运算符用于判断命名变量是否为null,其结果为布尔类型,示例如下:

${empty user}

( )运算符

EL表达式中条件( )运算符用于明确其它运算符的优先级。

三目运算符

EL表达式中三目运算符用于执行条件判断,类似于Java语言中的if else语句,其语法格式如下:

${A? B : C}

在该语法格式中,表达式A的计算结果为布尔类型;如果表达式A的计算结果为true,就执行表达式B并返回结果;如果表达式A的计算结果为false,则执行表达式C并返回结构,示例如下:

${(1==0)?3:4}

该示例结果为4

EL表达式基本语法使用示例

在此,以示例形式综合运用EL表达式基本语法。

EL表达式获取数据

项目结构

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
	<head>
		<title>index</title>
	</head>
	<body>
		<h2 style="color: red;">本文作者:谷哥的小弟</h2>
		<h2 style="color: red;">博客地址:http://blog.csdn.net/lfdfhl</h2>
		<a href="${pageContext.request.contextPath}/TestServlet">Click Me</a>
	</body>
</html>


TestServlet

package cn.com;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet{
	
	private static final long serialVersionUID = -6517280874117779966L;
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		
		request.setAttribute("content","EL表达式");
		
		Person p1 = new Person();
        p1.setAge(23);
        request.setAttribute("person",p1);
        
        Person p2 = new Person("lucy",21);
        Address address = new Address("四川省","成都市","春熙路9527号");
        p2.setAddress(address);
        request.setAttribute("person",p2);
        
        Person p3 = new Person();
        p3.setName("小明");
        Person p4 = new Person();
        p4.setName("小李");
        Person p5 = new Person();
        p5.setName("小刘");
        List<Person> personList = new ArrayList<Person>();
        personList.add(p3);
        personList.add(p4);
        personList.add(p5);
        request.setAttribute("list",personList);
        
        Map<String,String> hashMap = new HashMap<String,String>();
        hashMap.put("lili","ID66");
        hashMap.put("dodo","ID77");
        hashMap.put("tutu","ID88");
        request.setAttribute("map",hashMap);
        
		RequestDispatcher requestDispatcher = request.getRequestDispatcher("/el.jsp");
		requestDispatcher.forward(request, response);
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}
}

el.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="cn.com.Person"%>
<%@page import="cn.com.Address"%>
<!DOCTYPE HTML>
<html>
	<head>
		<title>EL表达式获取数据</title>
	</head>
	<body>
		<h2 style="color: red;">本文作者:谷哥的小弟</h2>
		<h2 style="color: red;">博客地址:http://blog.csdn.net/lfdfhl</h2>
		<h3>获取request中的属性值</h3>
		content:${content}

        <h3>获取request中的对象的属性值</h3>
		age:${person.age}

        <h3>获取request中的对象的属性值</h3>
		city:${person.address.city}

        <h3>获取request里集合中对象的属性值</h3>
		name:${list[1].name}
		
        <h3>获取request里集合中对象的属性值</h3>
		${map.tutu}
		<br/>
		${map["tutu"]}
	</body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>EL05</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>cn.com.TestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/TestServlet</url-pattern>
  </servlet-mapping>
</web-app>

Address

package cn.com;

public class Address {
	private String province;
	private String city;
	private String street;
	public Address() {
		
	}
	
	public Address(String province, String city, String street) {
		this.province = province;
		this.city = city;
		this.street = street;
	}

	public String getProvince() {
		return province;
	}
	public void setProvince(String province) {
		this.province = province;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getStreet() {
		return street;
	}
	public void setStreet(String street) {
		this.street = street;
	}
	@Override
	public String toString() {
		return "Address [province=" + province + ", city=" + city + ", street=" + street + "]";
	}	
	
}

Person

package cn.com;

public class Person {
	private String name;
	private int age;
	private Address address;
	public Person() {
		
	}
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Address getAddress() {
		return address;
	}
	public void setAddress(Address address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
	}
	
}

EL表达式运算符练习

项目结构

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
	<head>
		<title>index</title>
	</head>
	<body>
		<h2 style="color: red;">本文作者:谷哥的小弟</h2>
		<h2 style="color: red;">博客地址:http://blog.csdn.net/lfdfhl</h2>
		<a href="${pageContext.request.contextPath}/TestServlet">Click Me</a>
	</body>
</html>


TestServlet

package cn.com;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class TestServlet extends HttpServlet{
	
	private static final long serialVersionUID = -1937917855692260979L;

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		
		String city="BeiJing";
        request.setAttribute("city",city);
        
        HttpSession session = request.getSession();
        session.setAttribute("user",new User("kame","female"));
        
        User user = new User();
        user.setName("soso");
        user.setGender("female");
        request.setAttribute("user",user);
        
		RequestDispatcher requestDispatcher = request.getRequestDispatcher("/el.jsp");
		requestDispatcher.forward(request, response);
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}
}

el.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="cn.com.User"%>
<!DOCTYPE HTML>
<html>
	<head>
		<title>EL表达式运算符</title>
	</head>
	<body>
	    <h2 style="color: red;">本文作者:谷哥的小弟</h2>
		<h2 style="color: red;">博客地址:http://blog.csdn.net/lfdfhl</h2>
		<h3>EL表达式算数运算符</h3>
		加法运算:${5+2}<br />
		减法运算:${9-3}<br />
		乘法运算:${2*4}<br />
		除法运算:${6/2}<br />

		<h3>EL表达式关系运算符</h3>
		5>=4:${5>=4}<br />
		5>=4:${5 ge 4}<br />

		<h3>EL表达式empty运算符</h3>
		city is null:${empty(city)}
		<br />

		<h3>EL表达式三目运算符</h3>
		user is null:${user==null ? "YES" : "NO"}
		<br />

		<h3>EL表达式实现数据回显</h3>
		<input type="radio" name="gender" value="male" ${user.gender=='male' ?'checked':''}/>男
		<input type="radio" name="gender" value="female" ${user.gender=='female' ?'checked':''}/>女
		<br />
	</body>
</html>


web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>EL06</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>cn.com.TestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/TestServlet</url-pattern>
  </servlet-mapping>
</web-app>

User

package cn.com;

public class User {
	private String name;
	private String gender;
	public User() {
		
	}
	public User(String name, String gender) {
		this.name = name;
		this.gender = gender;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
}

转载:https://blog.csdn.net/lfdfhl/article/details/102230108
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场