??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲一二成人精品区,亚洲一区二区精品视频,亚洲偷自拍另类图片二区http://m.tkk7.com/sharkafeng/Focus on Eclipse Tools.zh-cnMon, 12 May 2025 06:41:30 GMTMon, 12 May 2025 06:41:30 GMT60使用JSTL改进JSP来简化网늚实现q程概述 http://m.tkk7.com/sharkafeng/archive/2006/08/07/62176.htmlThe Spark of ThinkingThe Spark of ThinkingMon, 07 Aug 2006 06:47:00 GMThttp://m.tkk7.com/sharkafeng/archive/2006/08/07/62176.htmlhttp://m.tkk7.com/sharkafeng/comments/62176.htmlhttp://m.tkk7.com/sharkafeng/archive/2006/08/07/62176.html#Feedback1http://m.tkk7.com/sharkafeng/comments/commentRss/62176.htmlhttp://m.tkk7.com/sharkafeng/services/trackbacks/62176.html 概述
  Java Server Pages (JSP) 标准标记?(JSTL)的版本的发布对于JSP/servlet开发者来说是一个重大的q展。有?jin)一个表达语aQELQ和一l四U强大的、易于学?fn)的标准标记库,JSTL极有可能不久后成为实现动态的、基于Java的站点的主要Ҏ(gu)?
  1996q对JSP servlet的介l得Java成ؓ(f)动态网开发的合理的选择。随后出现的Java服务器页(JSP)是走向快速的、可l护的Java|页实现q程的合理进化的一步,紧接着出C(jin)JSP标记的支持。但?002中期的JSTL(JSP标准标记?的发布才是进一步加速和化开发过E最大的一步?
  在本文中Q我解释?jin)JSTL的功能,也涵盖了(jin)你启动JSTL所需的每件事情。假设你有了(jin)对Java、JSP、XML和安装一个Web容器的基本理解。如果你对这些主题感到陌生,你可以在ResourcesQ?a target="_blank">http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl.html?#resourcesresourcesQ上览一下背景参考。在下面的阐qCQ假定你有XML和SQL的知识?
  安装JSTL支持
  对于我们的JSTL安装例子来说Q我们用Tomcat 4.1Q尽Q意支持Servlet 2.3和JSP1.2说明的servlet容器都应该能工作Q。首先,下蝲Tomcat 4.1q且按指C行安装(注意QJSTL需要一个JSP1.2 Web容器Q?

  用tomcat4 startE序启动TomcatQƈ且运行index.html|保Tomcat是激zȝ、且q行良好?

  接下来,安装JSTL支持Q你可以从Jakarta站点下蝲JSTL支持Q(http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl.html?#resourcesresourcesQƈ按照下面步骤Q?

  1.从Jakarta站点下蝲JSTL(g)索、解?脱档该文件。(http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl.html?#resourcesQ?

  2.复制你已l解压ؓ(f)common/lib的jar文gC的Tomcat安装路径中(管我们的项目不需要所有的jar文gQ;q得JSTL文g适用于你的Q意Web应用?

  3.对于L你想使用JSTL的Web应用来说Q复?tld文gC的Web应用的WEB-INF目录下?

  4.对于你的JSTL的Web应用Q编辑web.xmlq添加下列输入:(x)

<taglib>
  <taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
  <taglib-location>/WEB-INF/fmt.tld</taglib-location>
  </taglib>
  <taglib>
   <taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
   <taglib-location>/WEB-INF/c.tld</taglib-location>
  </taglib>
  <taglib>
   <taglib-uri>http://java.sun.com/jstl/sql</taglib-uri>
   <taglib-location>/WEB-INF/sql.tld</taglib-location>
  </taglib>
  <taglib>
   <taglib-uri>http://java.sun.com/jstl/x</taglib-uri>
   <taglib-location>/WEB-INF/x.tld</taglib-location>
  </taglib>

  q些输入让你的Web应用可用JSTL标记库的表达语言QELQ版本。这些输入的位置有关p!如果你不肯定他们输入到何处Q关于web.xml选项和顺序的权威性指导在文档cd定义QDTDQ中定义q:(x)http://java.sun.com/j2ee/dtds/web-app_2_2.dtd?

  5.当你创徏?jin)一个用JSTL的JSP|Q将他输入到你的Web应用的主目录下,像其它JSP和HTML一栗你可以Q意取名,但是它必L一?jsp的扩展名?

  基础原理
  首先Q所有的JSTL也是JSP,JSTL只是JSP功能的一个超集?

  同样Q所有的JSTL标记是有效的XML。这意味着Q如果你JSTL标记之外的内容当作(f)时文本(通常是HTMLQ时Q剩下的JSTL标记必须当作合法的XML来解释。这里有一些隐含的规则Q它要求大部分XML语法都是正确的?

  JSTL提供一l四个标准标记库Qcore核心(j)、internationalization/format国际标准?格式、XML和SQLQƈ支持EL。JSTL和EL的基本设计目的是化网开发和实现?

  在本文中Q我们遵循JSTL说明书的命名规则Qƈ且把JSTL标记当作动作。一个JSTL标记对应于某个动作;调用动作明确的提醒我们:(x)他们d动态行为到一个另外的?rn)态页上?

  JSTL标记库有两个版本Q一个用你以前用的Ҏ(gu)JSP表达式插入,?lt;%= . . . %>Q另一个用一个JSTL EL.我会(x)在后面进一步讨论在JSTL中的EL支持?

  EL支持
  要理解当前JSTL对EL支持的状态,让我们检查相关的说明书是怎样处理的。Java说明书请求(JSRQ专家组成员军_Q由于某U原因,EL规范说明应该是JSP说明书的一部䆾Q而不是JSTL说明书的一部分。EL完整的说明书成ؓ(f)JSP2.0的一部分。因为JSTL1.0在JSP1.3之前已经完成QJSTL作者不得不对用于JSTL1.0的EL支持实现做一个合理的猜测Q结果可能是相当好的Q。一个JSTLl护版本与JSP1.3说明书保持一_(d)qؓ(f)?jin)EL适合JSP1.3说明书,JSTLl护版本做了(jin)一些修正?

  本文描述的EL概要可能在即发布的JSTL版本中有一Ҏ(gu)动,但是M改动都是微小的?

  EL用于单的语法定义?jin)一套功能强大的语言Q它很容易学?fn)。它融合着JavaScript语言和Perl语言较好的部分的一些风根{EL表达式,集成?jin)来自四U标准标记库的JSTL标记Q提供了(jin)一个巨大的、灵zȝ属性集?

  所有的EL表达式都?{}括v来。JSTL中的表达式LJSTL标记中的属性值的一部分。表辑ּ可以是属性的一部分或者合q和嵌入C个字W串直接量中。JSTL属性也可以包含单的字符串直接量。在接下来的JSTL中,我们在一个来自核?j)库的c:out动作中说明每U情况,q个核心(j)库将它的value属性值送到JSP输出上:(x)

