كتابخانه تگ JSP  توسعه صفحات وب را تسهيل مىنمايد

 

JSTL براى پياده سازى آسانتر صفحات وب

 

نويسنده : Steve Small

مترجم : شهناز پيروزفر

 

چكيده: انتشارJSTL (JSP Standard Tag Library)  توسعه مهمى براى توسعه دهندگانJSP/servlet  به شمار مىرود. JSTL  با كمك EL (expression language) و مجموعه‌اى از چهار كتابخانه تگ استاندارد توانا به شيوه‌اى براى پياده سازى وب سايتهاى پوياى مبتنى بر جاوا تبديل خواهد شد.

معرفى Java servlet  در سال 1996 جاوا را به گزينه موجهى براى توسعه صفحه وب پويا تبديل نمود. ظهور JSP (Java Server Pages) و متعاقب آن پشتيبانى از تگ‌‌‌‌‌‌‌‌‌‌هاىJSP  گامهاى بعدى در پياده سازى صفحات وب جاوا بودند. اما در اواسط سال 2002 انتشارJSTL (JSP Standard Tag Library)  گام مهمى در سرعت بخشيدن و ساده سازى فرايند توسعه محسوب مىشد.

 

در اين مقاله توانمندى ها و نحوه كار باJSTL  مورد بررسى قرار گرفته است. فرض بر اين است كه شما با Java، JSP، XML  و تنظيم كانتينر وب آشنايى داريد.

 

 

نصب پشتيبان JSTL

ما از Tomcat 4.1  براى مثال نصب JSTL  استفاده مىكنيم. ابتدا Tomcat  را download  نموده و دستورعملهاى تنظيم را تعقيب نماييد. (تذكر:JSTL  به كانتينر JSP 1.2  نياز دارد).

 

Tomcat را با tomcat 4 start آغاز نموده و صفحه index.html را بارگذارى نماييد.اينك بايد پشتيبان JSTL  را نصب كنيد. شما مىتوانيد JSTL Support را از سايت وب Jakarta بر اساس مراحل زير دريافت نماييد.

 

1-     download  نمودن JSTL archive  از سايت .Jakarta فايل را unzip كنيد.

2-     فايل هاى Jar  را كه از common/lib استخراج نموديد، در نصب Tomcat  كپى كنيد. (گر چه در اين پروژه به همه فايلهاى jar نياز نداريد). بدين ترتيب فايلهاى JSTL jar براى هر گونه برنامه كاربردى وب، در دسترس خواهد بود.

3-     فايلهاى .tld را درهر برنامه كاربردى كه از JSTL استفاده مىكند، در دايركتورى WEB-INF در برنامه كاربردى وب، كپى كنيد.

4-     فايل Web.XML را براى برنامه كاربردى وب JSTL ويرايش نموده و ورودى هاى ذيل را به آن بيفزاييد:

  <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>

 

ورودى هاى فوق به برنامه كاربردى وب امكان مىدهند تا از نسخه هاى EL كتابخانه هاي تگ JSTL استفاده نمايند. موقعيت اين وروديها، مهم است! اگر نمىتوانيد آنهارا كجا قرار دهيد، از گزينه هاى web.xml و (document type definition) DTD در نشانى : http://java.sun.com/j2ee/dtds/web-app2 2.dtd استفاده نماييد.

 

5-     پس از ساخت صفحه JSP كه از JSTL استفاده مىكند. آن را در دايركتورى اصلى برنامه كاربردى وب تان قرار دهيد. گستره نام اين صفحه بايد .JSP باشد.

 

 

اصول

اول، همه صفحات JSTL ، صفحات JSP نيز هستند . JSTL از نظر عملكرد مجموعه اصلى JSP است.

همه تگ هاى JSTL، XML  مجاز مىباشند. به عبارتى اگر از متن صفحه در خارج از تگ هاى JSTL  به عنوان متن template ( كه معمولا HTML است) استفاده نماييد، بقيه تگ هاى JSTL بايد به عنوان XML مجاز Parse شوند.

JSTL مجموعه اى از چهار كتابخانه تگ استاندارد (SQL, XML, internationalization/format, core) را فراهم مىآورد و از EL پشتيبانى مىكند. هدف اصلى طراحى JSTL و EL تسهيل توسعه پياده سازى صفحه وب بود.

