第一部分:jsp
1、jsp的简介
1.1 sun公司用于动态网站的开发技术,servlet jsp
1.2 jsp:java server pages,运行在服务器端的页面,jsp就是servlet,
最终jsp会被编译成servlet
1.3 jsp在访问时候编译成servlet,会编译到tomcat的work目录里面
1.4 jsp组成:html+java代码+jsp自身的一些东西
1.5 jsp嵌入java代码有三种方式
(1)<%! %>:定义的变量是成员变量
(2)<%= %>:向页面输出内容,代码生成到servlet里面service方法里面
(3)<% %>:写java代码,代码生成到servlet里面service方法里面
2、jsp的注释
2.1 html的注释
(1)写法
2.2 java的注释
(1)有三种注释
(2)单行注释 //
多行注释 /* *.
文档注释 /** */
(3)把java注释写到java代码
2.3 jsp自身的注释
(1)<%-- --%>
2.4 代码
<%
// 单行注释
/* 多行注释 */
/**
文档注释
*/
%>
<%-- jsp自身的注释 --%>
2.5 jsp里面三种注释的作用范围
(1)jsp自身的注释存在jsp源代码阶段
(2)jsp编译成servlet之后,html的注释和java的注释存在
(3)通过浏览器看到(查看源文件)的内容,只有html的注释
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
My JSP 'jsp01.jsp' starting page
<%
// 单行注释
/* 多行注释 */
/**
文档注释
*/
%>
<%-- jsp自身的注释 --%>
3、jsp的指令
3.1 有三个指令 (page ; include ; taglib)
(1)写法: <%@ 指令名称 属性="属性值"%>
3.2 page指令
(1)设置jsp页面的一些信息
(2)写法: <%@ page 属性="属性值"%>
(3)属性
= language:jsp支持语言类型,目前支持是java语言
= extends:jsp会编译成servlet,继承的类,默认继承的是HttpJspBase
= session:在jsp中是否可以直接使用session对象,默认值true
== 代码
<%
//向session域设置值
//request.getSession().setAttribute("msg", "sessionValue");
session.setAttribute("msg", "sessionItcast");
%>
${msg }
= import:在jsp中导入包
== 可以分开写,也可以写在一起 <%@ page import="java.util.List,java.util.ArrayList"%>
<%@ page import="java.util.List,java.util.ArrayList"%>
<%@ page language="java" pageEncoding="utf-8"
session="true" errorPage="error.jsp" isELIgnored="true"%>
My JSP 'page01.jsp' starting page
<%
//向session域设置值
//request.getSession().setAttribute("msg", "sessionValue");
session.setAttribute("msg", "sessionItcast");
%>
${msg }
<%
List list = new ArrayList();
%>
<%
//出现异常
// int m = 10/0;
%>
= buffer:设置jsp对客户端输出的缓冲区的大小 8kb
= autoFlush:如果内容超出缓冲区是否会正确输出 默认值是true
= errorPage:如果jsp页面出现异常,设置跳转到错误页面
= isErrorPage:在错误页面中是否显示错误信息
java.lang.Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
== 使用exception对象 <%=exception.getMessage() %>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" isErrorPage="true"%>
My JSP 'error.jsp' starting page
执行了非法操作!
<%=exception.getMessage() %>
= contentType:设置打开的浏览器的编码
= pageEncoding:jsp编译成servlet,使用编码方式的设置,优先权大于contentType
= isELIgnored:是否忽略el表达式,默认不忽略false;如果设置成true之后,把el表达式作为普通文本
重点掌握的属性:session、import、errorPage、contentType、pageEncoding
3.3 include指令
(1)在一个页面中包含其他页面内容
(2)写法: <%@ include 属性="属性值"%>
(3)规范:
第一:在被包含的页面中,直接写内容
第二:被包含的页面不能使用变量传递
第三:包含的页面路径后面不能加参数
(4)include包含也称为静态包含
多个jsp页面,最终会编译成几个servlet?
多个jsp页面,最终编译成一个servlet,合并输出
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
My JSP 'body.jsp' starting page
<%@ include file="head.jsp" %>
body..............
<%@ include file="foot.jsp" %>
foot.............
head..................
3.4 taglib指令
(1)经常和jstl标签库一起使用,替代页面中的<%%>
(2)写法:<%@ taglib uri="jstl标签库的路径" prefix="jstl标签库的别名"%>
jsp中有几个指令?
三个指令分别是什么?
三个指令分别可以做什么?
4、jsp的内置对象
4.1 在jsp中有9个内置对象,在jsp不需要创建,可以使用的对象
request:相当于servlet里面的HttpServletRequest,获取请求的信息,是一个域对象可以存值和取值
response:相当于servlet里面HttpServletResponse,向页面输出内容,把cookie回写到浏览器
session:相当于servlet里面HttpSession,是一个域对象,存值和取值
config:相当于servlet里面ServletConfig,获取servlet名称,获取初始化参数
application:相当于servlet里面ServletContext,是一个域对象存值和取值,获取web项目中文件
exception:相当于Servlet对应属性Throwable,page指令属性isErrorPage,把这个属性值设置成true之后,才可以使用这个对象
java.lang.Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
page:当前对象Object
out:输出的对象JspWriter
out和response.getWriter()使用的是不是一个对象
= out使用的是JspWriter
= response.getWriter()使用的是PrintWriter
= 现在分别使用out输出和response.getWriter()输出
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
My JSP 'out.jsp' starting page
<%="AAAA"%>
<%
response.getWriter().write("BBBB");
%>
<%="CCCC"%>
<%="DDDD"%>
= out的输出机制:
== 会产生两个缓冲区,out缓冲区和response缓冲区
== out输出会把内容放到out缓冲区,response输出会把内容放到response缓冲区
== out缓冲区不能直接向页面输出,把内容先放到response缓冲区里面,通过response缓冲区才能向页面输出
pageContext:
(1)是一个域对象
= pageContext范围是当前页面,不能在servlet里面,只能使用在jsp中
= 向pageContext域里面设置值:setAttribute(java.lang.String name, java.lang.Object value)
= 从pageContext域里面获取值:getAttribute(java.lang.String name)
= 代码
<%
//设置值
pageContext.setAttribute("page", "pageValue");
%>
<%=pageContext.getAttribute("page") %>
= 范围比较
application > session > request > pageContext
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
My JSP 'pageContext01.jsp' starting page
<%
//设置值
pageContext.setAttribute("page", "pageValue");
%>
<%=pageContext.getAttribute("page") %>
${page }
(2)向其他的域对象里面设置值
= 使用传统方式向四个域对象设置值
<%
//向application里面设置值(servletContext)
application.setAttribute("app", "appvalue");
//向session里面设置值
session.setAttribute("session", "sessionvalue");
//向request里面设置值
request.setAttribute("request", "requestvalue");
//向pageContext里面设置值
pageContext.setAttribute("page", "pagevalue");
%>
<%=application.getAttribute("app") %>
<%=session.getAttribute("session") %>
<%=request.getAttribute("request") %>
<%=pageContext.getAttribute("page") %>
= 使用pageContext内置对象向application、session、request域里面设置
== 使用setAttribute(java.lang.String name, java.lang.Object value, int scope)
== 有三个参数:第一个参数是名称;第二个参数设置的值;第三个参数哪个域(PageContext里面的常量表示不同的域)
== 代码
<%
//向application
pageContext.setAttribute("app100", "app100value", PageContext.APPLICATION_SCOPE);
//向session
pageContext.setAttribute("session100", "session100value", PageContext.SESSION_SCOPE);
//向request
pageContext.setAttribute("request100", "request100value", PageContext.REQUEST_SCOPE);
//向pageContext
pageContext.setAttribute("page100", "page100value", PageContext.PAGE_SCOPE);
%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
My JSP 'pageContext02.jsp' starting page
<%
//向application里面设置值(servletContext)
application.setAttribute("app", "appvalue");
//向session里面设置值
session.setAttribute("session", "sessionvalue");
//向request里面设置值
request.setAttribute("request", "requestvalue");
//向pageContext里面设置值
pageContext.setAttribute("page", "pagevalue");
%>
<%=application.getAttribute("app") %>
<%=session.getAttribute("session") %>
<%=request.getAttribute("request") %>
<%=pageContext.getAttribute("page") %>
<%
//向application
pageContext.setAttribute("app100", "app100value", PageContext.APPLICATION_SCOPE);
//向session
pageContext.setAttribute("session100", "session100value", PageContext.SESSION_SCOPE);
//向request
pageContext.setAttribute("request100", "request100value", PageContext.REQUEST_SCOPE);
//向pageContext
pageContext.setAttribute("page100", "page100value", PageContext.PAGE_SCOPE);
%>
<%=application.getAttribute("app100") %>
<%=session.getAttribute("session100") %>
<%=request.getAttribute("request100") %>
<%=pageContext.getAttribute("page100") %>
(3)从其他的域对象里面获取值
= 获取四个域对象里面的值:getAttribute(java.lang.String name, int scope)
== 两个参数:第一个参数域名称;第二个参数是哪个域(PageContext里面的常量表示不同的域)
= 代码
<%=pageContext.getAttribute("app", PageContext.APPLICATION_SCOPE) %>
<%=pageContext.getAttribute("session", PageContext.SESSION_SCOPE) %>
<%=pageContext.getAttribute("request", PageContext.REQUEST_SCOPE) %>
<%=pageContext.getAttribute("page",PageContext.PAGE_SCOPE) %>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
My JSP 'pageContext02.jsp' starting page
<%
//向application里面设置值(servletContext)
application.setAttribute("app", "appvalue");
//向session里面设置值
session.setAttribute("session", "sessionvalue");
//向request里面设置值
request.setAttribute("request", "requestvalue");
//向pageContext里面设置值
pageContext.setAttribute("page", "pagevalue");
%>
<%=pageContext.getAttribute("app", PageContext.APPLICATION_SCOPE) %>
<%=pageContext.getAttribute("session", PageContext.SESSION_SCOPE) %>
<%=pageContext.getAttribute("request", PageContext.REQUEST_SCOPE) %>
<%=pageContext.getAttribute("page",PageContext.PAGE_SCOPE) %>
<%
//获取request内置对象
pageContext.getRequest();
//获取response内置对象
pageContext.getResponse();
//获取session内置对象
pageContext.getSession();
%>
(4)获取到其他的八个内置对象
= 代码
<%
//获取request内置对象
pageContext.getRequest();
//获取response内置对象
pageContext.getResponse();
//获取session内置对象
pageContext.getSession();
.......
%>
(5)findAttribute(java.lang.String name)方法的使用
= 分别向四个域对象里面设置值,名称相同
= 获取到域范围最小的里面的值
== <%=pageContext.findAttribute("itcast") %>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
My JSP 'pageContext02.jsp' starting page
<%
//向application里面设置值(servletContext)
application.setAttribute("itcast", "appvalue");
//向session里面设置值
session.setAttribute("itcast", "sessionvalue");
//向request里面设置值
//request.setAttribute("itcast", "requestvalue");
//向pageContext里面设置值
//pageContext.setAttribute("itcast", "pagevalue");
%>
${itcast }
<%=pageContext.findAttribute("itcast") %>
4.2 四个域对象
= 范围比较
application > session > request > pageContext
servletContext(application):范围是整个web项目
session:范围是一次会话
request:范围是一次请求
pageContext:范围是当前页面
4.3 在jsp中有几个内置对象?
jsp中九个内置对象分别是什么?
jsp中九个内置对象分别做什么?
out内置对象的输出机制?
1.有两个缓冲区:out缓冲区和response缓冲区
2.out缓冲区不能直接输出,需放到response换能够输出
pageContext内置对象的四个用途?
1.本身是域对象
2.向其他三个域存值:setArrtribute(String key, Object obj, int scope);
3.获取其他域对象的值:Object obj =
4.获取其他八个内置对象
5、jsp的动作标签(了解即可)
5.1 什么是动作标签,在jsp使用动作标签可以完成功能
5.2 写法: 在jsp中使用
5.3 常用的动作标签
(1)
=
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
My JSP 'forward.jsp' starting page
page="/forward/hello.jsp">
value="itcast100" name="id11">
(2)
=
= 有多个jsp文件,最终会编译成几个servlet?
== 多个jsp文件会编译成多个servlet
(3)
= 在带路径的动作标签里面使用
= 代码
5.4 下面的三个动作标签用于操作javabean
(4)
(5)
(6)
第二部分:javabean
1、什么是javabean
1.1 javabean就是一个java类,遵循一定书写规范
第一个规范:在javabean里面有一个公开的空参构造方法
第二个规范:在javabean里面属性是私有的
第三个规范:在javabean里面私有的属性通过公开的方法暴露出来
(1)代码
//私有的属性
private String id;
private String username;
private String password;
//公开方法暴露私有的属性
public String getId() {
return id;
}
......
1.2 javabean主要的用途是 封装数据
(1)使用set方法设置值
(2)使用get方法获取值
package cn.itcast.bean;
public class User {
//私有的属性
private String id;
private String username;
private String password;
//公开方法暴露私有的属性
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2、封装数据到javabean
2.0 创建jsp页面,在页面中写表单,提交到servlet中,在servlet进行数据封装到javabean的操作
2.1 使用传统方式进行封装
(1)实现的步骤
* 1、得到表单提交的数据 : requset.getParameter();
* 2、创建User的对象 : new User();
* 3、使用user里面的set方法进行封装
(2)代码
//获取表单提交的数据
//处理中文乱码问题
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String username = request.getParameter("username");
String password = request.getParameter("password");
//创建user对象
User user = new User();
//使用user里面的set方法进行封装
user.setId(id);
user.setUsername(username);
user.setPassword(password);
System.out.println(user.getId()+" :: "+user.getUsername()+" :: "+user.getPassword());
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.bean.User;
public class Form01Servlet extends HttpServlet {
/**
* 使用传统方式封装数据到javabean
* 1、得到表单提交的数据
* 2、创建User的对象
* 3、使用user里面的set方法进行封装
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取表单提交的数据
//处理中文乱码问题
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String username = request.getParameter("username");
String password = request.getParameter("password");
//创建user对象
User user = new User();
//使用user里面的set方法进行封装
user.setId(id);
user.setUsername(username);
user.setPassword(password);
System.out.println(user.getId()+" :: "+user.getUsername()+" :: "+user.getPassword());
}
/**
*
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
2.2 使用jsp的动作标签进行封装(一般不用)
(0)表单输入项里面的 name属性值 和 javabean里面的属性值一样
(1)使用到jsp中三个动作标签
第一个:
第二个:
第三个:
(2)代码
<%--
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
My JSP 'bean.jsp' starting page
id="user" class="cn.itcast.bean.User">
<%-- <jsp:setProperty property="id" name="user">jsp:setProperty>
<jsp:setProperty property="username" name="user">jsp:setProperty>
<jsp:setProperty property="password" name="user">jsp:setProperty> --%>
property="*" name="user">
property="id" name="user">
property="username" name="user">
property="password" name="user">
2.3 使用beanutils框架进行封装(开发常用,重点之重点)
(1)beanutils框架是apache组织开发的,用于封装数据到javabean的操作
(2)如果要想使用beanutils框架,首先导入jar包
(3)使用框架里面 BeanUtils类里面方法 populate(Object bean, Map properties)
= 要求:表单输入项的name的属性值,必须和javabean里面的属性值一样
= populate(Object bean, Map properties) 方法里面有两个参数
== 第一个参数是封装的javabean对象;
== 第二个参数是要封装数据的map集合(map结构是key-value,key是属性的名称,value是值)
=== 在request里面方法getParameterMap(),返回map集合,key是表单输入项name属性的值,value是输入值
(4)代码
//创建user对象
User user = new User();
//进行封装数据到javabean
try {
BeanUtils.populate(user, request.getParameterMap());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(user.getId()+" :: "+user.getUsername()+" :: "+user.getPassword());
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import cn.itcast.bean.User;
public class Form02Servlet extends HttpServlet {
/**
* 使用beanutils框架进行封装数据到javabean
* 1、创建javabean对象(user对象)
* 2、获取表单提交的数据,得到map集合(使用request里面getParameterMap方法)
* 3、使用beanutils里面方法
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//创建user对象
User user = new User();
//进行封装数据到javabean
try {
BeanUtils.populate(user, request.getParameterMap());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(user.getId()+" :: "+user.getUsername()+" :: "+user.getPassword());
}
/**
*
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
第三部分:el表达式
1、使用el表达式获取域对象里面的值
(1)el表达式使用在jsp页面中,不能在html中使用
(2)写法: ${域对象名称}
(3)使用el表达式获取四个域对象里面的值
= 代码
<%
//向application里面设置
application.setAttribute("itcast", "appvalue");
//向session域里面设置值
session.setAttribute("itcast", "sessionvalue");
//向request域里面设置值
request.setAttribute("itcast", "requestvalue");
//向pageContext域里面设置值
pageContext.setAttribute("itcast", "pagevalue");
%>
${applicationScope.itcast }
${sessionScope.itcast }
${requestScope.itcast }
${pageScope.itcast }
(4)如果使用el表达式获取的名称不存在,返回空字符串 "",不会出现空指针异常
如果使用传统方式getAttribute获取名称不存在,返回null,容易出现空指针异常
(5)使用el表达式获取域对象名称相同的,获取的是域范围最小的里面的值
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
My JSP 'eltest01.jsp' starting page
<%
//向application里面设置
application.setAttribute("itcast", "appvalue");
//向session域里面设置值
session.setAttribute("itcast", "sessionvalue");
//向request域里面设置值
request.setAttribute("itcast", "requestvalue");
//向pageContext域里面设置值
pageContext.setAttribute("itcast", "pagevalue");
%>
${applicationScope.itcast }
${sessionScope.itcast }
${requestScope.itcast }
${pageScope.itcast }
${aa }
<%=pageContext.getAttribute("aa") %>
2、使用el表达式获取域对象里面数组、集合(list、map)、对象属性的值
(1)使用el表达式获取域对象里面的数组的值
= 使用数组的下标得到里面的值,数组下标从0开始
= ${域对象名称[数组的下标] }
= 代码
<%
//创建数组
String[] arr = {"lucy","mary","jack"};
//把数组放到域对象里面
request.setAttribute("arr100", arr);
%>
${arr100[2] }
= 如果获取的数组的下标不存在,返回是空字符串 ""
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
My JSP 'eltest02.jsp' starting page
<%
//创建数组
String[] arr = {"lucy","mary","jack"};
//把数组放到域对象里面
request.setAttribute("arr100", arr);
%>
${arr100[2] }
(2)使用el表达式获取域对象里面list集合的值
= 使用list集合的下标获取里面的值,list下标从0开始的
= ${域对象名称[list集合的下标]}
= 代码
<%
//创建list集合
List
//向list集合里面放数据
list.add("AAAA");
list.add("BBBB");
list.add("CCCC");
//把list集合放到域对象里面
request.setAttribute("list100", list);
%>
${list100[2] }
= 如果获取list集合的下标不存在,返回是空字符串 ""
= 向域对象里面放set集合,使用el表达式不可以获取域对象里面set集合的值
== list和set的区别:list是有序的,set是无序的
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
My JSP 'eltest03.jsp' starting page
<%
//创建list集合
List<String> list = new ArrayList<String>();
//向list集合里面放数据
list.add("AAAA");
list.add("BBBB");
list.add("CCCC");
//把list集合放到域对象里面
request.setAttribute("list100", list);
%>
${list100[2] }
(3)使用el表达式获取域对象里面map集合的值
= 根据map的key名称得到对应的value值
= 写法:${域名称.key名称}
= 另外写法:${域名称["key名称"]}
= 代码
<%
//创建map集合
Map
map.put("aa", "AA");
map.put("bb", "BB");
map.put("cc", "CC");
//把map集合放到域对象里面
request.setAttribute("map100", map);
%>
${map100.aa }
= 如果key的名称不存在,返回是空字符串 ""
= 如果map集合的key的类型是int类型,使用el表达式不能获取里面的值,报错【500】
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
My JSP 'eltest04.jsp' starting page
<%
//创建map集合
Map<String,String> map = new HashMap<String,String>();
map.put("aa", "AA");
map.put("bb", "BB");
map.put("cc", "CC");
//把map集合放到域对象里面
request.setAttribute("map100", map);
%>
${map100.aa }
${map100["aa"] }
<%
//创建map集合
Map<Integer,String> m = new HashMap<Integer,String>();
m.put(1, "AA");
m.put(2, "BB");
m.put(3, "CC");
//把map集合放到域对象里面
request.setAttribute("m", map);
%>
<%-- ${m.1 } --%>
(4)使用el表达式获取域对象里面的对象的属性值
= 使用名称.对象里面的属性的名称得到值
= ${域对象名称.属性的名称}
= 代码
<%
//创建对象
User user = new User();
user.setUsername("东方不败");
user.setPassword("999");
//把user对象放到域对象里面
request.setAttribute("user100", user);
%>
${user100.username }
${user100.password }
= 如果获取的域对象里面的对象的属性名称不存在,报错
<%@page import="cn.itcast.bean.User"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
My JSP 'eltest05.jsp' starting page
<%
//创建对象
User user = new User();
user.setUsername("东方不败");
user.setPassword("999");
//把user对象放到域对象里面
request.setAttribute("user100", user);
%>
${user100.username }
${user100.password }
public class User {
// 私有的属性
private String username;
private String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
// 公开方法暴露私有的属性
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
3、el表达式的其他操作(了解即可)
3.1 运算的操作
(1)算术的运算 + - ......
(2)关系的运算 < > <= >=.....
(3)逻辑的运算 && ||....
3.2 empty运算符
(1)判断对象是否为空
= ${user == null}
= ${empty user}
= ${user != null}
= ${not empty user}
3.3 三元表达式
(1)${user != null ? user.name : ""}
= 如果user对象不为空,获取user的name值,否则返回空字符串
= ${ not empty user ? user.name : ""}
3.4 在el表达式中有11个隐含对象
(1)pageContext隐含对象:对应于jsp中pageContext内置对象,获取其他的八个内置对象