<c:out value="${anExpression}"/>
<c:out value="literalText${anExpression}${anotherExpression}"/>
<c:out value="literalText"/>

  EL也定义了(jin)一套规则用于强制表辑ּ中的D{换ؓ(f)上下文相对应的类型。我们在q里不详l讨些规则;然而,它的Ҏ(gu)与用Perl语言定义的方式非常相|像Perl语言中的做法一P该方法理所当然的运行良好,但是Q偶?dng),也?x)出现可能不是你十分想要的那种l果Q但你可以接受)(j)?

  EL问对象属性、集合元素、一l隐藏对象以?qing)用相关的、逻辑的和术的操作符提供?jin)支持。对于烦(ch)引的属性来_(d)包括数组和java.util.Listcd内,元素可用下列语法讉KQ?

${alist[4]}
${aList[someVariable]}

  JavaBean属性和java.util.Map元素Q它代表一pd名字/值对Q都可以使用下列Ҏ(gu)的一个访问得到。在以下的开头两个表辑ּ里,我们可以讉KC个用JavaBean语言命名为aProperty的属性或者用关键字aProperty讉KC个Map实体。在W三个表辑ּ中(注意Q我已经省略?jin)引P(j)Q我们用保存在变量aVariableContainingPropertyName中的一个名字访问了(jin)在anObject之内的一个元?

