1 / 44

第十三讲

第十三讲. 课  题  EL 表达式 目的要求 掌握 EL 表达式在 JSP 页面中的灵活运用   教学重点   EL 表达式的基本语法及其应用 教学难点 EL 隐含对象 教学课时 4 (含 2 课时上机) 教学方法 讲解、示例与启发式教学相结合   教学内容和步骤. 13.1 EL 简介 ( 1 )语法结构 ${expression} ( 2 ) [] 与 . 运算符 EL 提供 . 和 [] 两种运算符来存取数据。

plato
Download Presentation

第十三讲

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第十三讲

  2. 课  题  EL表达式 目的要求 掌握EL表达式在JSP页面中的灵活运用   教学重点  EL表达式的基本语法及其应用 教学难点 EL隐含对象 教学课时 4(含2课时上机) 教学方法 讲解、示例与启发式教学相结合   教学内容和步骤

  3. 13.1 EL简介 • (1)语法结构 • ${expression} • (2)[]与.运算符 • EL 提供.和[]两种运算符来存取数据。 •   当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。例如:  ${user.My-Name}应当改为${user["My-Name"] } • 如果要动态取值时,就可以用[]来做,而.无法做到动态取值。例如: • ${sessionScope.user[data]}中data 是一个变量

  4. ⑶ 变量 EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量,  因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找,  假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。

  5. ⑷  属性范围在EL中的名称Page PageScope   Request RequestScope   Session SessionScope   Application ApplicationScope

  6. 13.2 EL隐含对象 ⑴ 与范围有关的隐含对象 与范围有关的EL 隐含对象包含以下四个:pageScope、requestScope、sessionScope 和applicationScope;它们基本上就和JSP的pageContext、request、session和application一样;在EL中,这四个隐含对象只能用来取得范围属性值,即getAttribute(String name),却不能取得其他相关信息。例如:我们要取得session中储存一个属性username的值,可以利用下列方法:

  7. session.getAttribute("username") 取得username的值, 在EL中则使用下列方法 ${sessionScope.username} ⑵ 与输入有关的隐含对象 与输入有关的隐含对象有两个:param和paramValues,它们是EL中比较特别的隐含对象。例如我们要取得用户的请求参数时,可以利用下列方法: request.getParameter(String name) request.getParameterValues(String name) 在EL中则可以使用param和paramValues两者来取得数据。

  8. ${param.name} ${paramValues.name} ⑶ 其他隐含对象 ① cookie JSTL并没有提供设定cookie的动作,例:要取得cookie中有一个设定名称为userCountry的值,可以使用${cookie.userCountry}来取得它。 ② header和headerValues header 储存用户浏览器和服务端用来沟通的数据。

  9. 例1:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。例1:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。 另外在鲜少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得这些值。 ③ initParam initParam取得设定web站点的环境参数(Context)

  10. 例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)

  11. ${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} 取得主机端的服务信息

  12. 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. 13.4 EL函数(functions) 语法:ns:function( arg1, arg2, arg3 …. argN) 其中ns为前置名称(prefix),它必须和taglib 指令的前置名称一置 ⑴ EL表达式用${}表示,可用在所有的HTML和JSP标签中 作用是代替JSP页面中复杂的JAVA代码。

  14. ⑵ EL表达式可操作常量 变量 和隐式对象. 最常用的 隐式对象有${param}和${paramValues}。 ${param}表示返回请求参数中单个字符串的值。 ${paramValues}表示返回请求参数的一组值.pageScope表示页面范围的变量.requestScope表示请求对象的变量。 sessionScope表示会话范围内的变量.applicationScope表示应用范围的变量。

  15. ⑶ <%@ 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。点运算符(.)和"[ ]"都是表示获取变量的值.区别是[ ]可以显示非词类的变量。

  16. 13.5 Core标签库 ⑴ 通用标签 ①<c:out>:标签用于在JSP中显示数据,它有如下属性 属 性 描 述 是否必须 缺省值 value 输出的信息,可以是EL表达式或常量 是 无 default value为空时显示信息 否 无 escapeXml 为true则避开特殊的xml字符集, 否则为true 。

  17. 例4: 您的用户名是: <c:out value=”” default=”guest”/> 显示用户的用户名,如为空则显示guest <c:out value=""/> 指定从session中获取username的值显示; <c:out value="" /> 显示username的值,默认是从request(page)中取,如果request中没有名为username的对象则从session中取,session中没有则从application(servletContext)中取,如果没有取到任何值则不显示。

  18. ②<c:set>:标签用于保存数据,它有如下属性 属 性 描 述 是否必须 缺省值 value 要 保存的信息,可以是EL表达式或常量 否 target 需要修改属性的变量名,一般为javabean的实例 否 无 property 需要修改的javabean属性 否 无 var 需要保存信息的变量 否 无 scope 保存信息的变量的范围 否 page 。 如果指定了target属性, 那么property属性也必须指定。

  19. 例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中。

  20. ③ <c:remove> <c:remove>标签用于删除数据,它有如下属性 属 性 描 述 是否必须 缺省值 var 要删除的变量 是 无 scope 被删除变量的范围 否 所有范围,包括page、request、session、application等。 ⑵ 流控制标签 ①<c:if>:标签有如下属性 属 性 描 述 是否必须 缺省值 test 需要评价的条件,相当于if (...){}语句中的条件 是 无 var 要求保存条件结果的变量名 否 无 scope 保存条件结果的变量范围 否 page 。

  21. ②<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>

  22. <c:when test=""> user.stingy is true. </c:when> <c:otherwise> user.generous and user.stingy are false. </c:otherwise> </c:choose>

  23. 只有当条件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>标签共同来完成了。

  24. ⑶ 循环控制标签 ① <c:forEach>:标签用于通用数据,它有以下属性 属 性 描 述 是否必须 缺省值 items 进行循环的项目 否 无 begin 开始条件 否 0 end 结束条件 否 集合中的最后一个项目 step 步长 否 1 var 代表当前项目的变量名 否 无 varStatus 显示循环状态的变量 否 无 。

  25. 例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接口的对象。

  26. 例7:<c:forEach begin="0" end="100" var="i" step="1"> count=<c:out value=""/><br> </c:forEach> 输出: count=0….. count=100

  27. ② <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>

  28. 这个标签的使用相当于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。

  29. <c:import>:标签包含另外一个页面代码到当前页,它有以下属性 属 性 描 述 是否必须 缺省值 url 需要导入页面的url 是 无 context /后跟本地web应用程序的名字 否 当前应用程序 charEncoding 用于导入数据的字符集 否 ISO-8859-1 var 接受导入文本的变量名 否 page scope 接受导入文本的变量的变量范围 否 1 varReader 用于接受导入文本的java.io.Reader变量名 否 无 varStatus 显示循环状态的变量 否 无。

  30. <c:url>:标签输出一个url地址,它有以下属性 属 性 描 述 是否必须 缺省值 url url地址 是 无 context /后跟本地web应用程序的名字 否 当前应用程序 charEncoding 用于导入数据的字符集 否 ISO-8859-1 var 接受处理过的url变量名,该变量存储url 否 输出到页 scope 存储url的变量名的变量范围 否 page。

  31. <c:redirect>标签将请求重新定向到另外一个页面,它有以下属性 属 性 描 述 是否必须 缺省值 url url地址 是 无 context /后跟本地web应用程序的名字 否 当前应用程序。 ④ <c:param>:标签用来传递参数给一个重定向或包含页面,它有以下属性 属 性 描 述 是否必须 缺省值 name 在request参数中设置的变量名 是 无 value 在request参数中设置的变量值 否 无 。

  32. ⑸ JSTL的优点 ① 在应用程序服务器之间提供了一致的接口,最大程序地提高了WEB应用在各应用服务器之间的移植。 ② 简化了JSP和WEB应用程序的开发。 ③ 以一种统一的方式减少了JSP中的scriptlet代码数量,可以达到没有任何scriptlet代码的程序。在我们公司的项目中是不允许有任何的scriptlet代码出现在JSP中。 ④ 允许JSP设计工具与WEB应用程序开发的进一步集成。相信不久就会有支持JSTL的IDE开发工具出现。

  33. 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)。

  34. 例9: JSP2.0中定义和使用函数(通过EL表达式) 表达式语言允许你定义可在表达式中调用的函数。函数必须作为public类中的public static方法编写。同时要将文件映射到TLD标志库文件中。为了说明函数的使用,我们举一个简单的例子,把两个数相加。首先要编写求两数之和的Java方法代码,如代码示例所示,这里定义了一个静态方法,它接收两个字符串参数,把它们解析成整数并返回它们的和。   示例文件:Compute.java

  35. 用javac把这段代码编译成功后,下一步就要把函数的签名映射到标签库。用javac把这段代码编译成功后,下一步就要把函数的签名映射到标签库。 将方法映射到TLD表中 配置标记库描述文件 函数描述符

  36. 现在我们就可以编写一个JSP页面来使用这个函数。代码示例5是包含两个字段的一个表单,用户输入两个数字并按下“求和”按钮,就会调用上面的函数并把两个数相加,结果在同一个页面中显示出来。现在我们就可以编写一个JSP页面来使用这个函数。代码示例5是包含两个字段的一个表单,用户输入两个数字并按下“求和”按钮,就会调用上面的函数并把两个数相加,结果在同一个页面中显示出来。 在JSP页面中调用要引用的Taglib标记,然后就可以在jsp页面中访问了。 代码示例:math.jsp

  37. 作  业 ①:EL表达式的的基本语法是什么?如何让JSP页面忽略EL表达式? ②:如何在JSP文件中引用自定义标签?试自举例加以说明。                                     教学总结:

  38. 上机实验十三:EL表达式及其使用(2课时) 一、实验目的及要求 1.掌握EL表达式的基本语法 2.掌握JSTL的核心标签的使用 3.掌握EL表达式在JSP中的应用 二、实验环境 Myeclipse、Tomcat、JDK

  39. 三、实验内容 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表达式获取用户并验证用户名是否为空,如果不为空则显示登录成功,否则将页面重定向到用户登录首页。

  40. 四、实验步骤 略 五、实验思考 1.EL表达式必须在什么样的软件环境下才能执行? 2.如何用EL表达式获取JavaBean中属性值,试自编相关程序进行验证。

More Related