仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 369|回复: 7
打印 上一主题 下一主题

[学习教程] JAVA网页编程之JSTL 进门:表达式言语

[复制链接]
飘飘悠悠 该用户已被删除
跳转到指定楼层
#
发表于 2015-1-18 11:08:20 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
通过视频学习比传统的大课堂学习更适合成人化的学习规律。有人说大课堂气氛好,学习氛围浓,热闹,可以认识很多人。js  JSP尺度标志库(JSPStandardTagLibrary,JSTL)是一个完成Web使用程序中罕见的通勤奋能的定制标志库集,这些功效包含迭代和前提判别、数据办理格局化、XML操纵和数据库会见。在developerWorks上其新系列的第一篇文章中,软件工程师MarkKolb向您展现了怎样利用JSTL标志来制止在JSP页面中利用剧本体例元素。您还将懂得怎样经由过程从暗示层删除源代码来简化软件保护。最初,您将懂得JSTL经由简化的表达式言语,它同意在不用利用功效完全的编程言语的情形下对JSTL操纵指定静态属性值。

  JavaServerPages(JSP)是用于J2EE平台的尺度暗示层手艺。JSP手艺供应了用于实行盘算(这些盘算用来静态地天生页面内容)的剧本体例元素和操纵。剧本体例元素同意在JSP页面中包含程序源代码,在为呼应用户哀求而出现页面时能够实行这些源代码。操纵将盘算操纵封装到很象HTML或XML标志的标志中,JSP页面的模板文本一般包括这些标志。JSP标准只将几种操纵界说成了尺度,但从JSP1.1入手下手,开辟职员已可以以定制标志库的体例创立其本人的操纵了。

  JSP尺度标志库(JSTL)是JSP1.2定制标志库集,这些标志库完成大批服务器端Java使用程序经常使用的基础功效。经由过程为典范暗示层义务(如数据格局化和迭代或前提内容)供应尺度完成,JSTL使JSP作者能够专注于特定于使用程序的开辟需求,而不是为这些通用操纵“重整旗鼓”。

  固然,您可使用JSP剧本体例元素(scriptlet、表达式和声明)来完成此类义务。比方,可使用三个scriptlet完成前提内容,清单1中侧重显现了这三个scriptlet。可是,由于剧本体例元素依附于在页面中嵌进程序源代码(一般是Java代码),以是关于利用这些剧本体例元素的JSP页面,其软件保护义务的庞大度年夜年夜增添了。比方,清单1中的scriptlet示例严厉地依附于花括号的准确婚配。假如不经意间引进了一个语法毛病,则前提内容中的嵌套别的scriptlet大概会形成严峻损坏,而且在JSP容器编译该页面时,要使所发生的毛病信息成心义大概会很坚苦。

  清单1.经由过程scriptlet完成前提内容<%if(user.getRole()=="member")){%>
  1. <p>Welcome,member!</p><%}else{%><p>Welcome,guest!</p><%}%>
复制代码

  修改此类成绩一般必要相称丰厚的编程履历。只管一般会由非常精晓页面结构和图形计划的计划职员来开辟和保护JSP,可是统一页面中的剧本体例元素呈现成绩时,必要程序员的参与。这类情况将单个文件中代码的义务分管给多人,因此使得开辟、调试和加强此类JSP页面成为很贫苦的义务。经由过程将经常使用功效包装到定制标志库的尺度汇合中,JSTL使JSP作者能够削减对体例剧本元素的需求,乃至能够不必要它们,并制止了相干的保护本钱。

  JSTL1.0

  JSTL1.0公布于2002年6月,由四个定制标志库(core、format、xml和sql)和一对通用标志库考证器(ScriptFreeTLV和PermittedTaglibsTLV)构成。core标志库供应了定制操纵,经由过程限定了感化域的变量办理数据,和实行页面内容的迭代和前提操纵。它还供应了用来天生和操纵URL的标志。望文生义,format标志库界说了用来格局化数据(特别是数字和日期)的操纵。它还撑持利用当地化资本束举行JSP页面的国际化。xml库包括一些标志,这些标志用来操纵经由过程XML暗示的数据,而sql库界说了用来查询干系数据库的操纵。

  两个JSTL标志库考证器同意开辟职员在其JSP使用程序中强迫利用编码尺度。能够设置ScriptFreeTLV考证器以在JSP页面中禁用各类范例的JSP剧本元素―scriptlet、表达式和声明。相似地,PermittedTaglibsTLV考证器能够用来限定大概由使用程序的JSP页面会见的定制标志库集(包含JSTL标志库)。

  只管JSTL终极将会成为J2EE平台的必须组件,但今朝只要多数使用程序服务器包含它。JSTL1.0的参考完成可作为Apache软件基金会(ApacheSoftwareFoundation)的JakartaTaglibs项目(请参阅参考材料)的一部分而取得。能够将该参考完成中的定制标志库兼并就任何撑持JSP1.2和Servlet2.3标准的服务器,以增加对JSTL的撑持。

  表达式言语

  在JSP1.2中,可使用静态字符串或表达式(假如同意的话)指定JSP操纵的属性。比方,在清单2中,对<jsp:setProperty>操纵的name和property属性指定了静态值,而用表达式指定了其value属性。这个操纵的效果是将哀求参数确当前值付与定名的bean特征。以这类情势利用的表达式被称为哀求时属性值(request-timeattributevalue),这是构建到JSP标准中的用于静态指定属性值的独一机制。

  清单2.兼并哀求时属性值的JSP操纵
  1. <jsp:setPropertyname="user"property="timezonePref"value=<%=request.getParameter("timezone")%>/>