در اين مقاله از قرار داد نامگذارى مشخصه JSTL پيروى مىكنيم و تگ هاى JSTL را به عنوان actions مورد بررسى قرار مىدهيم. تگ JSTL مرتبط با بعضى از Saction، رفتار پويا به صفحه ايستا مىافزايند. كتابخانه تگ JSTL در دو نسخه است ، نسخه اول به شما امكان مىدهد تا به عبارات استاندارد JSP نظير <%=…%> متصل شويد و نسخه دوم از JSTL EL استفاده مىكند.

 

 

پشتيبان EL

 براى درك وضعيت فعلى پشتيبانى از EL در JSTL ، اجازه دهيد كه نحوه كار با مشخصه هاى مربوطه را آزمايش كنيم. بر اساس تصميم اعضا گروه JSR (Java Specification Request) ، مشخصه EL بايد بخشى از مشخصه JSP باشد، نه JSTL. مشخصه كامل EL بخشى از مشخصه JSP 2.0 خواهد بود. از آنجاييكه JSTL 1.0 پيش از JSTL 1.3 به پايان رسيد، نويسندگان JSTL مجبور بودند براى پياده سازى پشتيبان EL براى JSTL 1.0 از حدس زدگان استفاده نمايند. نسخه نگهدارى JSTL به همراه مشخصه JSP 1.3 ، حاوى هر گونه tweak به منظور ايجاد سازگارى با مشخصه نهايى JSP 1.3 بود.

EL زبان قدرتمندى را براى توضيح عبارات به نحوى كه به سهولت قابل يادگيرى باشد، تعريف مىكند. عبارات EL درتركيب با تگهاى JSTL از چهار كتابخانه استاندارد، مجموعه منعطف و بزرگى را فراهم مىآورد.

همه عبارات EL با ${} محصور مىگردند. همواره عبارات  در  JSTL بخشى از مقادير صفت در تگهاى JSTL هستند. شايد عبارات فقط بخشى از صفت باشند يا تركيب شوند. صفات JSTL نيز ممكن است حاوى رشته ساده باشد. در JSTL زير هر يك از اين موارد را در C:out action نشان داده ايم:

 

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

 

EL  مجموعه‌اى از قوانين را تعريف مىكند كه به كمك اين قوانين، مقادير عبارت به نوعى كه مرتبط با مورد استفاده مقادير باشد، تخصيص مىيابد. ما به تفصيل اين قوانين را توضيح نمىدهيم، با اين وجود روش كار بسيار مشابه با روش كار تعريف شده در Perl است.

EL از دستيابى به ويژگىهاى آبجكت و عناصر Collection و اپراتورهاى رابطه اى ، منطقى و رياضى پشتيبانى ميكند. عناصر براى آرايه ها و كلاسهاى java-util.List از طريق دستور زير قابل دستيباى است:

 

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

ويژگىهاى JavaBean و عناصر java.util.map ، با كمك يكى از روشهاى زير قابل دستيابى است. ما در دو عبارت اول زير مىتوانيم به ويژگى به نام  aProperty در JavaBean يا ورودي Map با كليد aProperty دسترسى پيدا كنيم. در عبارت سوم به عنصر anObject با نام موجود در متغيير avariable Containing Property Name دسترسى خواهيم داشت:

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

 

برخى متغييرهاى ضمنى در EL تعريف شده اند:

·      pageContext : آبجكت pageContext براى آن صفحه وب

·      pageScope، requestScope و applicationScope، collection هاى Map هستند كه اسامى متغيير را در هر يك از اين Scopeها نگاشت مىكنند.

·      param و paramValues ، پارامترهايى كه با درخواست صفحه عبور داده مىشوند ، همانند آنچه در JSP است.

·      header و headerValues، headerها با درخواست صفحه عبور داده مىشوند.

·      Cookie، Map كه اسامى Cookie را به آبجكت Cookie خاصى نگاشت مىكند.

EL مجموعه كاملى از اپراتورهايى كه همانند اپراتورهاى جاوا هستند، تعريف مىكند.  اپراتورهاى محاسباتى عبارتند از + ، - ، * ، /  (يا div) و % ) يا mod) اپراتورهاى رابطه اى عبارتند از : = = ، =! ‌، < ، > ، <= ، => كه به ترتيب با cq، ne، lt، gt، le، و ge معادلند.

 

 

