|
|
As J2EE programmers, we are familiar with Servlets , JSP and JavaBeans. Any JSP page should encapsulate the business logic in a bean and invoke it by using
{{{ Back in 1998, a Web-Server Technology , known as ColdFusion , created by Allaire of Allaire Corporation, was very much in demand!. It was a purely tag- based language, using which page-authors can turn into programmers overnight. The tags were so powerful and simple to use! There is a separate lesson on using ColdFusion for typical web-based database opeartions, elsewhere in this edition, just to indicate the source of inspiration of the tag library idea, of the JSTL. To this day, ColdFusion is unbeatable, in its power,speed, ease of use and productivity. However, among the various web-server technologies ( namely ASP, Servlets, JSP,Perl,PHP , ColdFusion & ASP.net), CF is the only technology that is not free!And perhaps for this reason, it is no longer popular in Indian environment, though it is said to be very much in vogue still, in US!
MacroMedia of 'Flash fame' purchased ColdFusion. There was even a tutorial on MacroMedia ColdFusion Exprsess in DeveloperIQ., a few months back.It is interesting to make a comparison of the CF tags approach and the JSTL approach., especially , in DataBase operations.Readers are requested to read the lesson on ColdFusion,in this edition, after covering sql tags in JSTL , in the fourth part of this tutorial.. }}}
To resume,the release of the TagLibrary API, triggered a lot of activity and hundreds of tags were introduced by the java community, some of them 'open' and a few 'proprietary'. This led to a lot of confusion in code maintenance, because knowledge of Java was no longer sufficient to understand and interpret a given jsp page using non- standard tags .The JCP had unwittingly introduced elements of confusion by the JSP-Custom-Tag specification.
To correct this problem, Sun and JCP, initiated the JSP-Standard Tag Library (JSTL) project. Though there are a number of popular and powerful tag-libraries, it is always better for j2ee coders to adopt the JCP standard because, it is likely to be merged into the core specification of Java langauage itself , in future. (That yardstick may be valid for all creations, in Java world. Splintering of the Java platform due to' hyper-active creativity' without the corresponding discipline to get it through a standards body ,is the greatest threat, looming large in the Java-horizon.
Too frequent revisions and additions, that too without caring for backward compatibility,are not conducive to programmer productivity and the net result is that programmers spend ,in learning new twists in grammar, their precious time which should have been spent more usefully in applying that grammar in solving business-logic problems and acquiring proficiency in the chosen application-domain. While, tag library is sometimes very elegant and simple to use, it defeats the very purpose if the tags are not standard tags and if there is proliferation of non-standard tags. It is for this reason that JSTL merits our serious study and adoption.
JSTL is a quite recent development. It was only in 2003, that the official version 1.1 was released and now incorporated into JSP-2.
According to the latest position, the JCP is suggesting that a JSP page should be completely free from any trace of Java code! So, programmers who were writing their JSP using Javabeans and scriptlets , may not be able to carry on in their old style as, to prevent programmers from introducing scripting sections in their pages, there is a provision for turning off scriptlets altogether from a jsp page. If that happens ,all our knowledge of Java coding will be of little use in creating a jsp page, though such knowledge may be useful in creating beans and other types of java programs.
It is thus very important for J2EE students, to understand the trend and get to know the techniques, advantages and limitations of tag libraries...In a way, a study of JSTL is almost synonymous with a study of the latest version of JSP (ie) JSP2.0 .
Without an introductory demo for each of these types, it may be difficult to appreciate the significance of the above lines. So we will now give simplest illustration.
[It is presumed that readers are conversant with basic Servlets & JSP techniques and executing them in Tomcat environment.]
Servlets are full-fledged java-classes and so are very powerful. But, when we want to create a dynamically-generated web-page using servlets, it becomes difficult and clumsy. Let us consider a very simple example.
The user fills up text in html form with his name and submits the form,to the servlet. The servlet reads the data , appends a greeting and sends it back to the user.
We being with a simple html form:
greeting.html
Relevant section of Greeting.java servlet
Greeting.java ( code-snippet only) public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException { resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); //------------------------------- String s = req.getParameter("text1"); out.println(""); out.println("We welcome"+",
"); out.println (s); out.println(" "); }
It will be noticed that we have to write so many 'out.println' statements. This makes the page unreadable.( If String-buffer is used , we can do it with just a single out.println , but forming the correct string may pose difficulties).
It is to solve this problem that JSP was developed(1999). While a servletinterposes HTML in java code, JSP interposes java-code in HTML, as some authors correctly observe..( in this case, we have to modify the action field in html form, so that it refers to the following greeting1.jsp).
DelimetersStudent readers will know about 'delimiters' ( <%) in ASP. This is the same as in JSP. Only the syntax is slightly different. In JSP parlance, the code within delimiters is known as 'scriptlet'.( see greeting1.jsp)
greeting1.jsp <% String s = request.getParameter("text1"); out.println("we welcome"+
); out.println(s); %>
Expressions
Some coders prefer to use expressions.
What is an 'expression'? It is a method of sustituting request-time values in html page. ( see greeting2.jsp). Carefully note that there is no semi-colon after ("text1").
greeting2.jsp We welcome
<%= request.getParameter("text1") %>
Using a java bean
The third variant is to use a javabean to encapsulate the business-logic. We develop a jsp-bean as follows:
greeter.java package ourbeans; public class greeter { public greeter() { } public String greetme(String s) { return "we welcome..."+s; } }
This source file is compiled and the class-file is copied to :
'e:\tomcat5\webapps\root\WEB-INF\classes\ourbeans'
(Carefully note that WEB-INF folder name should be in capital letters).
(Anytime, a new class is placed in Tomcat, we should remember to restart the server).
We can now write our JSP code as follows:greeting3.jsp <% String s = request.getParameter ("text1"); String r = bean1.greeteme(s); out.println(r); %>
We are now entering JSTL zone. How exactly we should proceed to install JSTL, we will take up shortly. For the moment, we are just getting familiar with the required syntax. We begin with taglib directive:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
The directive says that we are using 'core' tags and the prefix will be 'c'. If we want to assign the value 'sam' to a variable 'a' and then print it, the JSTL code will be:
The Dollar sign & brace will be familiar ground for Perl programmers. In JSTL & JSP-2, it is known as EL ( Expression Language).
To consider another example, In a servlet & jsp, we write:
String s = request.getParameter("text1");
to collect the input from the user.
The same job is done in JSTL by:
With these brief hints, it should not be difficult to understand the following JSP page written by using JSTL core-tags.
greeting4.jsp (uses JSTL) <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core"%> We welcome
In the previous examples, there was java code in a few lines at least. But, in the JSTL example, we find that there are only tags and no java scriptlets. This is the avowed objective of the JSTL initiative under the auspices of Java Community Project! Why? This enables, clean separation of Page author's role and Logic programmers' role. Thus maintenance becomes easy.
There are five groups under which the JSTL tags have been organized.
They are as follows:
- core
- xml
- sql
- formatting
- functions
The most difficult part is to set up Tomcat so that it executes JSTL. There are some basic requirements, before we can experiment and study the use of JSTL.All that we have studied in using Tomcat for servlets and JSP may not be sufficient to learn JSTL, because, jstl library is not built into Tomcat5 even, as yet.
Without hands-on experimention, JSTL could be confusing and strange, because of the fact that it is very recent . But in coming months, support will be built into Tomcat and we won't have to worry about installing the JSTL libraries inside Tomcat. But, as it is, we have to learn how to set up the necessary development environment..
So, how do we go about , placing the JSTL libraries in tomcat?
The best solution is to get JWSDP1.3. This is Java Web Service Development' Pack. (Carefully note the version , however!).
It is good to start with this because, it contains a lot of valuable software , including the latest and greatest from JCP, (ie) JSF (Java Server Faces).... which may soon replace Struts.
We unzip the jwsdp1.3 and install it in C: drive.
There are a number of folders like JAXP, JAXR, JAXB,JAX-RPC, JSF, JSTL etc. in the JWSDP pack.
For the present, we are interested in JSTL folder only. If we expand the JSTL folder, we find four sub folders:
a) docsb) lib
c) samples
d) tld (tag library descriptors)
When we look into the 'lib' folder, we find two jar files:
a) standard.jarb) jstl.jar
We should copy these two jar files into :
'e:\tomcat5\webapps\root\WEB-INF\lib'
(Remember to restart the Tomcat server).
That is all that is required to use JSTL!The included taglibrary descriptors do not have to be placed in the WEB-INF folder.These files are already included in the /META-INF folder of the jstl.jar and so will be automatically loaded by Tomcat, when it is restarted.
(We are using tomcat5 & jdk1.4.2. The results are not ensured for other environments. However, we adopted the same method in Tomcat4.1 with jdk1.41 and got correct functioning.)
The JSTL folder contains a sub-folder named 'tld'. There will be a number of tld files there such as
c.tld, ( core)x.tld, (xml)
fmt.tld, (format)
sql.tld & (sql)
fn.tld. (functions)
Some authors say that we should copy these tld files to ... :\tomcat5\webapps\root\WEB-INF folder. A few others , say that there is automatic detection and so it is not necessary. We chose not to copy the tld files into e:\tomcat5\webapps\root\WEB-INF folder ! We found that the programs work well. No problem!
When we study the web.xml file in e:\tomcat\webapps\root\WEB-INF folder, we find that it follows DTD and not Schema. ( DTD stands for Document -Type- Definition). ( Schema serves the same purpose but is in XML format and is more powerful. The default is DTD ).
This point is very important. The default allows us to use EL,(Expression Language) but by using If we modify the DTD into the prescribed J2EE schema , we can directly print as ${s}. This requires very careful handling and we take it up later. For the present , let us not tamper with the DTD. or the web.xml file. In the next part of this tutorial, we study the tags available in the JSTL-core library.
[ In the second part of this tutorial on JSTL, the author explains how the tags in the core-group can be used in JSP pages, with a number of simple examples.]
We are now ready to experiment with all the tags in the core library. The core tags have the following uniform uri:
http://java.sun.com/jstl/core
(In the book by Hans Bergsten titled,"Java Server Pages" ( third edition), (OReilly pub)the uri is consistently given as : 'http://java.sun.com/jsp/jstl/core'.It looks as if there has been some change in specification and grammar, after it was published. This appears to be wrong as the server threw exception. The correct uri is : 'http://java.sun.com/jstl/core'.)
The prefix is ‘c:’
The following tags are available in the ‘core’ library. ( Remember them as a dozen!).
We will now see simplest illustrations for the above tags.There are a dozen demos, to bring out the features of each of these tags.
Example 1
demo1.jsp uses
demo1.jsp <%@ page contentType="text/html" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> NAME:
PLACE:
In all the previous examples, we invoked the JSP file through a html file. But, in demo1.jsp, we are posting the page to itself.( in asp.net style!).( but there is no 'retention of data' , unlike asp.net).
We start Tomcat5, and type the url as: ‘http://localhost:8080/demo1.jsp’. in the browser.
We get a form with two text boxes and a submit button. We fill up the textboxes with name and place and submit.The demo1.jsp executes and displays the values entered by the user.due to the JSTL tags:
The second example is very important. When the user enters data in a number of fields, it is tedious to collect the data and transfer it to jsp page for processing. In our example, we are collecting data about a player, such as his name, place and game. We can have much more but we are restricting for space considerations. JSP has an action tag , known as 'jsp:setProperty'. Using this along with a standard javabean, we can extract data and transfer it to our program in a single step.
The syntax is
( the * sign denotes 'all').
But, we should first create the 'player ' bean with all the attributes and getter & setter methods, as shown:
player.java package ourbeans; public class Player { private String name; private String place; private String game; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPlace() { return place; } public void setPlace(String place) { this.place = place; } public String getGame() { return game; } public void setGame(String game) { this.game = game; } }
In demo2.jsp, we collect the data and then display the data entered by the user. Note that instead of {param.text1}, we are using {bean1.name}. We should carefully name the html form controls with the corresponding attribute names given in the bean. We cannot name the controls as 'text1' etc, now!
demo2.jsp <%@ page contentType="text/html"%> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core"%> Name:
Place:
Game:
Once again, it will be noticed that there is no java code in this example, as everything is being done by tags, only.
Example 3 - Condition Tags
We are now ready to take up examples for 'condition' tags. There are two types of 'condition tags': namely,
In the third demo, we learn how to use the There is a combo with two options, namely 'sam' and 'tom'. If the user selects 'sam' and submits the form, he gets 'GoodMorning ...SAM!". If he selects 'tom' instead, he gets 'How are you..TOM?'. The above code is no ‘Rocket-Science’ as American authors say!But , if we are careless in typing the names ‘sam’ or ‘tom’ in the test condition, we could spend hours together , trying to coax this code into functioning! We should not leave space after the single quote in the 'test expression'. Second point worth noting in the above example is that we can use either == ( double equal to) or eq to test equality. The syntax is: When we choose '7', "select between 1 & 5 " will be displayed! We are familiar with the 'for-each' construct. JSTL's 'for-each' also has the same functionality. In the following example, we have a String array. named as 'colors'. By using the We get the following display, when we execute the program. 0 1 true false red 1 2 false false green 2 3 false false blue 3 4 false false purple 4 5 false true black If we assign the symbolic name 'a' for the status, we are able to access its properties such as index, count, whether it is first item, whether it is last item and the current value. Demo6 also deals with iteration tag. In the following example, the iteration starts at value 3 and ends at value 8. It displays the values of n in each iteration. Each iteration increments the value of n automatically by 1, if step is not specified. Resulting html display for demo6.jsp: 3,4,5,6,7,8 Demo7 deals with JSTL's 'forTokens' tag. Resulting HTML displayed: The essential attributes of 'forTokens' tag are: Demo8 deals with URL-Related actions. In the following example,the import action tag imports the content of welcome.htm file here.So it displays the contents of demo8.jsp and welcome.htm. In demo9 we discuss the In the following example,we use demo10 deals with This tag forwards the browser to the specified URL. Finally, And to end our whirlwind tour of core-tags in JSTL, here is a demo which mixes EL of JSP-2(Expression Language of JSTL) with 'Expression' (also known as request-time Expression ) of JSP1.2. In the next and third part of this tutorial, we will learn about xml tags in JSTL.demo3.jsp <%@ page contentType="text/html" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
Example 4 - c:choose
The peculiarity to be noted here is that unlike <demo4.jsp <%@ page contentType="text/html" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
Example 5 - Iteration c:forEach demo5.jsp <%@ page contentType="text/html" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <% pageContext.setAttribute("colors", new String[] {"red","green","blue","orange","black"} ); %>
items : the collection of items like String[] var : a symbolic name for the collection begin : the starting index of iteration end : the ending index of iteration step : incremental step varStatus : symbolic name for current status.
Example 6 - c:forEach cont. demo6.jsp <%@ page contentType="text/html" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
Example 7 - c:forTokens <%@ page contentType="text/html" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
Name Place Degree Age Mark
NAME PLACE DEGREE AGE MARK SAM DELPHI MCA 24 90
Delims: The delimiter characters that separate the tokens of the string.
Example 8 - c:import // welcome.htm WELCOME
demo8.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
Example 9 - c:url demo9.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> ">send
Example 10 - c:redirect <%@ page contentType="text/html" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
Example 11 - c:param value='SAM'
, to the redirected page. demo11.jsp <%@ page contentType="text/html" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
( in a different file )
sample.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
demo12.jsp <%@ page contentType="text/html" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> JSTL welcomes
JSP Expression welcomes <%=request.getParameter("text1") %>
In this third part of the tutorial on JSTL, the author explains the use of xml tags of the JSTL and shows their wonderful simplicity ,ease of use and raw power.
No one can have any second opinion about the elegance of xml tags in JSTL. If the readers have been following the earlier installments of this J2EE series of tutorials, they would have come across JAXP,DOM,SAX ,JDOM and such terms, and it may have been none too easy to learn. But the xml tags in JSTL , make XML processing and even Transformation , a cinch! And ,we now proceed to study them.
Making our study even easier, many of the xml tags in JSTL , are very much similar to the 'core' tags. For example, just like
Similarly,
So, if we have understood the syntax of the 'core'; tags, it will not be difficult to use the 'xml' tags.
All the following examples use the books.xml file.It contains 'elements' like 'title' and 'author':
books.xml cobol roy java herbert c++ robert coldfusion allaire xml unleashed morrison jrun allaire
XML Demos
The following program reads the xml file using 'forEach' tag and displays the title and author of each book..
The syntax:
is used to select the elements from the xml file.
is used to print the elements of the xml file. We begin by importing the reference to the XML file to be parsed.
We have given a symbolic name for this file as 'url'.Next we ask the program to parse this XML file.The resulting tree is given a symbolic name as 'doc'.
In the next step, we direct the program to select each title and each author in the XPATH expression $doc/books/book. If we refer to the xml file , we find that the root element of the document is 'books'. Inside this, we have 'book'.So, XPATH can be thought of as just a file hierarchy. Just like Magically, we have parsed a given XML document and extracted information, without any mention about DOM,SAX and such words., atall!Wonderful!As a famous author would say, 'anything that makes my job easier, I like!'. When we execute the 'program', we get the following result. (Result for executing demo1.jsp) The following program (demo2)displays the books and authors of xml file in table format. Results of Demo 2: demo3 deals with the selection of particular book's author from the xml file ,when we give the title, with the help of action tag.The title is choosen from combo box in demo2.htm file and submitted.We get a display of the selected title and its author. Think of this as an sql query like "select * from table1 where title='jrun'" demo4 is a simple variation on the same theme. In this case, the user selects the author name from the combo and any books by that author are displayed, due to the code. It will be noted that 'allaire' has two books to his credit and so if we choose 'allaire' in the combo,his two books are displayed.If 'haris' is chosen, we should display the message that it is yet to be published as there is no such entry in the xml file. But there is no 'if-else' construct and so we improvise. We have created a variable 'a' and assigned the value 'ok' to it. If there is no author to match the user's selection, the conditional block is ignored and 'a' will not be 'ok'. From this, we conclude that 'the book is not ready'. In demo5 also, we display the title & author for a given title, but we now use In demo6 , we see XSLtransform using JSTL. We'll be using students.xml and xsl1.xsl as shown below the demo. Just three lines and DONE! Name Place Number Mark Thomas Delhi 1111 78 David Bombay 4444 90 Mathew Bangalore 5555 92 John Hyderabad 6666 72 That completes our study of 'xml' tags in JSTL.We now move ahead to the fourth and final part of the present tutorial, dealing with 'sql' tags in JSTL.demo1.jsp <%@ page contentType="text/html" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="c" >uri="http://java.sun.com/jstl/xml" %>
========
========================== cobol roy ========== java herbert ========== c++ robert ========== coldfusion allaire ========== xmlunleashed morrison ========== jrun allaire ==========
demo2.jsp <%@ page contentType="text/html" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="c" >uri="http://java.sun.com/jstl/xml" %>
tr> title author title author ----- ------ cobol roy java herbert c++ robert coldfusion allaire xml unleashed morrison jrun allaire
demo3.htm SELECT THE TITLE.
YOU WILL GET TITLE & AUTHOR. demo3.jsp <%@ page contentType="text/html" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/xml" %>
demo4.htm Select name of author & view his books
demo4.jsp <%@ page contentType="text/html" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/xml" %>
demo5.htm SELECT THE TITLE.
YOU WILL GET TITLE & AUTHOR. demo5.jsp <%@ page contentType="text/html" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/xml" %>
Result ====== -------------------- title: c++ -------------------- c++ robert ========================- title: VB -------------------- no such book
Demo 6 <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="x" uri="http://java.sun.com/jstl/xml" %>
// students.xml
//xsl1.xsl
Name Place Number Mark
In this fourth & last part of the tutorial on JSTL,the author deals with the 'sql' tags in JSTL and shows how they greatly simplify simple database operations like 'select' queries. In another demo, common database operations like 'add','modify' , 'delete' & 'verify'also are dealt with.
The Struts community has ordained that JSP should be strictly a 'view-technology', in the Model-View-Controller Architecture. According to Struts philosophy, JSP should not deal with Data-Accesss and such data access should be done by 'Model' components only.( read 'beans'). JSTL , however, provides for sql tags, inspired by ColdFusion! And , a few months back, the editor of 'Java Lobby' magazine was all admiration for the absolutely nice features of these sql tags, whatever, 'struts-fans' may say! Just as EJB may be 'overkill', except for really big Enterprise applications, Struts also may be an unnecessary complication for small and medium level projects. In such cases, it is much more direct to provide for data access by the JSP itself, but using JSTL 'sql' tags.We take up these 'sql' tags in this part of the tutorial.
Let us begin with 'sql.htm'. It just provides a simple form with just a textarea & submit button. Normally, queries by MIS department will be very complex and so we have provided a textarea for the 'select' query.After filling up the query, it is submitted and the corresponding query.jsp is invoked.
query.htm
query.jsp is given below. In the standard jdbc code,we begin by asking for the availability of the driver. "jdbc.odbc.JdbcOdbcDriver
". And then, we specify the URL of the database as 'jdbc:odbc:telephone
'.
Similarly, in JSTL also, we begin with The next step is to collect the query typed in area1 by the user. Next, the ' In the second example,(dbeditor.htm & dbeditor.jsp) we provide a combo, with options such as: add, modify, remove and verify. In JSTL , we have a separate sql tag known as '
is used for this purpose.We also check up whether the query typed by the user has indeed been correctly received using query.jsp <%@ taglib prefix="c" %>uri="http://java.sun.com/jstl/core" <%@ taglib prefix="sql" %> uri="http://java.sun.com/jstl/sql"
dbeditor.htm
dbeditor.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/sql" %>
These are , afterall, the essentials. All else, are only, ornamental. Thus, it will be seen that the JCP has done a great job in creating really fine standard tags, for simplifying routine tasks. But, Java coders, have to take note that , their job as JSP coders, will be slowly eroded by page-authors using JSTL!
- Pro JSP by SIMON BROWN & OTHERS (A-Press) (Excellent material)
- JavaServer Pages by Hans Bergsten ( Third Edition) (O'Reilly Press/SPD)
- EARLY ADOPTER JSP Standard Tag Library by JAYSON FALKNER & OTHERS Wrox Press
- JSTL in Action by SHAWN BAYERN (Manning/ DreamTech).