复制代码

  由于哀求时属性值是用表达式指定的,以是它们常常有和别的剧本元素一样的软件保护成绩。因而,JSTL定制标志撑持另外一种用于指定静态属性值的机制。能够用简化的表达式言语(EL)而不利用完全的JSP表达式来指定JSTL操纵的属性值。EL供应了一些标识符、存取器和运算符,用来检索和操纵驻留在JSP容器中的数据。EL在某种水平上以EcmaScript(请参阅参考材料)和XML路径言语(XMLPathLanguage,XPath)为基本,因而页面计划职员和程序员都应当熟习它的语法。EL善于寻觅对象及其特征,然后对它们实行复杂操纵;它不是编程言语,乃至不是剧本体例言语。可是,与JSTL标志一同利用时,它就可以利用复杂而又便利的标记来暗示庞大的举动。EL表达式的格局是如许的:用美圆标记({})中,如清单3所示。

  清单3.申明EL表达式定界符的JSTL操纵

  <c:outvalue="${user.firstName}"/>

  别的,您能够将多个表达式与静态文本组合在一同以经由过程字符串并置来机关静态属性值,如清单4所示。独自的表达式由标识符、存取器、笔墨和运算符构成。标识符用来援用存储在数据中央中的数据对象。EL有11个保存标识符,对应于11个EL隐式对象。假定一切别的标识符都援用限定了感化域的变量。存取器用来检索对象的特征或汇合的元素。笔墨暗示流动的值―数字、字符、字符串、布尔型或空值。运算符同意对数据和笔墨举行组合和对照。

  清单4.组合静态文本和多个EL表达式以指定静态属性值

  <c:outvalue="Hello${user.firstName}${user.lastName}"/>

  限定了感化域的变量

  JSPAPI经由过程<jsp:useBean>操纵同意从JSP容器内的四个分歧感化域中存储和检索数据。JSTL经由过程供应用于指定和撤除这些感化域中的对象的附加操纵来扩大这一才能。别的,EL供应将这些对象作为限定了感化域的变量举行检索的内置撑持。出格地,任何呈现在EL表达式中但不合错误应于任何EL隐式对象的标识符,都被主动假定为援用存储在四个JSP感化域的个中某其中的对象,这四个感化域是:

  页面感化域

  哀求感化域

  会话感化域

  使用程序感化域

  您大概还记得,只要在为特定哀求处置页面时代才干检索存储在该页面感化域中的对象。假如对象是存储在哀求感化域中的,能够在处置一切介入处置某哀求的页面时代检索这些对象(比如在对某个哀求的处置中碰到了一个或多个<jsp:include>或<jsp:forward>操纵)。假如对象是存储在会话感化域中的,则在与Web使用程序的交互式会话时代,能够由用户会见的任何页面检索它(即,直到与该用户交相互联系关系的HttpSession对象有效为止)。能够由任何用户从任何页面会见存储在使用程序感化域中的对象,直到卸载Web使用程序自己为止(一般是因为封闭JSP容器而至)。

  经由过程将字符串映照为希冀感化域中的对象来将对象存储到该感化域。然后,就能够经由过程供应不异字符串来从该感化域检索该对象。在感化域的映照中查找字符串,并前往被映照的对象。在ServletAPI中,将此类对象称为响应感化域的属性。可是,在EL的高低文中,也将与属性相干联的字符串看做变量的称号,该变量经由过程属性映照的体例取得特定的值。

  在EL中,与隐式对象有关联的标识符被以为是存储在四个JSP感化域中的称号对象。起首对页面感化域反省是不是存在如许的标识符,其次对哀求感化域、然后对会话感化域、最初对使用程序感化域顺次举行如许的反省,然后测试该标识符的称号是不是与存储在该感化域中的某个对象的称号婚配。第一个如许的婚配作为EL标识符的值被前往。经由过程这类办法,能够将EL标识符看做援用限定了感化域的变量。

  从更手艺的方面来讲,没有映照到隐式对象的标识符是用PageContext实例的findAttribute()办法求值的,该实例暗示对页面的处置,在该页面上,以后正在处置用于哀求的表达式。标识符的称号作为参数传送给这个办法,然后该办法顺次在四个感化域中搜刮具有不异称号的属性。并将所找到的第一个婚配项作为findAttribute()办法的值前往。假如未在这四个感化域中找到如许的属性,则前往null。

  终极,限定了感化域的变量是四个JSP感化域的属性,这些属性具有能够用作EL标识符的称号。只需对限定了感化域的变量付与由字母数字构成的称号,就能够经由过程JSP中供应的用于设置属性的任何机制来创立它们。这包含内置的<jsp:useBean>操纵,和由ServletAPI中的几个类界说的setAttribute()办法。别的,四个JSTL库中界说的很多定制标志自己就可以够设置作为限定了感化域的变量利用的属性值。

  隐式对象

  表1中列出了11个EL隐式对象的标识符。不要将这些对象与JSP隐式对象(一共只要九个)搅浑,个中只要一个对象是它们所共有的。

  表1.EL隐式对象

  种别   标识符            形貌

  JSP   pageContext  PageContext实例对应于以后页面的处置

  感化域  pageScope   与页面感化域属性的称号和值相干联的Map类

       requestScope  与哀求感化域属性的称号和值相干联的Map类

       sessionScope  预会话感化域属性的称号和值相干联的Map类

       applicationScope与使用程序感化域属性的称号和值相干联的Map类

  哀求参数 param     按称号存储哀求参数的次要值的Map类

       paramValues 将哀求参数的一切值作为String数组存储的Map类

  哀求头 header    按称号存储哀求头次要值的Map类

       headerValues 将哀求头的一切值作为String数组存储的Map类

  Cookie cookie    按称号存储哀求附带的cookie的Map类

  初始化参数initParam  按称号存储Web使用程序高低文初始化参数的Map类

    只管JSP和EL隐式对象中只要一个大众对象(pageContext),但经由过程EL也能够会见别的JSP隐式对象。缘故原由是pageContext具有会见一切别的八个JSP隐式对象的特征。实践上,这是将它包含在EL隐式对象中的次要来由。

  其他一切EL隐式对象都是映照,能够用来查找对应于称号的对象。前四个映照暗示先前会商的各类属性感化域。能够用它们来查找特定感化域中的标识符,而不必依附于EL在缺省情形下利用的按次查找历程。

  接上去的四个映照用来猎取哀求参数和哀求头的值。由于HTTP协定同意哀求参数和哀求头具有多个值,以是它们各有一对映照。每对中的第一个映照前往哀求参数或头的次要值,一般是刚巧在实践哀求中起首指定的谁人值。每对中第二个映照同意检索参数或头的一切值。这些映照中的键是参数或头的称号,但这些值是String对象的数组,个中的每一个元素都是单一参数值或头值。

  cookie隐式对象供应了对由哀求设置的cookie称号的会见。这个对象将一切与哀求相干联的cookie称号映照到暗示那些cookie特征的Cookie对象。

  最初一个EL隐式对象initParam是一个映照,它贮存与Web使用程序相干联的一切高低文的初始化参数的称号和值。初始化参数是经由过程web.xml部署形貌符文件指定的,该文件位于使用程序的WEB-INF目次中。

  存取器

  由于EL标识符是作为隐式对象或限定了感化域的变量(经由过程属性来完成)剖析的,因而有需要将它们转换成Java对象。EL能够主动包装息争包其响应的Java类中的基础范例(比方,能够在背景将int强迫转换成Integer类,反之亦可),但年夜多半的标识符将成为指向完全的Java对象的指针。

  了局是,对这些对象的特征或(在对象是数组和汇合的情形下)对其元素的会见一般是使人中意的。就为了完成这类用处,EL供应了两种分歧的存取器(点运算符(.)和方括号运算符([])),也撑持经由过程EL操纵特征和元素。

  点运算符一般用于会见对象的特征。比方,在表达式${user.firstName}中,利用点运算符来会见user标识符所援用对象的名为firstName的特征。EL利用Javabean商定会见对象特征,因而必需界说这个特征的getter办法(一般是名为getFirstName()的办法),以便表达式准确求值。当被会见的特征自己是对象时,能够递回地使用点运算符。比方,假如我们假造的user对象有一个完成为Java对象的address特征,那末也能够用点运算符来会见这个对象的特征。比方,表达式${user.address.city}将会前往这个地点对象嵌套的city特征。

  方括号运算符用来检索数组和汇合的元素。在数组和有序汇合(也即,完成了java.util.List接口的汇合)的情形下,把要检索的元素的下标放在方括号中。比方,表达式${urls[3]}前往urls标识符所援用的数组或汇合的第四个元素(和Java言语和JavaScript中一样,EL中的下标是从零入手下手的)。

  关于完成java.util.Map接口的汇合,方括号运算符利用联系关系的键查找存储在映照中的值。在方括号中指定键,并将响应的值作为表达式的值前往。比方,表达式${commands["dir"]}前往与commands标识符所援用的Map中的"dir"键相干联的值。

  关于上述两种情形,都可同意表达式呈现在方括号中。对嵌套表达式求值的了局将被作为下标或键,用来检索汇合或数组的得当元素。和点运算符一样,方括号运算符也能够递回使用。这使得EL可以从多维数组、嵌套汇合或二者的恣意组合中检索元素。别的,点运算符和方括号运算符还能够互操纵。比方,假如数组的元素自己是对象,则可使用方括号运算符来检索该数组的元素,并分离点运算符来检索该元素的一个特征(比方${urls[3].protocol})。

  假定EL充任指定静态属性值的简化言语,EL存取器有一个风趣的功效(与Java言语的存取器分歧),那就是它们在使用于null时不抛出非常。假如使用EL存取器的对象(比方,${foo.bar}和${foo["bar"]}中的foo标识符)是null,那末使用存取器的了局也是null。现实证实,在年夜多半情形下,这是一个相称有效的举动,不久您就会懂得这一点。

  最初,点运算符和方括号运算符大概完成某种水平的交换。比方,也能够利用${user["firstName"]}来检索user对象的firstName特征,正如能够用${commands.dir}猎取与commands映照中的"dir"键相干联的值一样。

  运算符

  EL还能够经由过程利用标识符和存取器,遍历包括使用程序数据(经由过程限定了感化域的变量公然)或关于情况的信息(经由过程EL隐式对象)的对象条理布局。可是,只是会见这些数据,一般不敷以完成很多JSP使用程序所需的暗示逻辑。

  终极,EL还包含了几个用来操纵和对照EL表达式所会见数据的运算符。表2中汇总了这些运算符。

  表2.EL运算符

  种别    运算符

  算术运算符  +、-、*、/(或div)和%(或mod)

  干系运算符 ==(或eq)、!=(或ne)、<</code>(或lt)、>(或gt)、<=(或le)和>=(或ge)

  逻辑运算符  &&(或and)、||(或or)和!(或not)

  考证运算符 empty

  算术运算符撑持数值的加法、减法、乘法和除法。还供应了一个求余运算符。注:除法和求余运算符都有替换的、非标记的称号(为的是与XPath坚持分歧)。清单5中显现了一个演示算术运算符用法的示例表达式。对几个EL表达式使用算术运算符的了局是将该算术运算符使用于这些表达式前往的数值所得的了局。

  清单5.使用算术运算符的EL表达式
  1. ${item.price*(1+taxRate[user.address.zipcode])}