${anObject.aProperty}
${anObject["aPropertyName"]}
${anObject[aVariableContainingPropertyName]}

  在EL中定义了(jin)许多隐藏变量Q?
  ?pageContextQ用于该|页的pageContext对象
  ?pageScope, requestScope, sessionScope, ?applicationScopeQ这些是映射q些范围的每一个变量到g的Map集?
  ?param ?paramValuesQ用访问传递的参数Q与在JSP中一?
  ?header ?headerValuesQ用请求传递的_(d)与在JSP中一?
  ?cookieQMap映射cookieE序到特定的cookie对象?

  EL定义?jin)全套与你在Java中非常熟(zhn)的那些完全对应的操作符。算法操作符包括+?-?*?/ (?div)?? (?mod)。相关的操作W包?=、!=?lt;?gt;?lt;=?gt;=Q它分别对应于eq、ne、lt、gt、le、和ge。我不想详细阐述q些操作W,因ؓ(f)他们都能自我说明?

  JSTL标记?/font>
  x(chng)Q我已经解释?jin)一些基本原理ƈ且涵盖了(jin)EL语法。我要专门讨论四UJSTL标记库。我主要讨论核心(j)库,因ؓ(f)它是你一定要使用的;但是Q我也会(x)详细的讨论其余几个,以便你能启动它?

  首先Q尽我应该更多地谈论JSTL标记库的两种风格Q我上面提到的每个JSTL标记库以两个版本出现Q一个支持用EL的表辑ּQ另一个支持标准JSP表达式。当你引入Q何标记库C个JSP|Q你要定义一个前~Q该前缀指定?jin)与库中标记相对应的命名I间?

  四种标准标记库,和他们的JSTL规范定义的前~常规Q列表如下。记住:(x)你可以定义自q前缀Q但是这l对没有什么好处?/p>

四种标准标记?br />

  Z(jin)使用中的核?j)标记库Q?实际上,你你的对标记库的命名I间可见Q,在你的页首包含下列例子中的指令:(x)

<%@ taglib prefix="c" uri=http://java.sun.com/jstl/core %>

  Z(jin)使用该标记库的标讎ͼ用你在你的包含语句中设计好的前缀Q在你的中l每个标记加上前~Q?

<c:out value="${anExpression}"/>

  核心(j)数据?/font>

  让我们更详细的测试核?j)数据库Q先看看他最通用的功能?

  昄/讑֮值和异常处理

  核心(j)库的最基本的标记是c:out标记Q它在页中显CZ个EL表达式的倹{一个用c:out的表辑ּ通常是这P(x)

We have <c:out value="${applicationScope.product.inventoryCount}" 
escapeXml="true" default="0"  /> of those items in stock.

  上例中,value属性是我们送到输出的表达式。我也说明了(jin)选项escapeXml的属性和默认属性。escapeXml的属性指定了(jin)XML字符(<?gt;?&??.)是否应该转化为相应的字符实体代码Q这样他们可以让q些字符出现在一个HTML中Q;默认属性用于EL不能估算出数值或者数D出来ؓ(f)I的情况?

  注意Q当EL支持完全贯穿整个JSP2.0的时候,你不需要用c:out动作Q你可以仅嵌套JSP表达式直接在中?

  另一个普遍用的核心(j)动作是c:setQ它在页中设定一个变量。你可以用两U方法用c:set动作Q第一U方法设定在var属性中定义的变量到在value属性中定义的gQ方法如下:(x)

<c:set var="customerID" value="$param:customerNumber" scope="session" />

  上述的选择scope属性指定了(jin)我们要在?x)话期范围内讑֮变量customerIDQ如果范围没有制定,范围默认为页?

  c:set另一个强大的用途就是将c:set标记的体的内容赋l一个指定的变量Q?

<c:set var="cellContents">
<td>
<c:out value="${myCell}"/>
</td>
</c:set>

  在上例中Qc:set动作定义?jin)名为cellContentsQ在늚范围内)(j)的变量,该变量拥有在标记的体中定义的内容。在q种情况下,体定义了(jin)一个HTML表格单元格元素,计算体中的c:out动作Qƈ且该计算的结果包括在体中的字W串直接量倹{?

  像你预想的那样QJSTLq行异常处理有点早。在典型的JSP中Q你有两U异常处理的Ҏ(gu)Q试?捕捉直接嵌入到页中的脚本代码中的块Q或者用一个JSP errorPage指o(h)。JSP errorPage指o(h)提供一个良好的捕捉所有异常的Ҏ(gu)来处理页中Q何可能的异常。JSTL用一个c:catch动作提供一个好的可选择的方式。这个c:catch动作提供一个更l粒度的有效Ҏ(gu)来处理异常。而且没有嵌入Java代码到页中。一个c:catch动作是这L(fng)Q?

<c:catch>
 <!--. . . some set of nested JSTL tags below which would be hit on an exception-->
</c:catch>

  c:catch动作有一个可选的属性,即一个指向抛出异常的变量?

  你可能不怎么愿意使用c:remove标记。这个标记有用于变量名和范围的属性,q且可从指定的范围内删除指定的变量?

  程控制
  让我们{论JSTL的流E控制和条g标记。如果你已经用Q何一U语a使用?jin)条件和程控制语句Q理Zq里没什么新鲜的东西?

  c:if动作处理单条件语句的试。计测试属性中的Boolean表达式的|如果表达式ؓ(f)真的话,计算体的内容。在下面的动作中Q我们也说明?jin)备选项var属性。ؓ(f)?jin)以后的使用Qvar属性保存测试结果在(如果没有指定其他scope属性的话)(j)中?/p>

