JavaBean与Expression Language

来源:互联网 发布:英雄联盟网吧特权软件 编辑:程序博客网 时间:2024/05/22 12:26

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
原创粉丝点击