复制代码

  干系运算符同意对照数字或文本数据。对照的了局作为布尔值前往。逻辑运算符同意兼并布尔值,前往新的布尔值。因而,能够将EL逻辑运算符使用于嵌套的干系或逻辑运算符的了局,如清单6所示。

  清单6.使用干系和逻辑运算符的EL表达式
  1. ${(x>=min)&&(x<=max)}
复制代码

  最初一种EL运算符是empty,它关于考证数据出格有效。empty运算符接纳单个表达式作为其变量(也即,${emptyinput}),并前往一个布尔值,该布尔值暗示对表达式求值的了局是否是“空”值。求值了局为null的表达式被以为是空,即无元素的汇合或数组。假如参数是对长度为零的String求值所得的了局,则empty运算符也将前往true。

  表3显现了EL运算符的优先级。正如清单5和6所示,能够用圆括号对表达式分组,高于一般的优先级划定规矩。

  表3.EL运算符优先级(自顶究竟,从左到右)
  1. [],.()unary-、not、!、empty*、/、div、%、mod+、binary-()<</code>、>、<=、>=、lt、gt、le、ge==、!=、eq、ne&&、and||、or
复制代码

  笔墨

  在EL表达式中,数字、字符串、布尔值和null都能够被指定为笔墨值。字符串能够用单引号或双引号定界。布尔值被指定为true和false。

  Taglib伪指令

  正如我们先前会商的,JSTL1.0包含四个定制标志库。为了演示JSTL标志和表达式言语的交互,我们将研讨几个来自JSTLcore库的标志。和利用任何JSP定制标志库一样,必需在您想要利用这个库标志的任何页面中包含taglib伪指令。清单7显现了用于这个特定库的伪指令。

  清单7.用于JSTLcore库EL版本的taglib伪指令
  1. <%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>