<c:if test="${status.totalVisits == 1000000}" var="visits">
   You are the millionth visitor to our site!  Congratulations!
</c:if>

  下面我们展示?jin)用c:choose?c:when??c:otherwise交换逻辑的JSTL的支持。一lc:when动作可能包括在一个备选的标记内,如果在c:when块中M表达式计gؓ(f)真的话,׃用计c:choose动作内的试。如果c:when块中没有一个测试计gؓ(f)真的时候:(x)如果出现c:otherwise动作内容Ӟ则计c:otherwise动作的内容:(x)

<c:choose>
<c:when test="${item.type == 'book'}">
...
</c:when>
<c:when test="${item.type == 'electronics'}">
...
</c:when>
<c:when test="${item.type == 'toy'}">
...
</c:when>
<c:otherwise>
...
</c:otherwise>
</c:choose>

  c:foreach动作提供一个容易的Ҏ(gu)来P代一个集合的元素。如果你惛_q代集合的一部分的话Q你可以分别用begin?end??step属性指定v炏V终点和一个递增倹{在下面的例子中Q我们在变量customerNames中P代一个集合的内容Q在每个循环中,下一个元素输入到变量名内q在c:foreach动作的体内计:(x)

<table>
<c:forEach var="name" items="${customerNames}">
<tr><td><c:out value="${name}"/></td></tr>
</c:forEach>
</table>

   记得Java的StringTokenizercdQ有?jin)c:forTokens动作Q你可以用JSTL获得cM的功能。这个程序片断可使用在delims属性中定义的定界符通过items String属性中的条目P代。注意,items 属性不必是一个字W直接量Q它可以是Q何有效的EL表达?

<table>
<c:forTokens items="47,52,53,55,46,22,16,2" delim="," var="dailyPrice">
<tr><td><c:out value="${dailyPrice}"/></td></tr>
</c:forTokens>
</table>

  在接下来的完整的JSTL中Q我列出?jin)已l传递到该页的所有参数。param 和paramValues对象是映关键字C个或多个值的Java Map集。在本例中,我们扑և?jin)用于集合的每个MapEntry的关键字卛_数名Qƈ且用关键字来查找所有与关键字关联的参数|(x)

<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<html>
<body>
<head>
<title>Parameter Listing Example</title>
</head>
<br>
<b>Parameter values passed to this page for each parameter: </b>
<table border="2">
<c:forEach var="current" items="${param}">
    <tr>
    <td>
    <b><c:out value="${current.key}" /></b>
    </td>
    <c:forEach var="aVal" items="${paramValues[current.key]}">
     <td>
     <c:out value="${aVal}" />
      </td>
   </c:forEach>
  </tr>
</c:forEach>
</table>
</body>
</html>
其他动作
  我们也需要讨Z些其他重要的核心(j)标记库动作。在|页实现中一个潜在的问题范围与URL~码有关。没有URL~码Q在|页中传递的URL的某个字W如I格Q可能会(x)qhWeb服务器。URL~码保q些Ҏ(gu)的字W用不引赯惑的字符代替。下列例子在变量myUrl中定义了(jin)一个URL,该变量myUrl׃个URL和一pd参数l成。URL动作Q注意,q里只在JSTL意义上的动作Q保证所有字W都正确的编?

