一.Http服务器调用JSP文件的原理
Http服务器将JSP文件编辑为一个Servlet接口实现类,然后将其编译为.class字节码文件,之后创建这个Servlet接口实现类的实例对象,调用其_jspService方法,将JSP文件中的内容写入到响应体。
二.EL表达式
-
命令格式:
${作用域对象别名.共享数据}
-
命令作用:
负责在JSP文件上从作用域对象中读取指定的共享数据并输出到响应体
三.EL表达式中的作用域对象别名
- JSP文件可以使用的作用域对象
(1)ServletContext application:全局作用域对象
(2)HttpSession session:会话作用域对象
(3)HttpServletRequest request:请求作用域对象
(4)PageContext pageContext:当前页作用域对象,这是JSP文件独有的作用域对象,Servlet中不存在。在当前页作用域对象中存放的共享数据仅能在当前JSP文件中使用,不能共享给其他Servlet或则其他JSP文件。在真实开发过程,pageContext主要用于JSTL标签与JSP文件之间数据共享数据。
- EL表达式提供的作用域对象别名
JSP | EL表达式 |
---|---|
application | ${applicationScope.共享数据名} |
session | ${sessionScope.共享数据名} |
request | ${requestScope.共享数据名} |
pageContext | ${pageScope.共享数据名} |
四.EL表达式将引用对象属性写入到响应体
-
命令格式: ${作用域对象别名.共享数据名.属性名}
-
命令作用: 从作用域对象中读取指定共享数据关联的引用对象的属性值。
并自动将属性值写入到响应体 -
属性名: 一定要与引用类型属性名完全一致(大小写)
-
EL表达式没有提供遍历集合方法,因此无法从作用域对象读取集合内容输出
五.EL表达式简化版
-
命令格式: ${共享数据名}
-
命令作用: 允许开发人员开发时省略作用域对象别名
-
工作原理:
通过如下的顺序依次定位
pageContext—>request—>session—>application -
存在隐患:
容易降低程序执行速度
容易导致数据定位错误 -
设计目的:
简化从pageContext读取共享数据并输出难度
六.EL表达式支持的运算表达式
-
前提:在JSP文件有时需要将读取共享数据进行一番运算之后,将运算结果写入到响应体。
-
运算表达式:
(1)数学运算
+ - * /
(2)关系运算:
> >= == < <= !=
gt ge eq lt le !=
(3)逻辑运算:
&& || !
七.EL表达式提供的内置对象
-
命令格式:
${param.请求参数名}
-
命令作用:
通过请求对象读取当前请求包中请求参数内容,并将请求参数内容写入到响应体。
-
eg:
浏览器发送请求:Http://localhost:8080/myWeb/index.jsp?userName=mike&userPwd=123
userName:${param.userName}
userPwd:${param.userPwd}
-
如果浏览器发送的请求参数是【一个请求参数关联多个值】,此时可以通过paramValues读取请求参数指定位置的值,并写入到响应体中。
-
eg:
浏览器发送请求:http://localhost:8080/myWeb/index.jsp?deptNo=10&deptNo=20&deptNo=30
第一个部门编号:${paramValues.deptNo[0]}
第二个部门编号:${paramValues.deptNo[1]}
第三个部门编号:${paramValues.deptNo[2]}
八.EL表达式常见异常:
javax.el.PropertyNotFoundException:在对象中没有找到指定属性