使用表达式语言(EL)可以在JSP脚本中避免Java代码,有助于实现前端人员和后端人员的分工明确。
本章内容
- EL中的变量
- EL中的操作符
- EL中的函数
- 标准动作
在JSP中,脚本代码包括:声明、scriptlet和表达式。与bean有关的标准动作如下:
- jsp:useBean声明和初始化一个bean属性
<jsp:useBean id="beanID" class="foo.BeanID" scope="request" />
jspuseBean找不到对应的属性对象时,它会自己创建一个属性对象
- jsp:getProperty,得到bean的属性值
<jsp:getProperty name="beanID" property="name" />
- jsp:setProperty设置属性对象的性质值。
<jsp:setProperty name="beanID" property="name" value="chris" />
为了避免jsp:setProperty标准动作在属性有值的情况下覆盖,可以使用有体的jsp:useBean
<jsp:useBean id="beanID" class="foo.BeanID" scope="page" >
<jsp:setProperty name="beanID" property="name" value="chris" />
</jsp:useBean>
此时只有在新建一个bean时,jsp:setProperty才会执行。
小知识:bean法则
- 必须由一个无参数的公共构造器
- 必须按命名约定来命名公共的获取方法和设置方法
- 设置方法的参数类型和获取方法的返回类型必须一致
- 性质名和类型是由获取方法和设置方法得出。
- 结合JSP使用时,性质类型必须是String,或者是一个基本类型。
type属性能实现bean的多态引用:
<jsp:useBean id="beanID" type="foo.Person" class="foo.Teacher" scope="page" />
这里Person是一个抽象类,Teacher是一个具体的类,对应的servlet代码为:
foo.Person beanID = null;
//得到beanID属性的代码
if(beanID = null){
beanID = new foo.Teacher();
}
type可以是class类型、抽象类型或者是一个接口,class必须是type的子类或者具体实现。
如果使用了type,但是没有class,则bean必须存在
如果使用了class(有或者没有type),class不能是抽象类,而且必须有一个无参数的公共构造器
scope的值默认为page。
param参数可以把bean的性质值设置为一个请求参数的值,只需要指定请求参数,当请求的参数名和bean的性质名匹配时,甚至可以不用为该性质指定值。
表达式语言
表达式语言都会置于一个${}中。
表达式中的第一个命名变量可以是一个隐式对象,也可以是一个属性。EL中的隐式对象如下:
- pageScope
- requestScope
- sessionScope
- applicationScope
- param
- paramValues
- header
- headerValues
- cookie
- initParam
- pageContext
属性包括:
- 页面作用域属性
- 请求作用域属性
- 会话作用域属性
- 应用作用域属性
EL中使用(.)操作符访问性质和映射值,其中第一个变量可以是一个隐式对象,也可以是一个属性,点号右边可以是一个映射键(如果第一个变量是映射),也可以是一个bean性质(如果第一个变量是JavaBean属性)
${map.key}
${beanID.name}
[]操作符的功能比”.”更强大,这里不再说明。
可以编写EL表达式,由它调用普通java类的静态方法。
- 编写有一个公共静态方法的java类
- 编写一个标记库描述文件(TLD).TLD提供了定义函数的java类与调用函数的JSP之间的一个映射。
- 在JSP中放一个taglib指令。taglib指令告诉容器,“我想使用这个TLD,另外,在JSP中,使用这个TLD的一个函数时,我想用这个名字作为前缀。。。。。”,也就是定义命名空间
- 使用EL调用函数。
include指令
include指令告诉容器:复制所有包含文件中的所有内容,再把他粘贴到这个文件中的对应位置。