讲给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