<c:url value="http://acme.com/exec/register" var="myUrl">
<c:param name="name" value="${param.name}"/>
<c:param name="country" value="${param.country}"/>
</c:url>
<a href='<c:out value="${myUrl}"/>'>Register</a>

  在上面的代码中,param动作单的定义?jin)一l名值对?

  JSP允许设计者用 <JSP:INCLUDE></JSP:INCLUDE>

  <JSP:INCLUDE>指o(h)包括其他늚内容。JSTL用JSTL c:import动作扩展?jin)这个概c(din)c:import的主要优势是Q你能指定一个Q意的URLQ也可以包含你的Web应用之外QW3C的Q何地方)(j)的页的内Ҏ(gu)者你的服务器上的另一个Web应用内的늚内容?

  对于一l与HTTP相关的标记来_(d)没有一个方法处理HTTP重定向是不完整的。JSTL用c:redirect动作支持它?

  国际化标记库

  在讨Z(jin)JSTL支持国际化中Q我假设你已l有?jin)对下列主题的合理的理解Q?

  ●资源包和Java如何扑ֈ它们
  ●Localec?
  ●资源包查找和MessageFormatc?
  ●局部编码以?qing)它与Java国际化的关系
  ●Java文本和数据格式化

  如果你需要这些主题的更多的信息,请阅读Resources (http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl-p4.html#resources#resources)上的参考部分与国际化有关的参考文章?

  我在下面的两个部分讨Z(jin)国际化标记库。在W一部分Q我包括?jin)你可能使用的格式化和解释相关的动作Q它最初对应于java.text装包中的类Q,管你没有开发过完全的国际化应用E序Q可能你也要用到它。在W二部分Q我说明?jin)更针对于国际化的动作?

  如果存在一个远E的可能性,你的应用E序?x)在你本国之外用。如果你从一开始就建立在国际化的支持上Q那么开发就?x)更加容易。无Z使用何种Ҏ(gu)来开发,即像JSTL一样容易用的Ҏ(gu)Q一开始徏立在国际化支持上也是十分有益的?

  格式标记库:(x)格式动作
  如果你已l用了(jin)Java?DateFormat 和NumberFormatc,在下面的标记中用的Ҏ(gu)应该看v来眼熟,因ؓ(f)JSTL格式化动作是在这些类之上建立的。这些JavacL遍提供一个format( )函数Q它?yu)一个Javacd转化Z个格式化的String和创建对应于该String的Java对象?

  fmt:formatNumber动作有一个value属性和一个pattern属性。value属性是一个与我们看到的其它value属性类似的EL表达式或者变量。pattern属性与在NumberFormatcM定义的模式一栗下列动作发送一个格式化的String到JSP늚输出上:(x)

<fmt:formatNumber value="1000.001" pattern="#,#00.0#"/>


  在这个fmt:formatNumber动作里,我们使用?jin)type属性来指定Q格式化我们需要格式化的gؓ(f)一个货币倹{我们保存格式化的结果在一个变量名为dollars中。在一个美国的localecMQ下面的E序生成一个字W串$3456.79Q注意,它将使用的货币值四舍五入了(jin)Q:(x)

<fmt:formatNumber value="3456.789" type="currency" var="dollars"/>


  用于上面的type属性的可能值包括currency?number?和percent?

  在例中,我们使用?jin)另一U方法——用了(jin)一个包括在value属性中的一个格式化的域QcurrencyQ每type属性)(j)的一个文本字W串。ƈ且解析它来获取一个数字。结果储存在由var属性指定的一个变量内。尽这个属性是可选的Q还是会(x)l常使用它。另外,解析的值送到输ZQ?/p>
<fmt:parseNumber value="${currencyInput}" type="currency"
 var="parsedNumber"/>
fmt:formatDate动作有一个value属性、一个format属性?
一个指向处理格式化的格式类的属性(典型的,如java.util.DateQ:(x)
<jsp:useBean id="now" class="java.util.Date" />
<fmt:formatDate value="${now}" timeStyle="long"
dateStyle="long"/>

  像数字格式化一PJSTL|供一个机制来解析一个代表日期的、进入Date对象的字W串Q?

<fmt:parseDate value="${dateInput}" pattern="MM dd, YYYY" />

  查看java.util.DateFormatc,?jin)解如何处理格式化和模式的更多详l的资料?

  格式标记库:(x)国际化动?/font>
  Java本地化的一个关键点是ResourceBundlecRJSTL动作允许你用q个cȝ单的工作。这个例子用了(jin)fmt:bundle动作来得C当前Locale ?fmt:message动作对应的一个ResourceBundle动作Q从而查看该资源包中的本地化的字W串Q?