复制代码

  实践上,对应于JSTLcore库的taglib伪指令有两种,由于在JSTL1.0中,EL是可选的。一切四个JSTL1.0定制标志库都有利用JSP表达式(而不是EL)指定静态属性值的备用版本。由于这些备用库依附于JSP的更传统的哀求时属性值,以是它们被称为RT库,而那些利用表达式言语的则被称为EL库。开辟职员用分歧的taglib伪指令来辨别每一个库的这两个版本。清单8显现了利用core库的RT版本的伪指令。可是,因为如今我们会商的重点是EL,以是起首必要这些伪指令。

  清单8.用于JSTLcore库RT版本的taglib伪指令
  1. <%@tagliburi="http://java.sun.com/jstl/core_rt"prefix="c_rt"%>
复制代码

  变量标志

  我们起首要思索的JSTL定制标志是<c:set>操纵。正如已申明的,限定了感化域的变量在JSTL中起关头感化,<c:set>操纵供应基于标志的机制来创立和设置限定了感化域的变量。清单9中显现了该操纵的语法,个中var属性指定了限定了感化域的变量的称号,scope属性标明了该变量驻留在哪一个感化域中,value属性指定了分派给该变量的值。假如指定变量已存在,则复杂地将所指明的值赋给它。假如不存在,则创立新的限定了感化域的变量,并用该值初始化这个变量。

  清单9.<c:set>操纵的语法
  1. <c:setvar="name"scope="scope"value="expression"/>
