Fall Semester 2002


Lecture Notes BWS: Building Web Services

We need to create a context (bws) under webapps.

The contents for webapps/bws is provided here:

/l/www/classes/a348/sum2002/notes/axis/examples/webapps/bws
Here's the basic contents:
frilled.cs.indiana.edu%pwd
/nfs/grouchy/home/user2/www/classes/a348-dger/sum2002/notes/axis/examples/webapps
frilled.cs.indiana.edu%du -a bws
384	bws/WEB-INF/lib/axis.jar
128	bws/WEB-INF/lib/bws.jar
77	bws/WEB-INF/lib/log4j-core.jar
90	bws/WEB-INF/lib/wsdl4j.jar
848	bws/WEB-INF/lib/xalan.jar
1616	bws/WEB-INF/lib/xerces.jar
3144	bws/WEB-INF/lib
2	bws/WEB-INF/web.xml
3147	bws/WEB-INF
1	bws/index.html
4	bws/source.html
2	bws/ch2/ex1/index.jsp
3	bws/ch2/ex1
4	bws/ch2
1	bws/ch3/ex1/index.jsp
1	bws/ch3/ex1/intro.html
1	bws/ch3/ex1/inventoryCheck.jsp
2	bws/ch3/ex1/productListing.jsp
1	bws/ch3/ex1/toc-prods.html
1	bws/ch3/ex1/toc.html
1	bws/ch3/ex1/top.html
9	bws/ch3/ex1
1	bws/ch3/ex2/_buildSKUList.jsp
2	bws/ch3/ex2/index.jsp
4	bws/ch3/ex2
2	bws/ch3/ex3/index.jsp
3	bws/ch3/ex3
2	bws/ch3/ex4/index.jsp
3	bws/ch3/ex4
20	bws/ch3
3	bws/ch4/FileListener.java
4	bws/ch4
3	bws/ch5/ex1/index.jsp
4	bws/ch5/ex1
11	bws/ch5/ex2/index.jsp
12	bws/ch5/ex2
4	bws/ch5/ex3/index.jsp
5	bws/ch5/ex3
15	bws/ch5/ex4/index.jsp
16	bws/ch5/ex4
7	bws/ch5/ex5/index.jsp
6	bws/ch5/ex5/index.jsp.encryption
14	bws/ch5/ex5
2	bws/ch5/ex6/index.jsp
3	bws/ch5/ex6
55	bws/ch5
1	bws/inventory/InventoryCheck.jws
2	bws/inventory
2	bws/resources/deploy.xml
1	bws/resources/jms-client-config.xml
1	bws/resources/jms-server-config.xml
2	bws/resources/products.xml
2	bws/resources/sampleInvoice.xml
1	bws/resources/samplePO.xml
10	bws/resources
1	bws/util/_loadParameters.jsp
1	bws/util/deployServices.jsp
1	bws/util/makeFrames.jsp
1	bws/util/navigation.jsp
2	bws/util/showChapters.jsp
1	bws/util/showExamples.jsp
8	bws/util
3256	bws
frilled.cs.indiana.edu%
This is a lot of code, but we need to approach it in stages.

So the first thing I want to emphasize is the contents of this folder:

frilled.cs.indiana.edu%pwd
/nfs/grouchy/home/user2/www/classes/a348-dger/sum2002/notes/axis/examples/webapps
frilled.cs.indiana.edu%du -a bws/WE*/lib
384	bws/WEB-INF/lib/axis.jar
128	bws/WEB-INF/lib/bws.jar
77	bws/WEB-INF/lib/log4j-core.jar
90	bws/WEB-INF/lib/wsdl4j.jar
848	bws/WEB-INF/lib/xalan.jar
1616	bws/WEB-INF/lib/xerces.jar
3144	bws/WEB-INF/lib
frilled.cs.indiana.edu%
Also, your axis should be installed already.

(Read Lecture Notes 28 for installation instructions and basic setup).

Chapter 2 describes XML:

A comprehensive example is here:

frilled.cs.indiana.edu%pwd
/nfs/grouchy/home/user2/www/classes/a348-dger/sum2002/notes/axis/examples/webapps/bws
frilled.cs.indiana.edu%ls 
WEB-INF  ch2  ch3  ch4	ch5  index.html  inventory  resources  source.html  util
frilled.cs.indiana.edu%du -a ch2
2	ch2/ex1/index.jsp
3	ch2/ex1
4	ch2
frilled.cs.indiana.edu%cat ch2/ex1/index.jsp 
<%@ page import="java.io.*,bws.BookUtil,com.skatestown.invoice.*" %>
<HTML>
<HEAD><TITLE>Invoice Checker</TITLE></HEAD>
<h1>Invoice Checker</h1>