<fmt:bundle basename="myBundle">
<%-- Use values in myBundle --%>
<fmt:message key="Introduction">
   <fmt:param value="${loginName}"/>
   <fmt:param value="${loginCount}"/>
</fmt:message>
<fmt:formatDate value="${now}" var="parsedDate"/>
</fmt:bundle>

  l常Qfmt:message动作单的查看?jin)对应于一个关键词的字W串。在上面的例子中Q在ResourceBundle中的字符串包含了(jin)取代两个值的占位W。这些值在fmt:param动作中定义过Q这像Java MessageFormatcM用的Ҏ(gu)?

  有一些类似的动作可指定一个时区,时区可应用到在标记的体中计算的Q何事上:(x)

<fmt:timeZone value="someTimeZone">
<!-- actions in this context will be evaluated using someTimeZone  -->
</fmt:timeZone>

  上述的fmt:bundle ?fmt:timeZone动作有分别对应的fmt:setBundle和fmt:setTimeZone的动作。这些动作添加了(jin)可选的scope属性;因此Q你可以使用q些动作在Q何等同于应用范围的范围内讑֮一个资源捆l或者一个时区?

  如果你用非欧z的localecd作的话,你可能得担心(j)~码的问题,JSTL支持用fmt:requestEncoding动作~码?

  SQL标记?/font>

  JSTL 允许Ҏ(gu)的数据库的集成。但是,值得注意的是Q沙׃外的JSTL的执行有一些限制。主要的问题?sh)连接池有关。徏立ƈl护到数据库的连接是很消耗资源的。JSTL SQL动作使得许多数据库连接徏立v来,通常的,每个用户臛_有一个。因此,JSTL SQL标记对于原型开发的或低定w的、基于Web的应用程序意义重大。但是它不适合于大规模的应用程序。一个可~放的品应用程序一般是在一个页面内处理数据库访问如隐藏数据库访问和处理像连接池之类的细节。但是,q是有方法允怽实现q接池和用一点自定义码来使用JSTL SQL动作Q请看:(x)"JSTL 1.0: What JSP Applications Need, Part 2" in Resources Qhttp://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl-p5.html#resources#resources).

  我们看一些简单的例子。这些例子用来自SQL库的JSTL标记。如果你熟?zhn)SQL基础的话Q你应该能够改编q些例子用在你的应用E序上?

  在下面的E序片断中,我们建立?jin)一条到一个数据库的连接,选择一l匹配一个订单ID的订单项目,q且在一个表g昄item属性:(x)

<sql:setDataSource
      driver="com.cheapDrivers.jdbcDriver"
      url="jdbc:cheapDrivers:."
      user="guest"
      password="password"
      var="dataSource" />

<sql:query var="orderItems" dataSource="${dataSource}">
SELECT * FROM items
WHERE order_id = <cout value="${orderID}"/> 
ORDER BY price
</sql:query>
<table>
<c:forEach var="row" items="${orderItems.rows}">
<tr>
<td><c:out value="${row.itemName}"/></td>
<td><c:out value="${row.price}"/></td>
<td><c:out value="${row.weight}"/></td>
</tr>
</c:forEach>
</table>

  在下一个例子中Q我?x)说明JSTL是如何支持数据库事务的,在数据库中,许多包含对表格多个改动的操作必须是对所有的Q或者什么也不做Q如果出C个问题时Q改动必Mؓ(f)I操作。在下面例子中,sql:update动作包含在一个sql:transaction动作内,如果在事务处理过E中Q存在Q何SQL错误的话Q在事务范围内执行的所有操作都得重来?

  sql:update动作的命名有一点误|(x)除了(jin)SQL UPDATE外,sql:update也支持INSERT ?DELETEQ甚x(chng)SQL CREATE。实际上Q它支持不生结果的M一条SQL操作。在下面的例子中Qsql:update通过插入变量值到一个PreparedStatement中来执行一个UPDATE动作。在q个代码片断中,我们在两个̎户之间传送钱Q需要预先包装在一个事务中的某些东西的一个经典的例子Q:(x)