كتابخانه هاى تگ JSTL

اينك به طور اخص به بررسى چهار كتابخانه تگ JSTL مىپردازم.

ابتدا درباره دو نسخه كتابخانه تگ JSTL بيشتر صحبت مىكنم. همانگونه كه در فوق اشاره شد، هر كتابخانه تگ JSTL در دو نسخه است، نسخه‌اى كه از عبارات در EL پشتيبانى مىكند و نسخه‌اى كه از عبارات استاندارد JSP پشتيبانى مىكند. وقتى كتابخانه تگ را در صفحه JSP مىفرستيد، بايد پيشوندى را تعريف كنيد كه namespace مربوط به تگها را در كتابخانه تعيين نمايد.

چها ركتابخانه استاندارد به همراه پيشوندهاى تعريف شده ويژه JSTL در ذيل آمده است. شما مىتوانيد پيشوندهاى ديگرى نيز تعريف نماييد، اما اينكار توصيه نمىشود.

 

 

چهار كتابخانه تگ استاندارد

Library

EL library prefix

Request-time (RT) library prefix

Core

c

c_rt

Internationalization/format

fmt

fmt_rt

SQL/DB support

sql

sql_rt

XML

x

x_rt

 

 

 

براى استفاده از كتابخانه تگ اصلىEL  در صفحه، مثال زير را در بالاى صفحه تان لحاظ نماييد:

 

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

 

براى استفاده از تگها در كتابخانه اصلى، هر تگ موجود در صفحه را با پيشوندى كه در عبارت تعيين نموديد، به كار ببريد:

 

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

 

 

 

كتابخانه تگ اصلى

ابتدا عملكردهاى اصلى اين كتابخانه را مورد بررسى قرار مىدهيم.

 

نمايش /تنظيم مقادير و سروكار داشتن با استثنائات

C:out مهمترين تگ كتابخانه اصلى است. اين تگ مقدار عبارت EL را در صفحه نشان مىدهد. يك عبارت نمونه كه از C:Out استفاده مىكند درذيل آمده است:

 

<c:out value="${applicationScope.product.inventoryCount}" escapeXml="true" default="0"  />

 

صفت value كه در فوق آمده، عبارتى است كه به خروجى صفحه مىفرستيم. صفت اختيارى escapxml كه كاراكترهاى XML (<، > ، & و .) را مشخص مىنمايد، بايد به كدهاى كاراكتر مربوطه تبديل شود. صفت default در صورتى به كار مىرود كه EL نتواند مقدار را ارزيابى كند.

توجه نماييد هنگاميكه پشتيبانى EL به طور كامل در JSP 2.0 پياده سازى مىشود، نيازى به استفاده از C:out نيست و مىتوانيد عبارات JSP را مستقيما در صفحه لحاظ نماييد.

Action اصلى ديگر، C:set است كه متغيير را در صفحه POST مىكند. به دو روش مىتوانيد از C:set استفاده كنيد. اولين روش، متغيير تعريف شده در صفت  Var را به متغيير تعريف شده در صفت Value، به صورت زير POST مىكند.

 

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

 

صفت Scope اختيارى فوق نشان مىدهد كه مىخواهيم متغير CustomerID را در حوزه Session پست كنيم، اگر حوزه (Scope) مشخص نيست، حوزه page به صورت پيش فرض در نظر گرفته مىشود.

C:set محتواى بدنه تگ C:set را به متغير مشخص شده انتساب مىكند.

 

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

 

C:set در مثال فوق، متغييرى را به نام Cellcontents (در pageScope) تعريف مىكند. اين متغيير محتويات تعريف شده در بدنه تگ را ذخيره مىسازد. در اين حالت بدنه، عنصر خانه جدول HTML را تعريف مىنمايد. C:out در بدنه ارزيابى مىشود و نتايج ارزيابى در بدنه به صورت رشته لحاظ مىگردد.

JSTL با استثنائات، كمى آسانتر برخورد مىكند. در صفحات واقعى JSP دو شيوه براى برخورد با استثنائات وجود دارد: try/catch بلوكها در كد Scriptlet كه مستقيما در صفحه جاسازى شده، يا استفاده از JSP error page.

C:catch گزينه مناسبى در اين زمينه است . يك C:catch مىتواند به صورت زير باشد:

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

 

 