复制代码

  scope属性是可选的,其缺省值是page。

  清单10中显现了<c:set>的两个示例。在第一个示例中,将会话感化域变量设置成String值。在第二个示例中,用表达式来设置数值:将页面感化域内名为square的变量赋值为名为x的哀求参数的值的平方。

  清单10.<c:set>操纵示例
  1. <c:setvar="timezone"scope="session"value="CST"/><c:setvar="square"value="${param[x]*param[x]}"/>
复制代码

  您还能够将限定了感化域的变量的值指定为<c:set>操纵的主体内容,而不是利用属性。利用这类办法,您能够从头编写清单10中的第一个示例,如清单11所示。别的,正如我们即刻能够看到的,<c:set>标志的主体内容自己也能够利用定制标志。<c:set>主体内天生的一切内容都将作为一个String值赋给指定变量。

  清单11.经由过程主体内容指定<c:set>操纵的值
  1. <c:setvar="timezone"scope="session">CST</c:set>
复制代码

  JSTLcore库包括第二个用于办理限定了感化域的变量的标志―<c:remove>。望文生义,<c:remove>操纵是用来删除限定了感化域的变量的,它猎取两个属性。var属性指定待删除变量的称号,scope属性是可选的,它暗示待删除变量来自哪一个感化域,缺省为page,如清单12所示。

  清单12.<c:remove>操纵示例
  1. <c:removevar="timezone"scope="session"/>