<sql:transaction dataSource="${dataSource}">
<sql:update>
UPDATE account
SET account_balance =account_balance -?
WHERE accountNo = ?
<sql:param value="${transferAmount}"/>
<sql:param value="${sourceAccount}"/>
</sql:update>
<sql:update>
UPDATE account
SET account_balance =account_balance +?
WHERE accountNo = ?
<sql:param value="${transferAmount}"/>
<sql:param value="${destAccount}"/>
</sql:update>
</sql:transaction>

  XML标记?/font>
  使用标准的XML标记库,你所能做的完整的处理Q特别是可扩展性单一语言变换说明QXSLTQ的处理Q对于另一文章来说是一个很好的主题。下面我?x)涵盖够的让你开始的知识?

  在JSTL的XML支持遵@XPath规范。XPath的重要功能之一是ؓ(f)讉KXML著名的分层的信息提供一个清晰的语法。也许看到每件是如何工作的最Ҏ(gu)的方法就是看看我们如何用来自于一个真实JSTL늚一个片断里的标讎ͼ(x)

!-- Find and parse our XML document (somewhere on the WWW) -->
<c:import url="http://www.cheapstuff.com/orderStatus?id=2435" var="xml"/>
<x:parse xml="${xml}" var="doc"/>
<!-- access XML data via XPath expressions -->
<x:out select="$doc/name"/>
<x:out select="$doc/shippingAddress"/>
<x:out select="$doc/deliveryDate"/>
<!-- Set a scoped variable -->
<x:set var="custName" scope="request" select="$doc/name"/>

  在上面的输入和解析动作中Q我们装载和解析?jin)一个指定的XML文档C个变量doc里。在上面的每个x:out动作中,我们使用?jin)一个XPath表达式访问了(jin)解析的XML文档的元素,q且发送结果到JSP输Z?

  上面的设|表辑ּ计算?jin)一个XPath表达式ƈ且将l果输入C个限定范围的变量里(在上qC子中Q它指在一个请求范围内Q?

  x:out 和x:set动作可以输出一个JspTagException。如果他们没有成功的话(极有可能因ؓ(f)XPath表达式指向ƈ不存在的标记Q,你的,像在所有其他情况下一P应该的处理这些异常(要么通过传统的JSP errorPage指o(h)Q要么用JSTL的c:catch动作Q,

  JSTLҎ(gu)处理XSLT转换。在下面的示范页中,我们使用来自XML标记库中的x:transform动作Q用一个XSLT stylesheet创徏一个来自于XML源文档的一个格式化的页。x:transform动作最重要的属性是XML和XSLT属性,在下面的例子中,我们讄?jin)一个来自于我们在同一初始化的变量的xslt属性;我们也在动作的体中设|了(jin)XML属性。该动作默认为x:transform动作?

  默认的,转换的结果送到输ZQ你也可以保存结果到一个带x:var属性的变量内:(x)

<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/xml" prefix="x" %>
<c:set var="xsltSource"> 
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
      <xsl:apply-templates/>
</xsl:template>
<xsl:template match="music">
<html>
<head></head>
<body marginheight="0" marginwidth="0" topmargin="0" leftmargin="0">
<table cellpadding="0" cellspacing="0" border="1" bgcolor="#ffffff">
      <tr>
      <td><STRONG>Artist</STRONG></td>
      <td><STRONG>Album</STRONG></td>
      <td><STRONG>Year</STRONG></td>
      <td><STRONG>Genre</STRONG></td>
      </tr>
      <!---Set up for loop to collect all the artist information //-->
      <!-- <xsl:for-each select="./*[name()='artists']"> -->
      <xsl:for-each select="artists">
        <tr>
          <td><xsl:value-of select="artist"/></td>
          <td><xsl:value-of select="album"/></td>
          <td><xsl:value-of select="year"/></td>
         <td><xsl:value-of select="genre"/></td>
        </tr>
     </xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
</c:set> 
<x:transform xslt="${xsltSource}" >
<music>
<artists>
    <artist>Jonny B</artist>
    <album>Feedback and Distortion</album>
    <year>2001</year>
     <genre>Rock</genre>
      </artists> 
     <artists>
      <artist>Harmony's Nieces</artist>
      <album>Sappy Pop Ballads</album>
      <year>2002</year>
      <genre>Pop</genre>
      </artists> 
</music>
</x:transform>

  你也能用c:import动作再定义一个额外的源文档和stylesheetQ就好像在这个示范的代码片断展示的一P(x)Q?

<c:import var="${xmlSource}" url="${someDocumentURL}" />
<c:import var="${xsltSource}" url="${anotherDocumentURL}" />
<x:transform xml="${xmlSource}" xslt="${xsltSource}" >

  l束?/font>
  x(chng)Q你应该对JSTL、它的四U标准标记库、和它如何ɾ|页开发更为容?有了(jin)很好的理解。现在你开始写一些JSTL!

  ?b>关于作?/b>?
  Steve Small从事Java开发多q_(d)一直处于技术领导层和开发位|上。他先后为Boeing?Amazon.com工作q,目前在沃什湾西雅图的PictureIQ公司供职。从1998qvQ在华盛大学兼职开发和教学Java评?a >http://www.javaworld.com/feedback

]]>
FOP的一些资?/title><link>http://m.tkk7.com/sharkafeng/archive/2006/07/24/59744.html</link><dc:creator>The Spark of Thinking</dc:creator><author>The Spark of Thinking</author><pubDate>Mon, 24 Jul 2006 02:07:00 GMT</pubDate><guid>http://m.tkk7.com/sharkafeng/archive/2006/07/24/59744.html</guid><wfw:comment>http://m.tkk7.com/sharkafeng/comments/59744.html</wfw:comment><comments>http://m.tkk7.com/sharkafeng/archive/2006/07/24/59744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/sharkafeng/comments/commentRss/59744.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/sharkafeng/services/trackbacks/59744.html</trackback:ping><description><![CDATA[ <p>blog:<br /><a >http://www.cnblogs.com/sunsonbaby/archive/2004/12/18/78764.html</a><br /><a >http://www.cublog.cn/opera/showart.php?blogid=4200&id=31762</a><br /><a >http://xmlgraphics.apache.org/fop/0.20.5/embedding.html#ExampleFO2PDF</a></p> <img src ="http://m.tkk7.com/sharkafeng/aggbug/59744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/sharkafeng/" target="_blank">The Spark of Thinking</a> 2006-07-24 10:07 <a href="http://m.tkk7.com/sharkafeng/archive/2006/07/24/59744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>发现两个商业软g开发管理?JIRA & Concluencehttp://m.tkk7.com/sharkafeng/archive/2006/07/21/59466.htmlThe Spark of ThinkingThe Spark of ThinkingFri, 21 Jul 2006 09:50:00 GMThttp://m.tkk7.com/sharkafeng/archive/2006/07/21/59466.htmlhttp://m.tkk7.com/sharkafeng/comments/59466.htmlhttp://m.tkk7.com/sharkafeng/archive/2006/07/21/59466.html#Feedback0http://m.tkk7.com/sharkafeng/comments/commentRss/59466.htmlhttp://m.tkk7.com/sharkafeng/services/trackbacks/59466.html Atlassian Confluence (tng)Q对企业和团队来讲是不错的知识管理工P界面漂亮Q功能强大,支持PDF.XML HTML输出Q用L(fng)理支持LDAPQ虽然是商业软gQ但是对开源项目是免费使用的。支持一?br />截几张图片:(x)