C:catch صفت اختيارى ، متغييرى دارد كه به استثنا ارجاع داده ميشود.

تگ C:remove ، صفاتى براى نام و حوزه متغير دارد و متغير خاصى را از حوزه خاصى حذف مىكند.

 

 

 

كنترل جريان

اجازه دهيد به تگ هاى شرطى و كنترل جريان در JSTL بپردازيم.

C:if براى آزمايشات ساده شرطى به كار مىرود. مقدار عبارت Boolean در صفت آزمايش ارزيابى مىشود. اگر true باشد، محتويات بدنه ارزيابى مىگردند. در action زير، صفت Var اختيارى را كه نتايج آزمايش را براى استفاده بعدى ذخيره مىكند، نشان داده‌ايم:

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

پشتيبانيJSTL  براى سوئيچينگ منطق c:choose، c:when و c:otherwise در ذيل آمده است. مجموعه‌اى از c:when مىتواند با تگ choose لحاظ شود، اگر هيچيك از عبارات بلوكهاى c:when، true نباشند، محتويات C:otherwise ارزيابى مىگردند.

<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 راه ساده اى براى تكرار است. اگر بخواهيد بخشى از كلكسيون (Collection) را تكرار كنيد، مـىتوانيد شاخص هاى آغاز و پايان و مقدار افزايش را با صفات begin، end و step مشخص نماييد. در مثال زير، تكرار در محتويات كلكسوينى، در متغيير CustomerNames صورت گرفته است. در هر حلقه، عنصر بعدى در نام متغير قرار مىگيرد و در بدنه c:forEeach ارزيابى مىشود.

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

كلاس StringTokenizer جاوا را به ياد داريد؟ شما مىتوانيد با c:forTokens همان عملكرد را در JSTL پياده سازى نماييد. اين پراكندگى در آيتم هاى صفت itemsString با كمك صفت delims تكرار ميگردد. توجه نماييد كه صفت items ، ميتواند هر گونه عبارت مجاز 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 زير، همه پارامترهاى عبور داده شده به صفحه، فهرست شده است. آبجكتهاى ضمنى Param و ParamValues كلكسيونهاى Map جاوا هستند كه كليدها را به يك يا چند مقدار نگاشت مىكنند. كليد هر MapEntry در كلكسيون، نام پارامتر است و به كمك كليد همه مقادير پارا متر را جستجو مىكنيم.

 

<%@ 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>

 

ساير actionها:

actionهاى مهم ديگرى در كتابخانه تگ اصلى وجود دارد كه بايد مورد بررسى قرار گيرند. يكى از مشكلات بالقوه در پياده سازى صفحه وب، كدينگ URL است. كاراكترهاى خاص در URLها نظير Space كه بين صفحات وب در گذر هستند، بدون كدينگ URL، سرورهاى وب را سردر گم مىنمايند. كدينگ URL، كاراكترهاى مناسبى را جايگزين اين كاراكتر مىنمايد.

مثال زير URL را متغير myurl تعريف ميكند. اين متغير از URL و مجموعه اى پارامتر تشكيل شده است. URLaction از كد گذارى صحيح همه كاراكترها اطمينان حاصل ميكند.

 

<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 در كد فوق، مجموعه اى از زوج نام / مقدار را تعريف مىكند.

 

JSP به طراحان صفحه امكان مىدهد تا محتوى ساير صفحات را با <JSP:include> لحاظ نمايند. JSTL اين مفهوم را با JSTL C:import بسط مىدهد. مهمترين مزيت C:import اين است كه شما مىتوانيد URL دلخواهى را مشخص نموده و محتواى صفحع را خارج از برنامه  كاربردى وب يا با برنامه كاربردى وب ديگرى بر روى سرور لحاظ نماييد.

مجموعه‌اى از تگ هاى مربوط به HTTP بدون تغيير جهت HTTPكامل نخواهد شد.

JSTL با كمك C:redirect از تغيير جهت پشتيبانى مىكند.

 

 

كتابخانه تگ internationalization

 براى تشريح پشتيبانى JSTL از internationalization   بايد موضوعات زير را درك نماييد.

-     Resource bundles و نحوه يافتن آنها

-     كلاس Local

-     جستجوى Resource bundle و كلاس MessageFormat

-     كدينگ كاراكتر و رابطه آن با internationalization جاوا

