已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
表达式语言jsp表达式语言(EL)简介:Sun Microsystems 在 1997 年下半年推出了 Servlet API,将它定位为 CGI 开发人员使用的一种功能强大的工具,这些开发人员正在寻找比 CGI(通用网关接口)编程更高效和轻便的优秀解决方案。但是,开发人员很快就发现 Servlet API 有其自身的缺点,从代码的可维护性和可扩展性方面来看,该解决方案难以实施。在某种程度上,这种缺点促使团队开发一种允许在 HTML 中嵌入 Java 代码的解决方案 JavaServer Pages (JSP) 因此而出现。不久以后,开发人员意识到将表达与商务逻辑混合在一起的复杂 JSP 页不易于理解和维护。不能编写 scriplet 的页面制作人员所面临的另一个问题是由于标准标记集而带来的 JSP 限制。这些限制使得难点变成利用 JSP 实施自定义标记的机制来创建 JSP 自定义标记。 JSP 标准标记库 (JSTL) 是自定义标记库的集合,它将许多 JSP 应用程序通用的核心功能封装为简单的标记。它不再需要使用 JSP scriptlet和表达式,而使用表达式的更高级语法。它还实现了通用目的的功能,如迭代和条件化、数据管理格式化、XML 操作、数据库访问、国际化和对本地化信息敏感的格式化标记以及 SQL 标记。JSTL 1.0 推出了 EL 的概念,但只限于 JSTL 标记。在 JSP 2.0 中,您可以使用带模板文本的 EL,甚至可以通过 javax.servlet.jsp.el 获得编程方式的访问。在我们了解 JSTL 如何适应环境以及与 JSTL 表达式语言相关的限制以后,我们来看 JSP 2.0 的重要优点之一 JSP 表达式语言 (EL)。我们将特别涉及到以下内容:1、 应用表达式语言的动力表达式语言是JSP2.0的新特性,是从JavaScript脚本语言得到启发的一种语言,它借鉴了JavaScript多类型转换无关性的特点。在使用EL从scope中得到参数时可以自动转换类型,因此对于类型的限制更加宽松。表达式语言可以将表示层简化,它允许我们使用更简洁,更易读的项。EL不仅可以用来取代难以维护的java脚本或笨拙的和标签。尤其重要的是,表达式语言支持下面的功能:1精确的访问存储对象:要输出“作用域变量”(使用setAttribute 方法存储在PageContext、HttpServletReqest、HttpSession或ServletContext中的对象),我们可以直接使用$对象名。2Bean属性的简略记法:如要输出访问作用域变量company的name属性(即company.getName()方法的结果)我们可以直接使用$。3对几个元素的简单访问:如要访问数组、List或Map集合里,我们使用$对象名索引。如果索引或键所采用的形式可以合法java变量名的要求,则Bean的点号记法可以和集合的括号记法互换。4对请求参数、Cookie和其他请求数据的简单访问:如果要访问标准的请求数据,我们可以使用几个预定义的隐式对象。5条件性输出:在进行有选择地输出时,我们可以不必借助于Java脚本元素。取而代之,我们可以使用$test?option1:option2来完成这一功能。6自动类型转换:表达式语言移除了大多数类型转换的需求,可以省略很多将字符串解析成数字代码。7空值取代错误消息:大多数情况下,没有响应的值或NullPointerException 异常都会导致空字符串的出现,而非抛出异常。2、 JSP页面使用EL在Jsp页面中,我们使用下面形式的调用表达式语言:$expression这些EL元素可以出现在JSP页面中和JSP标签属性中,只要JSP标签的属性允许使用JSP表达式。如下所示: Name:$表达式1 Address:$表达式2 在标签属性中使用表达式语言时,我们可与使用多分表达式(有可能与静态文本混合在一起),结果被强行拼接成字符串。如下所示: 注意,如果希望“$”出现在页面的输出中,在JSP页面中需要使用“$”。如果希望在EL表达式中使用单引号或双引号,则须分别使“”和“”。下面是页面使用EL的典型例子,代码所示: 页面使用EL EL表达式计算结果 $3+2$3+2 $3*2$3*2 $32$32 $!true $!true $true&false $true&false 3、 JSP页面禁用ELJSP2.0的页面默认是允许使用EL表达式,如果要在个别页面内禁用EL,可以将page指令的isELIgnored属性设为true,如下所示:注意,isELIgnored是JSP 2.0新引入的属性,不能在只支持JSP1.2或更早版本的服务器中使用它。因此我们不能使用这项技术让同一JSP页面不加修改地运行在新的和较老的服务器上。这里有一中批量禁用EL的方式,我们可以在web.xml中使用标签批量禁用EL,代码片段如下:*.jsptrue这里需要说明下,标签是JSP2.0中新增功能,如果使用低版本的web.xml(2.3或以下),就不能使用这个标签了。本例中的web.xml的版本是2.5。这样设置后,所有的JSP的页面全部不支持EL了。4、 访问作用域变量我们经常会碰到这种情况,某个Servlet在代码中生成了数据或从数据库获取了数据,之后又使用RequsetDispatcher对象的forward()方法或response对象的sendRedirect()方法将控制权转移给相应的JSP页面。为了让其它的JSP页面能够访问到这些数据,该Servlet需要使用setAttribute方法将数据存储在某个标准位置:HttpServletRequest、HttpSession或ServletContext。处于这些位置的对象称作是“作用域变量”,使用表达式语言可以快速容易地访问这些对象。当然,我们也可以将作用域变量存储在PageContext对象中,但由于Servlet和JSP页面不共享PageContext对象,所以这样做没有什么意义。假设session作用域中存放了属性名为name的对象,要输出作用域变量的值,只需要在表达式语言中使用它的名字,如下所示:$nameEL会依次从PageContext、HttpServletRequest、HttpSession和ServletContext对象中查找名为name的属性。如果找到该属性,则调用它的toString()方法并返回调用的结果。如果没有找到任何属性,则返回空字符串(不是null或错误消息)。因此它下面的代码片段的效果是相同的。是从JSP session内置对象里查找属性名为”name”的对象。如果不使用Scriptlet的话,也可以使用标签,效果也是相同的。代码如下: 从上面的代码中可以看出,使用Scriptlet,JSP页面中出现了Java代码,若改为使用标签,则显得标签很冗长,还必须知道对象存放的作用域和属性的完整类名。这极为不方便,尤其是在JSP页面的开发者并非Servlet的开发者的情况下,那么使用EL显得页面很简明了。我们通过一个简单的例子来看一看作用域的访问。示例:package control;import java.io.IOException;import javax.servlet.RequestDispatcher;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class ScopeServlet extends HttpServlet public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOExceptionresponse.setContentType(text/html;charset=gbk);request.setAttribute(attribute1,First Value);HttpSession session = request.getSession();/获得Session对象session.setAttribute(attribute2, Second Value);ServletContext application = getServletContext();/获得application对象application.setAttribute(attribute3, Third Value);/把属性名相同的对象存放在不同作用域对象中request.setAttribute(repeated, Request);session.setAttribute(Repeated, Session);application.setAttribute(repeated, ServletContext);/页面控制权转移到scope.jsp页面RequestDispatcher dispatcher = request.getRequestDispatcher(scope.jsp);dispatcher.forward(request, response);在对应的scope.jsp页面中输出传递过来的数据,使用表达式语言。示例:scope.jspattribute1:$attribute1 attribute2:$attribute2 attribute3:$attribute3 repeated:$repeated 运行结果如图:从运行结果可以看出,属性名名都是“repeated”的三个不同的对象,分别存放到request、session和ServletContext中,使用$repeated去取该对象时,取到的是放在request对象里的属性值。前面讲过,EL会依次从pageContext、request、session和application作用域中去查找属性名为”repeated”的对象,如果找到,就直接输出,则不会继续在更高的作用域中去查找。那么,如果我们要取放在session和ServletContext对象中的属性值,该如何去取呢?这里我们需要使用El的内置对象,sessionScope和applicationScope。把前面例子代码稍作修改,如:scope.jspattribute1:$attribute1 attribute2:$attribute2 attribute3:$attribute3 repeated:$requestScope.repeated repeated:$sessionScope.repeated repeated:$applicationScope.repeated 运行结果如图:5、 访问JavaBean的属性在JSP表达式语言中为访问Bean的属性提供一种简单但十分强大的点号记法。如果我们某个JavaBean对象示例存放在某个作用域里,使用EL可以直接访问该对象的任何属性。例如,mybean对象的name属性,只需要使用$即可实现。到目前为止学过三种方法来访问JavaBean的某个属性,总结如下:方法一:$方法二:方法三:要注意一点,表达式语言允许我们任意嵌套属性。我们来看两个JavaBean,一个是Account JavaBean,其中有个属性是Address类型,而Address同样是个JavaBean。代码如实例8-5、8-6所示:示例8-5:package bean;public class Account private String accId;private String accName;private String accPwd;private float Balance;/地址属性private Address address;public String getAccId() return accId;public void setAccId(String accId) this.accId = accId;public String getAccName() return accName;public void setAccName(String accName) this.accName = accName;public String getAccPwd() return accPwd;public void setAccPwd(String accPwd) this.accPwd = accPwd;public float getBalance() return Balance;public void setBalance(float balance) this.Balance = balance;public Address getAddress() return address;public void setAddress(Address address) this.address = address;示例8-6:package bean;public class Address private String province;private String city;private String street;public String getProvince() return province;public void setProvince(String province) vince = province;public String getCity() return city;public void setCity(String city) this.city = city;public String getStreet() return street;public void setStreet(String street) this.street = street;/这里需要重写toString()方法public String toString()return province + city + street;EL的可以让我们嵌套访问Address对象的属性,使用下面的简单形式。$mybean.address.privince$mybean.address.city$mybean.address.street来看使用三种方式访问JavaBean属性的综合例子,代码如下示例8-7: 在页面使用JavaBean对象 输出账号(方式1): 账号: 姓名: 密码: 地址: 开户金额: 输出账号(方式2): 账号: 姓名: 密码: 地址: 开户金额: 输出账号(方式3): 账号:$acc.accId 姓名:$acc.accName 密码:$acc.accPwd 地址:$vince $acc.address.city $acc.address.street 开户金额:$acc.balance 这里需要注意红色字体部分,Account JavaBean 的Address属性是个JavaBean类型,我们在示例8-6的代码中重写了类的toString()方法,所以,第一部分的红色代码可以直接使用表达式来代替,效果是一样的。由于标签不支持属性的嵌套,所以,必须要重写Address类的toString()方法, 不然,会输出形如bean.Addressxx的字符串,前面学习过,会调用toString()方法把属性转成字符串输出。第三部分红色自提显示了EL表达式是支持属性的嵌套的。运行结果如下图:6、 点号记法与数组记法的等同性使用表达式语言时,也可以使用数组记法(方括号)来代替点号记法。$mybean.accName替换成:$mybean“accName”7、 EL隐式对象JSP开发人员可以在EL表达式中使用EL隐式对象,而无需任何显式的编码声明。隐式对象就是设计用来为JSP编程提供方便的,通过隐式对象,用EL编写的代码就可以直接使用JSP页面的一些最常用的地方。总共有11个隐式对象,这11个隐式对象可以分为5大类:JSP隐式对象作用域访问隐式对象参数访问隐式对象HTTP头访问隐式对象初始化参数访问隐式对象ELpageContext隐式对象是javax.servlet.jsp.PageContext类的实例,容器自动为每个JSP页面创建与之对应的pageContext对象,并把与JSP对应的Servlet对象的相关对象都自动地加入到pageContext对象中,它与同名的JSP隐式对象实际上就是同一个对象。余下的EL隐式对象都是java.util.Map类,他们只是提供了更容易的途径来访问pageCont
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 印刷品采购合同协议书
- 副职竞聘笔试题库及答案
- 合伙种槟榔合同协议书
- 可不可以终止协议合同
- 公司转让资产合同范本
- 关于续租房屋合同范本
- 变更施工位的合同范本
- 厂房中介劳务合同范本
- 加盟技术培训合同范本
- 劳动项分包合同协议书
- (正式版)DB61∕T 5078-2023 《体育建筑工艺设计标准》
- 国家能源集团笔试试题及答案
- 安全体验馆培训内容课件
- 2025年会计师事务所招聘面试模拟题及解析
- 《冶金原理(第2版)》全套教学课件
- 2025年经济师考试农业经济(中级)专业知识和实务试卷及答案
- 海岸生态修复技术-洞察及研究
- 2025年重庆市属、区事业单位招聘考试(土地资源管理相关专业知识)历年参考题库含答案详解(5卷)
- 子宫脱垂护理课件
- 2025年期货交易测试题库及答案
- 企法法务-销售方案(3篇)
评论
0/150
提交评论