440 likes | 605 Views
第十三讲. 课 题 EL 表达式 目的要求 掌握 EL 表达式在 JSP 页面中的灵活运用 教学重点 EL 表达式的基本语法及其应用 教学难点 EL 隐含对象 教学课时 4 (含 2 课时上机) 教学方法 讲解、示例与启发式教学相结合 教学内容和步骤. 13.1 EL 简介 ( 1 )语法结构 ${expression} ( 2 ) [] 与 . 运算符 EL 提供 . 和 [] 两种运算符来存取数据。
E N D
课 题 EL表达式 目的要求 掌握EL表达式在JSP页面中的灵活运用 教学重点 EL表达式的基本语法及其应用 教学难点 EL隐含对象 教学课时 4(含2课时上机) 教学方法 讲解、示例与启发式教学相结合 教学内容和步骤
13.1 EL简介 • (1)语法结构 • ${expression} • (2)[]与.运算符 • EL 提供.和[]两种运算符来存取数据。 • 当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。例如: ${user.My-Name}应当改为${user["My-Name"] } • 如果要动态取值时,就可以用[]来做,而.无法做到动态取值。例如: • ${sessionScope.user[data]}中data 是一个变量
⑶ 变量 EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量, 因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找, 假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。
⑷ 属性范围在EL中的名称Page PageScope Request RequestScope Session SessionScope Application ApplicationScope
13.2 EL隐含对象 ⑴ 与范围有关的隐含对象 与范围有关的EL 隐含对象包含以下四个:pageScope、requestScope、sessionScope 和applicationScope;它们基本上就和JSP的pageContext、request、session和application一样;在EL中,这四个隐含对象只能用来取得范围属性值,即getAttribute(String name),却不能取得其他相关信息。例如:我们要取得session中储存一个属性username的值,可以利用下列方法:
session.getAttribute("username") 取得username的值, 在EL中则使用下列方法 ${sessionScope.username} ⑵ 与输入有关的隐含对象 与输入有关的隐含对象有两个:param和paramValues,它们是EL中比较特别的隐含对象。例如我们要取得用户的请求参数时,可以利用下列方法: request.getParameter(String name) request.getParameterValues(String name) 在EL中则可以使用param和paramValues两者来取得数据。
${param.name} ${paramValues.name} ⑶ 其他隐含对象 ① cookie JSTL并没有提供设定cookie的动作,例:要取得cookie中有一个设定名称为userCountry的值,可以使用${cookie.userCountry}来取得它。 ② header和headerValues header 储存用户浏览器和服务端用来沟通的数据。
例1:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。例1:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。 另外在鲜少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得这些值。 ③ initParam initParam取得设定web站点的环境参数(Context)
例2:一般的方法String userid = (String)application.getInitParameter("userid"); 可以使用 ${initParam.userid}来取得名称为userid ④ pageContext pageContext取得其他有关用户要求或页面的详细信息。 ${pageContext.request.queryString} 取得请求的参数字符串 ${pageContext.request.requestURL} 取得请求的URL,但不包括请求之参数字符串 ${pageContext.request.contextPath} 服务的web application 的名称 ${pageContext.request.method} 取得HTTP 的方法(GET、POST)
${pageContext.request.protocol} 取得使用的协议(HTTP/1.1、HTTP/1.0) ${pageContext.request.remoteUser} 取得用户名称 ${pageContext.request.remoteAddr } 取得用户的IP 地址 ${pageContext.session.new} 判断session 是否为新的 ${pageContext.session.id} 取得session 的ID ${pageContext.servletContext.serverInfo} 取得主机端的服务信息
13.3 EL运算符 ⑴ 算术运算符有五个:+、-、*或$、/或div、%或mod ⑵ 关系运算符有六个:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge ⑶ 逻辑运算符有三个:&&或and、||或or、!或not ⑷ 其它运算符有三个:Empty运算符、条件运算符、()运算符 例3:${empty param.name}、${A?B:C}、${A*(B+C)}
13.4 EL函数(functions) 语法:ns:function( arg1, arg2, arg3 …. argN) 其中ns为前置名称(prefix),它必须和taglib 指令的前置名称一置 ⑴ EL表达式用${}表示,可用在所有的HTML和JSP标签中 作用是代替JSP页面中复杂的JAVA代码。
⑵ EL表达式可操作常量 变量 和隐式对象. 最常用的 隐式对象有${param}和${paramValues}。 ${param}表示返回请求参数中单个字符串的值。 ${paramValues}表示返回请求参数的一组值.pageScope表示页面范围的变量.requestScope表示请求对象的变量。 sessionScope表示会话范围内的变量.applicationScope表示应用范围的变量。
⑶ <%@ page isELIgnored="true"%> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。 ⑷ EL语言可显示 逻辑表达式如${true and false}结果是false , 关系表达式如${5>6} 结果是false,算术表达式如 ${5+5} 结果是10。 ⑸ EL中的变量搜索范围是:page, request ,session, application。点运算符(.)和"[ ]"都是表示获取变量的值.区别是[ ]可以显示非词类的变量。
13.5 Core标签库 ⑴ 通用标签 ①<c:out>:标签用于在JSP中显示数据,它有如下属性 属 性 描 述 是否必须 缺省值 value 输出的信息,可以是EL表达式或常量 是 无 default value为空时显示信息 否 无 escapeXml 为true则避开特殊的xml字符集, 否则为true 。
例4: 您的用户名是: <c:out value=”” default=”guest”/> 显示用户的用户名,如为空则显示guest <c:out value=""/> 指定从session中获取username的值显示; <c:out value="" /> 显示username的值,默认是从request(page)中取,如果request中没有名为username的对象则从session中取,session中没有则从application(servletContext)中取,如果没有取到任何值则不显示。
②<c:set>:标签用于保存数据,它有如下属性 属 性 描 述 是否必须 缺省值 value 要 保存的信息,可以是EL表达式或常量 否 target 需要修改属性的变量名,一般为javabean的实例 否 无 property 需要修改的javabean属性 否 无 var 需要保存信息的变量 否 无 scope 保存信息的变量的范围 否 page 。 如果指定了target属性, 那么property属性也必须指定。
例5: <c:set value="" var="test2" scope=”session” /> 将test.testinfo的值保存到session的test2中,其中test是一个javabean的实例,testinfo是test对象的属性。<c:set target="" property="city" value=""/> 将对象cust.address的city属性值保存到变量city中。
③ <c:remove> <c:remove>标签用于删除数据,它有如下属性 属 性 描 述 是否必须 缺省值 var 要删除的变量 是 无 scope 被删除变量的范围 否 所有范围,包括page、request、session、application等。 ⑵ 流控制标签 ①<c:if>:标签有如下属性 属 性 描 述 是否必须 缺省值 test 需要评价的条件,相当于if (...){}语句中的条件 是 无 var 要求保存条件结果的变量名 否 无 scope 保存条件结果的变量范围 否 page 。
②<c:choose>:这个标签不接受任何属性。 ③<c:when>: ④<c:otherwise>:这个标签同样不接受任何属性。 例5: <c:if test=""> user.wealthy is true. </c:if> 如果user.wealthy值true,则显示user.wealthy is true. <c:choose> <c:when test=""> user.generousis true. </c:when>
<c:when test=""> user.stingy is true. </c:when> <c:otherwise> user.generous and user.stingy are false. </c:otherwise> </c:choose>
只有当条件user.generous返回值是true时,才显示user.generousis true,只有当条件user.stingy返回值是true时,才显示user.stingyis true。其它所有的情况(即user.generous和user.stingy的值都不为true)全部显示user.generous and user.stingy are false。由于JSTL没有形如if (){…} else {…}的条件语句,所以这种形式的语句只能用<c:choose>、<c:when>和<c:otherwise>标签共同来完成了。
⑶ 循环控制标签 ① <c:forEach>:标签用于通用数据,它有以下属性 属 性 描 述 是否必须 缺省值 items 进行循环的项目 否 无 begin 开始条件 否 0 end 结束条件 否 集合中的最后一个项目 step 步长 否 1 var 代表当前项目的变量名 否 无 varStatus 显示循环状态的变量 否 无 。
例6: <c:forEach items="" var="vector"> <c:out value=""/> </c:forEach> 相当于java语句 for (int i=0;i<vectors.size();i++) { out.println(vectors.get(i)); } 在这里vectors是一个java.util.Vector对象,里面存放的是String数据,vector是当前循环条件下String对象。实际上这里的vectors可以是任何实现了java.util. Collection接口的对象。
例7:<c:forEach begin="0" end="100" var="i" step="1"> count=<c:out value=""/><br> </c:forEach> 输出: count=0….. count=100
② <c:forTokens>:标签有以下属性 属 性 描 述 是否必须 缺省值 items 进行循环的项目 是 无 delims 分割符 是 无 begin 开始条件 否 0 end 结束条件 否 集合中的最后一个项目 step 步长 否 1 var 代表当前项目的变量名 否 无 varStatus 显示循环状态的变量 否 无 。 例8: <c:forTokens items="a:b:c:d" delims=":" var="token"> <c:out value=""/> </c:forTokens>
这个标签的使用相当于java.util.StringTokenizer类。在这里将字符串a:b:c:d以:分开循环四次,token是循环到当前分割到的字符串。这个标签的使用相当于java.util.StringTokenizer类。在这里将字符串a:b:c:d以:分开循环四次,token是循环到当前分割到的字符串。 ⑷ 导入文件和URL JSTL核心标签库支持使用<c:import>来包含文件,使用<c:url>来打印和格式化URL,使用<c:redirect>来重定向URL。
① <c:import>:标签包含另外一个页面代码到当前页,它有以下属性 属 性 描 述 是否必须 缺省值 url 需要导入页面的url 是 无 context /后跟本地web应用程序的名字 否 当前应用程序 charEncoding 用于导入数据的字符集 否 ISO-8859-1 var 接受导入文本的变量名 否 page scope 接受导入文本的变量的变量范围 否 1 varReader 用于接受导入文本的java.io.Reader变量名 否 无 varStatus 显示循环状态的变量 否 无。
② <c:url>:标签输出一个url地址,它有以下属性 属 性 描 述 是否必须 缺省值 url url地址 是 无 context /后跟本地web应用程序的名字 否 当前应用程序 charEncoding 用于导入数据的字符集 否 ISO-8859-1 var 接受处理过的url变量名,该变量存储url 否 输出到页 scope 存储url的变量名的变量范围 否 page。
③ <c:redirect>标签将请求重新定向到另外一个页面,它有以下属性 属 性 描 述 是否必须 缺省值 url url地址 是 无 context /后跟本地web应用程序的名字 否 当前应用程序。 ④ <c:param>:标签用来传递参数给一个重定向或包含页面,它有以下属性 属 性 描 述 是否必须 缺省值 name 在request参数中设置的变量名 是 无 value 在request参数中设置的变量值 否 无 。
⑸ JSTL的优点 ① 在应用程序服务器之间提供了一致的接口,最大程序地提高了WEB应用在各应用服务器之间的移植。 ② 简化了JSP和WEB应用程序的开发。 ③ 以一种统一的方式减少了JSP中的scriptlet代码数量,可以达到没有任何scriptlet代码的程序。在我们公司的项目中是不允许有任何的scriptlet代码出现在JSP中。 ④ 允许JSP设计工具与WEB应用程序开发的进一步集成。相信不久就会有支持JSTL的IDE开发工具出现。
13.6在JSP2.0中使用EL表达式语言 EL(表达式语言)是一种数据访问语言,可以方便地访问和处理应用程序数据,而无需使用scriptlet或者请求时(request-time)表达式的值。(不需要使用< % 和%>来获得数据,EL使JSP页面编写人员摆脱了java语言,使用户即使不懂JAVA也可以轻松编写JSP程序,有了JSP2.0,就可以使用EL扩展表达式了。对于一个单个JSP页面,你可以使用定义page指令来设置jsp页面是否支持EL。默认是支持EL(如果要页面不支持EL,请设置为isELIgnored =true)。
例9: JSP2.0中定义和使用函数(通过EL表达式) 表达式语言允许你定义可在表达式中调用的函数。函数必须作为public类中的public static方法编写。同时要将文件映射到TLD标志库文件中。为了说明函数的使用,我们举一个简单的例子,把两个数相加。首先要编写求两数之和的Java方法代码,如代码示例所示,这里定义了一个静态方法,它接收两个字符串参数,把它们解析成整数并返回它们的和。 示例文件:Compute.java
用javac把这段代码编译成功后,下一步就要把函数的签名映射到标签库。用javac把这段代码编译成功后,下一步就要把函数的签名映射到标签库。 将方法映射到TLD表中 配置标记库描述文件 函数描述符
现在我们就可以编写一个JSP页面来使用这个函数。代码示例5是包含两个字段的一个表单,用户输入两个数字并按下“求和”按钮,就会调用上面的函数并把两个数相加,结果在同一个页面中显示出来。现在我们就可以编写一个JSP页面来使用这个函数。代码示例5是包含两个字段的一个表单,用户输入两个数字并按下“求和”按钮,就会调用上面的函数并把两个数相加,结果在同一个页面中显示出来。 在JSP页面中调用要引用的Taglib标记,然后就可以在jsp页面中访问了。 代码示例:math.jsp
作 业 ①:EL表达式的的基本语法是什么?如何让JSP页面忽略EL表达式? ②:如何在JSP文件中引用自定义标签?试自举例加以说明。 教学总结:
上机实验十三:EL表达式及其使用(2课时) 一、实验目的及要求 1.掌握EL表达式的基本语法 2.掌握JSTL的核心标签的使用 3.掌握EL表达式在JSP中的应用 二、实验环境 Myeclipse、Tomcat、JDK
三、实验内容 1. 假如 <% int num=6; Request.setAttribute(“no”,num); %> 则下面EL表达式输出什么结果,请上机验证 ⑴ ${no<7} ⑵ ${9-no} ⑶ ${no div 0} ⑷ ${empty no} ⑸ ${‘7’>no} ⑹ ${no==”6”} 2.编写自定义的标签,并调用该标签显示当前的系统日期及系统时间。 3.编写用户登录程序,应用JSTL和EL表达式获取用户并验证用户名是否为空,如果不为空则显示登录成功,否则将页面重定向到用户登录首页。
四、实验步骤 略 五、实验思考 1.EL表达式必须在什么样的软件环境下才能执行? 2.如何用EL表达式获取JavaBean中属性值,试自编相关程序进行验证。