-     فرمت تاريخ و متن جاوا

كتابخانه تگ internationalization در دو بخش زير آمده است. در بخش اول، actionهاى formatting و parsing (مربوط به كلاسهاى بسته java.text) لحاظ شده و در بخش دوم، actionها با توجه بيشتر به internationalization توضيح داده شده اند.

اگر برنامه كاربردى شما در خارج از كشورتان مورد استفاده قرار گيرد، بهتر است در ابتداى از internationalization بهره بگيريد.

 

 

كتابخانه تگ فرمت

اگر از كلاسهاى Data Format و numberFormat استفاده نموده‌ايد، شيوه به كار رفته در تگ هاى زير برايتان آشناست، زيرا action هاى فرمت JSTL، فوق اين كلاسها ساخته مىشوند. اين كلاسهاى عموما متد format() را فراهم مىآورند. متد مذكور، نوع جاوا را به string فرمت شده و متدparse()  تبديل مىكند. بدين ترتيب string، parse شده و آبجكت جاوا، مطابق با آن String ساخته مىشود.

Fmt: format Number ، صفت Value دارد. اين صفت الگوها را همانگونه كه در كلاسNumber Format تعريف شده‌اند، منعكس مىنمايد. Action زير string فرمت شده را به خروجى صفحه JSP مىفرستد.

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

 

صفت fmt:format Number مشخص مىكند كه مىخواهيم مقدار فرمت شده به صورت مقدار رايج باشد. نتايج فرمت شده در متغير dollars ذخيره مىگردد. در ايالات متحده ، رشته $3456.79 توليد مىشود:

 

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

 

مقادير احتمال براى صفت type فوق عبارتند از : Currency، number و Percent.

در اين مثال، كار خود را با رشته متنى حاوى فيلد Currency در هر صفت type) در صفت Value آغاز مىكنيم و Parse را براى به دست آوردن عدد انجام مىدهيم. نتيجه درمتغيرى كه با صفت Var مشخص شده، ذخيره مىشود . گرچه اين صفت اختيارى است اما معمولا از آن استفاده خواهيد نمود:

 

<fmt:parseNumber value="${currencyInput}" type="currency" var="parsedNumber"/>

 

Fmt:formatData حاوى صفت ، صفت format و صفتى است كه به كلاس فرمت اشاره دارد

 

<jsp:useBean id="now" class="java.util.Date" />
<fmt:formatDate value="${now}" timeStyle="long"
dateStyle="long"/>

 

JSTL مكانيزى را براى Parse رشته اى كه نمايانگر تاريخ در آبجكت Data است فراهم مىآورد.

 

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

 

براى كسب اطلاعات بيشتر در زمينه فرمت، به كلاس java.util.DataFormat مراجعه نماييد.

 

 

كتابخانه تگ فرمت:

 actionهاى internationalization بخش حساس Locatization جاوا، كلاس ResourceBundle است. Action هاى JSTL به شما امكان مىدهند تا به سادگى با اين كلاسها كار كنيد. اين مثال از fmt:bundle براى كسب Resource Bundle مربوط به Locale فعلى و actionهاى fmt:message براى جستجوى رشته هاى مستقر در resource bundle استفاده مىكند.

<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>

اغلب fmt:message براى جستجو رشته هاى مستفر در resource bundle استفاده مىكند.

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

 

اغلب fmt:message رشته مربوط به كليد را جستجو مىكند. رشته در Resource Bundle حاوى نگاهدارنده مكانى است كه دو مقدار در آن جايگزين  شده اند. اين مقادير در pmt:param ؟؟ مىشوند. اين روش همانند شيوه اى است كه كلاس Message Format جاوا به كار مىبرد.

Action مشابهى نيز براى مشخص نمودن time zone وجود دارد.  time zone براى هر آنچه در بدنه تگ ارزيابى مىشود، به كار مىرود.

 

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

Actionهاى fmt:bundle و fmt:time zone ، actionهاى مرتبط fmt:set bundle و fmt: set TimeZone را دارند. اين ation ها ، صفات اختيارى Scope را مى افزايند، لذا مىتوانيد از آنها براى ست نمودن resource bundle يا time zone استفاده نماييد.

اگر با مكانهاى غير اروپايى كار مىكنيد، بايد نگران كدينگ آن باشيد. JSTL با كمتر fmt:request Encoding از اينگونه كدينگ پشتيبانى مىكند.

 

 