<p>This example implements a web form driver for SkatesTowns's invoice checker. 
You can modify the invoice on the form if you wish (the default one is from Chapter 2), 
select a DOM or SAX parser and perform a check on the invoice total.</p>

<FORM action="index.jsp" method="POST">
<%
	String xml = request.getParameter("xml");
	if (xml == null)
	{
		xml = BookUtil.readResource(application, "/resources/sampleInvoice.xml");
	}	
%>
<TEXTAREA NAME="xml" ROWS="20" COLS="90"><%= xml%></TEXTAREA>
	<P></P>
	Select parser type: 
	<INPUT type="RADIO" name="parserType" value="SAX" CHECKED> SAX
	<INPUT type="RADIO" name="parserType" value="DOM"> DOM
	<P></P>
	<INPUT type="SUBMIT" value=" Check Invoice ">
</FORM>

<%
	// Check for form submission
	if (request.getParameter("xml") != null)
	{
		out.println("<HR>");
		
		// Instantiate appropriate parser type
		InvoiceChecker ic;
		if (request.getParameter("parserType").equals("SAX"))
		{
			out.print("Using SAX parser...<br>");
			ic = new InvoiceCheckerSAX();
		}
		else
		{
			out.print("Using DOM parser...<br>");
			ic = new InvoiceCheckerDOM();
		}
		
		// Check the invoice
		try
		{
			ic.checkInvoice(new StringBufferInputStream(xml));
			out.print("Invoice checks OK.");
		}
		catch(Exception e)
		{
			out.print(e.getMessage());
		}
	}
%>

</BODY>
</HTML>

frilled.cs.indiana.edu%
We need to clarify what we have here.

(Better indentation would help).

There's a class that's needed, and a package.

frilled.cs.indiana.edu%pwd
/nfs/grouchy/home/user2/www/classes/a348-dger/sum2002/notes/axis/examples/webapps/bws
frilled.cs.indiana.edu%ls
WEB-INF  ch2  ch3  ch4	ch5  index.html  inventory  resources  source.html  util
frilled.cs.indiana.edu%du -a ch2
2	ch2/ex1/index.jsp
3	ch2/ex1
4	ch2
frilled.cs.indiana.edu%grep import ch2/ex1/index.jsp
<%@ page import="java.io.*,bws.BookUtil,com.skatestown.invoice.*" %>
frilled.cs.indiana.edu%
Where are these files?

(They are in webapps/bws/WEB-INF/lib/bws.jar, of course).

Here's where you can find them as source code:

frilled.cs.indiana.edu%pwd
/nfs/grouchy/home/user2/www/classes/a348-dger/sum2002/notes/axis/examples/src
frilled.cs.indiana.edu%ls -l
total 43
-rw-r--r--   1 dgerman  faculty      1005 Dec 12  2001 Order.java
-rw-r--r--   1 dgerman  faculty      3184 Dec 12  2001 OrderBean.java
-rw-r--r--   1 dgerman  faculty      1424 Dec 12  2001 OrderData.java
-rw-r--r--   1 dgerman  faculty       425 Dec 12  2001 OrderDeserializerFactory.java
-rw-r--r--   1 dgerman  faculty       282 Dec 12  2001 OrderHome.java
-rw-r--r--   1 dgerman  faculty      2027 Dec 12  2001 OrderObject.java
-rw-r--r--   1 dgerman  faculty      2900 Dec 12  2001 OrderSerializer.java
-rw-r--r--   1 dgerman  faculty       592 Dec 12  2001 POProcess.java
-rw-r--r--   1 dgerman  faculty      4123 Dec 12  2001 POProcessBean.java
-rw-r--r--   1 dgerman  faculty      4562 Dec 12  2001 POProcessBeanJMS.java
-rw-r--r--   1 dgerman  faculty      2284 Dec 12  2001 POProcessCaller.java
-rw-r--r--   1 dgerman  faculty       112 Dec 12  2001 POProcessException.java
-rw-r--r--   1 dgerman  faculty       373 Dec 12  2001 POProcessHome.java
-rw-r--r--   1 dgerman  faculty      1050 Dec 12  2001 Product.java
-rw-r--r--   1 dgerman  faculty      2226 Dec 12  2001 ProductBean.java
-rw-r--r--   1 dgerman  faculty       343 Dec 12  2001 ProductHome.java
drwxr-xr-x   2 dgerman  faculty       512 Jan 21  2002 bws
drwxr-xr-x   5 dgerman  faculty       512 Jan 21  2002 ch3
drwxr-xr-x   6 dgerman  faculty       512 Jan 21  2002 ch5
drwxr-xr-x   7 dgerman  faculty       512 Jan 21  2002 ch6
drwxr-xr-x   5 dgerman  faculty       512 Jan 21  2002 ch7
drwxr-xr-x   3 dgerman  faculty       512 Jan 21  2002 ch8
drwxr-xr-x   3 dgerman  faculty       512 Jan 21  2002 com
frilled.cs.indiana.edu%du -a com
2	com/skatestown/backend/EmailConfirmation.java
2	com/skatestown/backend/POProcessor.java
2	com/skatestown/backend/ProductDB.java
7	com/skatestown/backend
2	com/skatestown/data/Address.java
1	com/skatestown/data/BusinessDocument.java
1	com/skatestown/data/Invoice.java
1	com/skatestown/data/InvoiceItem.java
1	com/skatestown/data/PO.java
1	com/skatestown/data/POItem.java
2	com/skatestown/data/Product.java
10	com/skatestown/data
1	com/skatestown/invoice/InvoiceChecker.java
4	com/skatestown/invoice/InvoiceCheckerDOM.java
4	com/skatestown/invoice/InvoiceCheckerSAX.java
10	com/skatestown/invoice
3	com/skatestown/services/EMailHandler.java
2	com/skatestown/services/InventoryCheck.java
2	com/skatestown/services/POSubmission.java
2	com/skatestown/services/POSubmission2.java
3	com/skatestown/services/TrackingSubmission.java
13	com/skatestown/services
4	com/skatestown/xml/Deserializer.java
5	com/skatestown/xml/Serializer.java
10	com/skatestown/xml
51	com/skatestown
52	com
frilled.cs.indiana.edu%du -a bws
5	bws/BookUtil.java
6	bws
frilled.cs.indiana.edu%
Looking again at the code we can point out a few things:

<%@ page import="java.io.*,bws.BookUtil,com.skatestown.invoice.*" %>

<HTML><HEAD><TITLE>Invoice Checker</TITLE></HEAD>

<body bgcolor=white>

  <h1>Invoice Checker</h1>

  <p>This example implements a web form driver for SkatesTowns's invoice 
  checker. You can modify the invoice on the form if you wish (the default 
  one is from Chapter 2), select a DOM or SAX parser and perform a check on 
  the invoice total.</p>

  <FORM action="index.jsp" method="POST">

  <%
    String xml = request.getParameter("xml");
    if (xml == null) {
      xml = BookUtil.readResource(application, "/resources/sampleInvoice.xml");
    }	
   %>

    <TEXTAREA NAME="xml" ROWS="20" COLS="90"><%= xml%></TEXTAREA>
    <P></P>
    Select parser type: 
    <INPUT type="RADIO" name="parserType" value="SAX" CHECKED> SAX
    <INPUT type="RADIO" name="parserType" value="DOM"> DOM
    <P></P>
    <INPUT type="SUBMIT" value=" Check Invoice ">

  </FORM>

  <%
    // Check for form submission
    if (request.getParameter("xml") != null) {
      out.println("<HR>");
      // Instantiate appropriate parser type
      InvoiceChecker ic;
      if (request.getParameter("parserType").equals("SAX")) {
        out.print("Using SAX parser...<br>");
        ic = new InvoiceCheckerSAX();
      } else {
        out.print("Using DOM parser...<br>");
        ic = new InvoiceCheckerDOM();
      }
      // Check the invoice
      try {
        ic.checkInvoice(new StringBufferInputStream(xml));
        out.print("Invoice checks OK.");
      } catch(Exception e) {
        out.print(e.getMessage());
      }
    }
   %>
</BODY>
</HTML>
Looking into the source code should clarify the SAX vs DOM differences.

With this completely understood we could delve into:

  1. Simple Object Access Protocol (SOAP) and
  2. XML Protocol (XMLP)

I agree this could be made more exciting, but let's put that off for now.


Last updated: Nov 25, 2002 by Adrian German for A348/A548