复制代码

  输入

  只管<c:set>操纵同意将表达式了局赋给限定了感化域的变量,但开辟职员一般会但愿只显现表达式的值,而不存储它。JSTL<c:out>定制标志承当这一义务,其语法如清单13所示。该标志对由其value属性指定的表达式举行求值,然后打印了局。假如指定了可选属性default,那末,在对value属性的表达式求值所得了局为null或空String的情形下,<c:out>将打印其值。

  清单13.<c:out>操纵的语法
  1. <c:outvalue="expression"default="expression"escapeXml="boolean"/>
复制代码

  escapeXml属性也是可选的。它把持当用<c:out>标志输入诸如“<”、“>”和“&”之类的字符(在HTML和XML中具有特别意义)时是不是应当举行本义。假如将escapeXml设置为true,则会主动将这些字符转换成响应的XML实体(此处提到的字符分离转换成<、>和&)。

  比方,假定有一个名为user的会话感化域变量,它是一个类的实例,该类为用户界说了两个特征:username和company。每当用户会见站点时,这个对象被主动分派给会话,但直到用户实践登录后,才会设置这两个特征。假定是这类计划,请思索清单14中的JSP片断。在用户登录以后,这个片断将显现单词“Hello”,厥后是他/她的用户名和一个惊讶号。可是,在用户登录之前,由这个片断天生的内容则是短语“HelloGuest!”。在这类情形下,由于username特征另有待初始化,以是<c:out>标志将转而打印出default属性的值(即字符串“Guest”)。

  清单14.带缺省内容的<c:out>操纵示例Hello
  1. <c:outvalue="${user.username}"default=="Guest"/>!
复制代码

  接上去,思索清单15,它利用了<c:out>标志的escapeXml属性。假如在这类情形下已将company特征设置成JavaString值"Flynn&Sons",那末,实践上该操纵天生的内容将是Flynn&Sons。假如这个操纵是天生HTML或XML内容的JSP页面的一部分,那末,这个字符串两头的“&”标记终极大概被注释为HTML或XML把持字符,从而妨害了对该内容的显现或剖析。可是,假如将escapeXml属性值设置成true,则所天生的内容将是Flynn&Sons。扫瞄器或剖析器不会因在注释时碰到这类内容而出成绩。假定HTML和XML是JSP使用程序中最多见的内容范例,以是escapeXml属性的缺省值是true就多如牛毛了。

  清单15.禁用本义的<c:out>操纵示例
  1. <c:outvalue="${user.company}"escapeXml=="false"/>
复制代码

  用缺省值设置变量

  除简化静态数据的显现以外,当经由过程<c:set>设置变量值时,<c:out>指定缺省值的才能也很有效。正如清单11所示,用来赋给限定了感化域的变量的值能够指定为<c:set>标志的主体内容,也能够经由过程其值属性来指定。经由过程将<c:out>操纵嵌套在<c:set>标志的主体内容中,变量赋值就能够使用其缺省值才能。

  清单16中申明了这类办法。内部<c:set>标志的举动十分复杂:它依据其主体内容设置会话感化域timezone变量的值。可是,在这类情形下,主体内容是经由过程<c:out>操纵天生的。这个嵌套操纵的值属性是表达式${cookie[tzPref].value},它实验经由过程cookie隐式对象前往名为tzPref的cookie值。(cookie隐式对象将cookie称号映照到响应的Cookie实例,这意味着必需经由过程对象的value特征利用点运算符来检索贮存在cookie中的实践数据。)

  清单16.兼并<c:set>和<c:out>以供应缺省变量值
  1. <c:setvar="timezone"scope=="session"><c:outvalue="${cookie[tzPref].value}"default=="CST"/></c:set>