كتابخانه  تگ SQL

JSTL امكان يكپارچه سازى آسان پايگاه داده ها را فراهم مىسازد. پياده سازى JSTL به صورت out-of-box محدوديتهايى دارد. برقرارى و تداوم ارتباط با پايگاه داده ها به منبع بستگى دارد. Action هاى JSTL SQL در برقرارى بسيارى از ارتباطات پايگاه داده ها نتيجه مىدهند. لذت تگ هاى JSTL SQL براى نمونه سازى يا برنامه هاى كاربردى مبتنى وب كوچك به كار مىروند، اما براى برنامه هاى كاربردى بزرگ مناسب نيستند. شيوه هايى وجود دارند كه به شما امكان مىدهند از action هاى JSTL SQL  استفاده نماييد. اينك مثالهاى ساده‌اى را كه از تگ هاى JSTL موجود در كتابخانه SQL استفاده مىكنند، مورد بررسى قرار مىدهيم.

در مثال زير ارتباطى را با پايگاه داده ها برقرار مجموعه اى از اقلام مرتب را به ترتيب ID انتخاب نموديم و صفات iem را در جدول نشان مىدهيم:

 

<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>

 

در مثال بعد، نحوه پشتبانى JSTL از ارتباطات پايگاه داده ها آمده است. در دنياى پايگاه داده ها، بسيارى از عمليات در ايجاد تغييرات در جداول دخالت دارند: اگر مشكلى پديد آيد، تغييرات بايد غير فعال شوند در مقال زير، SQL:up data در SQL:transaction لحاظ شده است. اگر هر گونه خطاى SQL رخ دهد، عمليات انجام شده در حوزه ارتباطى متوقف مىشوند.

 

SQL:update علاوه بر UPDATE از INSERT، DELETE و حتى CREATE پشتيبانى مىكند. در واقع از هر عمليات SQL كه منجر به توليد نتيجه نشود، پشتيبانى مىكند. در مثال زير SQL:update، UPDATE را  با درج مقادير متغير در Perpared Statement انجام مىدهد. در اين مثال ، مبلغى را بين دو حساب انتقال مىدهيم.

<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

پشتيبانى از XML در JSTL مطابق مشخصه Xpath  است. يكى از وظايف مهم Xpath تهيه دستورى براى دستيابى به اطلاعات سلسله مراتبى است. براى مشاهده نحوه عملكرد، بهتر است از تگهاى XML جدا از صفحه واقعى JSTL استفاده نماييم.

 

<!-- 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"/>

 

در action هاى import و parse فوق، مستندات XML را بار گذارى و در متغير doc، Parse مىكنيم. در هر يك از X:OUTها، دسترسى به عناصر مستندات XML با كمك عبارت Xpath صورت مىگيرد و مىتوانيم نتايج را به خروجى صفحه JSP بفرستيم.

مجموعه عبارت فوق، عبارت Xpath را ارزيابى نموده و نتايج را در متغير قرار مىدهد. Actionهاى X:out و X:Set در صورتى كه با موفقيت، كامل نشوند، Exception و JspTagException را توليد مىكنند. در اين صورت صفحه شما بايد هوشمندانه با اين استثنائات برخورد نمايد (از طريق errorpage يا actionهاى C:catch).

JSTL تبديلات XSLT را به سادگى انجام مىدهد. در مثال زير، X:transform براى ساخت صفحه فرمت شده استفاده نموديم صفات مهم X:transform عبارتند از: XML و XSIT صفت XSIT از متغييرى كه در همان صفحه معرفى نموديم و صفت XML در بدنه action، ست شده است.

به طور پيش فرض، نتايج تبديل به خروجى صفحه ارسال نمىشود. شما مىتوانيد نتايج را در متغيرى با صفت X:var ذخيره نماييد:

<%@ 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 براى مشخص نمودن سند يك منبع خارجى، همانگونه كه مثال زير آمده است، استفاده نماييد.

 

 

منابع

Background references:

JSTL references:

Other online introductions to JSTL:

Sun's The Java Web Services Tutorial:
http://java.sun.com/webservices/docs/1.0/tutorial/doc/JSTL.html

 

 

 

Copyright 2003 IDG News Service.All right reserved.

Copyright 2003, PC World Iran, All rights reserved.