JavaBean与Expression Language

JSP页面中不应该有JAVA代码以便于前端设计人员维护,而JSP的功能由于Attribute有着紧密的关系,因此用JavaBean和Expression和其他tag来代替JAVA代码。

一、JavaBean

JavaBean相当于Attribute,与JavaBean相关的JSP Standard Action有3个:<jsp:useBean><jsp:setProperty><jsp:getProperty>

<jsp:useBean id = "person" class = "className" type = "ReferenceName" scope  = "request/session/application/page">

id相当于attribute的名字,class为attribute的类型,type相当于指向attribute的reference,它可以是class的superclass或者superInterface或者与class相同,scope的用法与attribute的相同。默认scope为page。

<jsp:setProperty name = "person" property = "xxx" value = >

设置javaBean的property,name为想要设置的javabean的id,property为想要设置的property,需注意Container根据javabean class中的getter和setter方法来确定<jsp:setProperty><jsp:getProperty>中的property是否存在,如果class中有对应名字的instance variable但是没有符合规范的setter和getter则不能找到,只要setter和getter的名字符合规范即可,变量本身的名字并没求影响。 把value的值赋给property,一般要求value为原始数据类型或者String,使用其他类型也可以但是后续可能无法用JSP Standard Action对这个property进行适当操作。

<jsp:setProperty name = "" property = "" param="">
<jsp:setProperty name = "" property = "" >
<jsp:setProperty name = "" property = "*">

不使用value设置,而是用param设置,param相当于HttpRequest.getParameter(),若property的名字与request中parameter的名字相同,则可以省去param,自动赋值,若javabean中所有的property的名字均与request中parameter的名字相同,则可以用*指定property,自动将所有的property与parameter一一对应。property可以为其他类型或者原始数据类型和String,当其为原式数据类型和String时,会自动进行原式数据类型和String之间的相互转换。

<jsp:getProperty name = "" property = "">
     遵守的规则与set相同。
创造JavaBean:

当使用<jsp:userBean>而相应scope中没有id对应的attribute时,会创建新的JavaBean,与setAttribute相似。形式如下,只有当JavaBean不存在时body内的语句才会执行。

<jsp:useBean id = "" class = "" type = "" scope = "">
     <jsp:setProperty name = "id" property = "" value/param = >
</jsp:useBean>

在useBean中单独使用type不加class:当javabean存在时,正常工作;当javaBean不存在时,抛出异常。因此必须在javabean已经存在时才可以单独使用type.

JavaBean的4条规则:

class不能是抽象类或者interface

class必须有无参构造体

class必须有符合规范的getter和setter

property的名字根据getter和setter得出,与变量名无关。

二、Expression Language

当property是除原始数据类型和String之外的类型时,JSP Standard Action难以处理,需用到EL。例如:

${person.dog.name}

dog为attribute person的property,而name又是dog的property。EL可以做到property of property,而JSP Standard Action只能做到property of attribute。

${firstThing.secondThing}

第一项是attribute或者implicit Object. attribute可以是任意scope中的,implicit Object如下:pageScope、requestScope、sessionScope、applicationScope、param、paramValues、header、headerValues、cookie、initParam、pageContext,其中除pageContext外其他都是Map数据类型,pageContext是一个JavaBean。

点符号.:当左端为Map类型时,右端应为Map key,当左端是JavaBean(符合javabean规范的attribute)时,右端应是property。点符号右端的内容必须符合java变量命名规则,即:_、$或字母开头,不能使用java关键字。

[]符号:以下两个表达式效果相同。使用[]可以访问List和Array,当[]内为String时,将其作为Map value或者JavaBean property name,或者List和Array的index。当[]中的String用作index时,自动将其转换为int。

${person.name}
${person["name"]}
当[]中的内容不是String时,首先寻找有无同名的implicit Object若有则使用其,若没有,则寻找同名的attribute,若有则使用其value.。[]中可以嵌套[]。

综上,点符号可以用于左端是Map和JavaBean时,而[]还可以用于左端是List和Array的情况。


EL implicit Objects:

Map数据结构:由key找到相应的value,key 为String,value可以为任意类型。

pageScope、requestScope、sessionScope、applicationScope、param、paramValues、header、headerValues、cookie、initParam、pageContext,

其中除pageContext外其他都是Map数据类型,pageContext是一个JavaBean。
pageScope、requestScope、sessionScope、applicationScope存放Attribute,name of Attributes即为key。使用它们来得到特定scope中的attribute:


${requestScope.person.name}


param、paramValues存放request parameter,若一个paramter名对应多个值(例如checkbox),则使用paramValues

Request param name is: ${param.name} <br>
Request param empID is: ${param.empID} <br>
Request param food is: ${param.food} <br>
First food request param: ${paramValues.food[0]} <br>
Second food request param: ${paramValues.food[1]} <br>


header存放request header中的各项,key即为各项的名字。headerValues的作用与paramValues类似。

Host is: ${header[“host”]}
Host is: ${header.host}

使用pageContext访问HttpServletRequest中的变量和方法。例如:

Method is: ${pageContext.request.method}


使用Cookie得到Cookie:

${Cookie.Name.value}


使用initParam得到context(application) init parameter

email is: ${ initParam.mainEmail}


EL调用JAVA CLASS中的方法:共四步:

1、写一个有public static method的java class

2、写TLD(Tag Library Descriptor)文件:即xml文件将后缀改为tld,并放在WEB-INF下

3、在JSP中写<%@ taglib @>

4、在EL中调用static方法

JAVA CLASS:

package foo;
public class DiceRoller {
public static int rollDice() {
return (int) ((Math.random() * 6) + 1);
}
}

tld:<name>项为EL调用方法时使用的名字;<function-class>为java class的完整名称<function-signature>为要调用的java class中的方法,要写明返回类型和参数。

<?xml version=”1.0” encoding=”ISO-8859-1” ?>
< taglib xmlns=”http://java.sun.com/xml/ns/j2ee”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee/web-
jsptaglibrary_2_0.xsd” version=”2.0”>
<tlib-version>1.2</tlib-version>
<uri>DiceFunctions</uri>
<function>
<name>rollIt</name>
<function-class>foo.DiceRoller</function-class>
<function-signature>
int rollDice()
</function-signature>
</function>
</taglib>

jsp:prefix相当于指定一个namespace,uri指向tld文件中想要调用的方法的相应ur.;在EL中调用方法时,必须使用prefix:函数名使用tld中的<nane>项。

<%@ taglib prefi x=”mine” uri=”DiceFunctions”%>
<html><body>
${mine:rollIt()}
</body></html>


EL运算符:算术运算+ - * /(div) %(mod) 逻辑运算:&&(and) ||(or) !(not) 关系运算:==(eq) >(gt) <(lt) >=(ge) <=(le) !=(ne)

其他EL保留标识符:true false empty instanceof null



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值