jsp:bean与el表达式笔记

来源:互联网 发布:虫虫群发软件 编辑:程序博客网 时间:2024/06/09 13:49

使用jsp


  • Scriptlet: <% %>
  • 指令: <%@ %>
  • 表达式: <%= %>
  • jsp声明: <%! %>

指令会用来向容器提供特殊的指示,容器会把所有Script代码和表达式代码都放在服务方法中,所以scriptlet中声明的变量总是局部变量。另外,表达式事实上会成为out.println()的参数,所以不能以逗号结尾。

pageContext隐式对象含有指向其他三个域对象的引用,所以对于pageContext.findAttribute方法,会现在pageContext域中寻找相应的域属性,如果没有找到,会按照request->session->application的顺序依次查找。

jsp与javaBean

在jsp里面如果要建立多态的bean引用,那么就需要为<jsp:useBean>增加一个type属性代表引用类型,class里面则放置子类对象的名字,例如: “` “`

对于type和class的使用有以下原则:

  • 如果仅使用了type,但没有class,bean必须已经存在。
  • 如果使用了class(不管有没有type),class不能是抽象类,而且必须有一个无参公共构造器。
因为这里没有告诉容器我们需要建立哪一个类的实例,仅仅给了引用类型。

在静态页面通过表单直接转向jsp后,需要使用request.getParameter(String str)来获取得到的表单值,这样就会不可避免地引入Java代码。为了解决这个问题,<jsp:useBean>中的一个属性param起到了关键性的作用。利用param属性,可以把bean的性质值设置为一个请求参数的值,只需要指定请求参数。例如:

        <jsp:useBean id="person" type="Person" class="Employee">            <%-- 这里代表name属性的值等于表单中useName填入的值 --%>            <jsp:setProperty name="person" property="name" param="userName" />        </jsp:useBean>

为了更加简洁明了,如果不指定value或者param,就是默认要从匹配的请求参数中得到相应的bean属性值。另外,如果想让所有的请求参数名都和bean的性质名相匹配,可以将property的参数值设置为”*”,如下面所示:

        <jsp:useBean id="person" type="Person" class="Employee">            <%-- 这里代表name属性的值等于表单中useName填入的值 --%>            <jsp:setProperty name="person" property="*" />        </jsp:useBean>

另外,针对String和基本类型,Bean标记会自动完成类型强制转换,但是如果使用脚本的话,就不会转换。

接下来,如果一个bean的属性不是基本类型或者String该怎么办呢?又或者我们想要得到bean的属性的属性(例如person有一个属性dog,dog有一个属性name)。这样就需要EL表达式来拯救世界了——${person.dog.name}。

EL表达式

${left.right}

表达式的第一个命名变量可以是一个EL隐式对象,也可以是一个属性。除了pageContext的隐式对象都是映射,而pageContext是一个JavaBean。所以点号左边要么是一个Map(有键),要么是一个bean(有性质)。点号右边必须符合java标识符的命名规则。

使用[]操作符

只有当右边是左边变量的一个bean性质或者隐射键,才能使用点号。但如果左边是一个数组,List或者右边变量不遵循java命名规则时,就必须使用[]了。在[A]里面,如果没有引号,那么容器回去找A对应的属性。

EL隐式对象

EL会显示原始文本,包括HTML。但是HTML标签在浏览器中会作为HTML标记呈现,而不是纯文本显示。如果想要发出< ;以便用户可以在浏览器中看到<字符的话,则需要另外的技术了。

  • pageScope, requestScope, sessionScope, applicationScope 作用域属性的Map(只是属性的一个map,而不是请求对象本身)
  • param, paramValues 请求参数的Map
  • head, headValues 请求首部的Map
  • cookie
  • initParam 上下文初始化参数
  • pageContext 真正的引用

    作用:
  1. 避免命名冲突
  2. 和[]操作符一起使用来应对不友好的属性命名,如将属性名设置为”foo.person”,那么使用${foo.person.name}是得不到name性质的值的,因为会在域里面找foo这个属性,要解决这个问题,需要使用域隐式对象和[]操作符,例如下面的例子:

    ${requestScope["foo.person"].name}

EL函数

当需要从一个Java方法获取数据时,利用EL表达式来调用一个普通类的静态方法是很容易做到这一点的。${prefix:name()}

要想实现一个EL函数,可以分为以下四步:

  1. 编写有一个公共静态方法的Java类
  2. 编写一个标记库描述文件(TLD)
  3. 在JSP中放一个taglib指令
  4. 使用EL调用函数

    <?xml version="1.0" encoding="UTF-8"?>    <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     http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"    version="2.0">    <description>A testing tag library.</description>    <tlib-version>1.0</tlib-version>    <short-name>SimpleTagLibrary</short-name>    <uri>DiceFunctions</uri>    <function>        <name>rollDice</name>        <function-class>foo.DiceRoller</function-class>        <function-signature>            int rollDice()        </function-signature>    </function></taglib>

在TLD里面要为每一个参数指定完全限定类名(除非是一个基本类型)。例如,如果函数取一个Map参数,则应当是:

    <function-signature>        int rollDice(java.util.Map)    </function-signature>

EL可以妥善地处理null值,即使找不到表达式中指定名的属性/性质/键,也会显示页面。算术表达式里面将null看做0,在逻辑表达式里面将null看做是false。

0 0
原创粉丝点击