复制代码

  可是,请思索以下情形,用户是第一次实验利用这段代码的Web使用程序。了局是,哀求中没有供应名为tzPref的cookie。这意味着利用隐式对象的查找将前往null,在这类情形下全部表达式将前往null。由于对<c:out>标志的value属性求值的了局是null,以是<c:out>标志会转而输入对其default属性求值的了局。在这里是字符串CST。因而,实践的了局是将timezone限定了感化域的变量设置成用户的tzPrefcookie中存储的时区,大概,假如没有,则利用缺省时区CST。

  EL和JSP2.0

  今朝,表达式言语仅可用于指定JSTL定制标志中的静态属性值。但JSTL1.0表达式言语的一个扩大已被提出,会把它包含到JSP2.0中往,眼下正在举行最初评审。这个扩大将同意开辟职员经由过程本人的定制标志来利用EL。页面作者将能够在今朝同意利用JSP表达式的任何中央利用EL表达式,比如将静态值拔出模板文本中:<p>Yourpreferredtimezoneis${timezone}</p>。

  这个JSP2.0功效(就象JSTL自己一样)将撑持页面作者进一步削减对JSP体例剧本元素的依附,从而改善JSP使用程序的可保护性。

  停止语

  EL(与四个JSTL定制标志库供应的操纵分离起来)同意页面作者不利用剧本元素便可完成暗示层逻辑。比方,对照本文开首清单1中的JSP代码和清单17中显现的经由过程JSTL完成的一样功效。(JSTLcore库中其他的标志,包含<c:choose>及其子标志,将在本系列的下一篇文章中会商。)只管明显实行了前提逻辑,可是JSTL版本中没有Java言语源代码,而且标志之间的干系(特别是关于嵌套需求)关于任何精晓HTML语法的人都应当是熟习的。

  清单17.兼并<c:set>和<c:out>以供应缺省变量值
  1. <c:choose><c:whentest="${user.role==member}"><p>Welcome,member!</p></c:when><c:otherwise><p>Welcome,guest!</p></c:otherwise></c:choose>
复制代码

  经由过程供应年夜多半Web使用程序经常使用功效的尺度完成,JSTL有助于减速开辟周期。与EL分离起来,JSTL能够不必要对暗示层程序编写代码,这极年夜地简化了JSP使用程序的保护。

  参考材料

  Sun的JSP尺度标志库主页是懂得关于JSTL的更多信息的优秀出发点。

  JSTL1.0标准是关于EL和四个JSTL标志库的终极威望文本。

  JakartaTaglibs项目是JSTL1.0参考完成的劈头。

  ShawnBayern所著的JSTLinAction(ManningPublicationsCo.,2002年)供应了对一切JSTL功效的出色叙述,作者是该参考完成的向导。

  DavidGeary是Java手艺方面很受接待的作者,他也写了一本关于JSTL的书,书名是CoreJSTL。

  JSPTags.com是JSP手艺参考材料的目次,它特别专注于定制标志库。

  Sun的JavaWebServicesTutorial中包括了对JSTL的会商。

  “UsingJSPsandcustomtagswithinVisualAgeforJavaandWebSphereStudio”(WebSphere开辟者场地)是一篇WBOnline有用论文,它演示了servlet、JSP和定制标志库的利用。

  经由过程JeffWilson出色的文章“利用定制标志把持JSP页面”(developerWorks,2002年1月)懂得关于定制标志库的统统。

  NoelBergman的文章“JSP标志库:着意计划的更好的可用性”(developerWorks,2001年12月)向您展现了声明性标志是怎样匡助进步JSP页面的可用性的。

  有关EcmaScript的更多具体信息,请参阅SingLi的“疾速上手Java编程”(developerWorks,2001年7月)。

  在developerWorksJava手艺专区能够找到多达数百篇的Java手艺参考材料。

  关于作者

  MarkKolb是一位在德克萨斯州奥斯汀事情的软件工程师。他常常就服务器端Java主题在业界宣布演讲,而且与人合著了WebDevelopmentwithJavaServerPages,第二版一书。可经由过程mak@taglib.com与Mark接洽。
其实你不用Struts,spring这些工具,直接用jsp,servlet能够很方便地写出来,而且,可以根据个人的水平、爱好,有很多方案。而struts,spring这些工具的出来。
飘灵儿 该用户已被删除
7#
发表于 2015-3-27 08:58:11 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
乐观 该用户已被删除
6#
发表于 2015-3-19 06:09:03 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
再见西城 该用户已被删除
5#
发表于 2015-3-11 18:08:38 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
简单生活 该用户已被删除
地板
发表于 2015-3-4 09:27:18 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
小魔女 该用户已被删除
板凳
发表于 2015-1-29 12:38:14 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
admin 该用户已被删除
沙发
发表于 2015-1-29 08:32:09 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
兰色精灵 该用户已被删除
楼主
发表于 2015-1-20 13:53:39 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 02:02

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表