后台理界面Q?br />


JIRA:
JIRA是一个优U的问?or bugs,task,improvement,new feature )跟踪?qing)管理Y?/strong>?br />它由Atlassian开发,采用J2EE技?它正被广泛的开源Y件组l,以及(qing)全球著名的Y件公怋用,它堪U是J2EE的Bugzilla?br />

一些开发项目组或者IT公司有这个需求的Q可以试用一?/p>

]]>
վ֩ģ壺 91Ƶַ| Ļѹۿ| ޾ƷۺϾþþþý| 뿴avվ| һƵۿ| þ޾ƷĻ| ݹѾþþ91| ŮƵѹۿվ | ͵͵߶̬ͼ | Ƭѹۿ92ƵƵ| þþƷAV鶹 | þúݺݰۺӰԺ| AV˾Ʒպһ18p| ɫè˳վ߹ۿ| ɫվwwwͬ | ޾ƷƬ߲| Ƶѹۿ| Ƭѹۿȫ| ޿ƬƵ| ˳˳ۺþþ| ŷÿѵӰ߹ۿ| ˳Ƶ69| þ䰮| ޾ƷѹۿƵ| ޾Ʒר߹ۿ| ëƬ߹ۿվ| þóѲ| ѺܻڵƵëƬ| ޵һҳƵ| þþ޹| Ʒҹѹۿ| ˾ƷƵ | ߹ۿİ | aëƬ| Ʒ޾ƷպӰ| ޹ƷۺϾþ| ޳AVƬһ| ޳˾þ| һƬ| ҹѲëƬ| 40ձ|