Deploying Dynamic Sites Using Page Compilation, JavaServer...

Preview:

Citation preview

1106174542 Richard West 1

Deploying Dynamic Sites Using PageCompilation, JavaServer Pages TM Software

and an Object Oriented Database

Richard WestTechnical Director, Diverse Solutions & Virtual Web Dynamics

1106174542 Richard West 2

Richard West

Technical Director

Diverse Solutions - divsol.com.au- The technical company

rwest@divsol.com.au

Virtual Web Dynamics - vwebd.com- The sales / marketing company

rwest@vwebd.com

1106174542 Richard West 3

Introduction

This presentation will cover the principles,basic design and code needed in order touse the Jigsaw Web Server and an Object-Oriented Database (Object Design’s PSEPro) to construct sites with dynamiccontent using both Page Compilation andJavaServer Pages TM software (JSP)

NOTE :

This was to be on Java Web Server TM

Software, but since this no longerexists :-(, we’ll use Jigsaw :-)

1106174542 Richard West 4

Assumptions

• You Know Java TM Technology!

• Understand:– The Web, its protocols and Web Servers– Basic Servlet Interface and concepts– Forms Handling– Persistence and why we’d want it on a web site

1106174542 Richard West 5

Metaview

• Part 1—The Basics– Jigsaw, PSE Pro & Page Compilation– Configuring Jigsaw and your development tool– Basic Page Compilation with Global Sessions

BREAK

• Part 2—Advanced Topics and Discussion– Advanced Page Compilation with Local

Sessions and Threading– General Utilities– Using JavaServer Pages TM software

with PSE Pro– Discussion

1106174542 Richard West 6

Overview—Part 1The Basics

• Jigsaw Web Server Software and installation

• Brief overview of OODB’s and PSE Pro

• Page Compilation under Jigsaw

• Demonstration—Jigsaw andPage Compilation

• Configuring Jigsaw and your DevelopmentTool for PageCompilation and PSE Pro

1106174542 Richard West 7

Overview—Part 1The Basics (Cont.)

• Simple Persistent Page Compilation

• Extending GeneratedFrame for PageCompilation

• Demonstration—Jigsaw and PageCompilation with Persistence

• Questions

• Break

1106174542 Richard West 8

Jigsaw Web ServerSoftware and Installation

– Get Jigsaw: www.w3c.org/Jigsaw– Add VirtualHost Resource– Add Frame– VirtualHostFrame– Set Followup to root– Add PassDirectory– Configure Id as web server name– You Now have a virtual host!– Add HTTPFrame to your host– Set Index– Configure Root Name to virtual

1106174542 Richard West 9

Add VirtualHost Resource

1106174542 Richard West 10

Add Frame

1106174542 Richard West 11

VirtualHostFrame

1106174542 Richard West 12

Set Followup to root

1106174542 Richard West 13

Add PassDirector y

1106174542 Richard West 14

Confi gure Identifier asWeb Server Name

1106174542 Richard West 15

You Now Have a Virtual Host!

1106174542 Richard West 16

Add HTTPFrame to Your Host

1106174542 Richard West 17

Set Index

1106174542 Richard West 18

Confi gure Root Name to virtual

1106174542 Richard West 19

Brief Overview ofOODB’s and PSE Pro

• Why an OODB?—pros and cons

• Basic principles

• Object Design’s PSE Pro– www.odi.com/psepro

• Others on the Market

1106174542 Richard West 20

3URV

6WRUHV REMHFWV LQ QDWLYH IRUPDW

([WUHPHO\ )DVW 7UDYHUVDO

1R µ,PSHGDQFH 0LVPDWFK¶

&RQV

2QO\ QRQ -DYD 7HFKQRORJ\22'%¶V VKRXOG KDYH SODWIRUPSRUWDELOLW\ SUREOHPV

'RHVQ¶W VWRUH REMHFWV LQ DUHODWLRQDO WDEOH ! WRRO DQGWUDQVIHU SUREOHPV

22'% VWDQGDUGV UHODWLYHO\LPPDWXUH

Why an OODB?—Pros and Cons

1106174542 Richard West 21

Basic Principles

3URJUDP'DWDEDVH

22'%�3URJH�J��36(�3UR

<RXU�2EMHFWV

'%5RRW

1106174542 Richard West 22

Object Desi gn’s PSE Pro

• Certified 100% Pure Java™

• Small Footprint

• Mature Product (Release 3.0)

• Migration Path (to ObjectStore)

• Easy To Use

• Can make 3rd Party Code Persistent!!!

1106174542 Richard West 23

Others on the Market

• Jeevan

• Poet

• O2

• Jasmine

• Academic

• See CetusLinks for more info

www.cetus-links.org/oo_db_systems_1.html

1106174542 Richard West 24

What Is Pa ge Compilation?

Source

HTML &Java or JSP

Page or JSPCompiler

Source

Servletin Java Java

Compiler

.classfile

WebServer

Servlet

Served /executed byBrowser

Request

Result of Servlet Execution

1106174542 Richard West 25

Page Compilation Under Ji gsaw

• Configuring couldn’t be easier!

• Thanks to Dynamic Loading—just use a.jhtml page!!!

1106174542 Richard West 26

Page Compile Source File

<html> <head> <title>Page Compilation Test</title> </head> <body> <h1>Counter</h1> <ul> <java> for (int i = 1; i <= 10; i++) { out.println ("<li> item #" + i); } </java> </ul> </body></html>

1106174542 Richard West 27

Compiled Pa ge

public class test extendsorg.w3c.jigsaw.pagecompile.GeneratedFrame { protected void get(org.w3c.jigsaw.http.Request request, org.w3c.jigsaw.http.Reply reply, org.w3c.jigsaw.pagecompile.PageCompileOutputStream out) throws java.io.IOException { org.w3c.jigsaw.pagecompile.PageCompileFile _file = new org.w3c.jigsaw.pagecompile.PageCompileFile(

"E:\\Java\\Jigsaw\\Jigsaw\\WWW\\test.jhtml"); _file.writeBytes(0,118,out);

for (int i = 1; i < 10; i++) { out.println ("<li> item #" + i); } _file.writeBytes(235,268,out); }}

1106174542 Richard West 28

Demonstration

Jigsaw and Page Compilation

1106174542 Richard West 29

Confi gurin g Jigsaw for Pa geCompilation and PSE Pro

• Jigsaw Batch File: @echo off

java %1 %2 %3 %4 %5 %6 %7 %8 %9 -classpath%JIG_HOME%\classes;%JIG_HOME%\classes\jigsaw.zip;%JSDK_HOME%\servlet.jar;%CLASSPATH%org.w3c.jigsaw.Main -root %JIG_HOME%\Jigsaw

• Jigsaw Admin Batch File: @echo off

java -classpath%JIG_HOME%\classes\jigadmin.jar;%JIG_HOME%\classes\jigsaw.zip org.w3c.jigadmin.Main -root%JIG_HOME%\Jigsaw http://tao:8009

1106174542 Richard West 30

Confi gurin g FreeBuilder forPage Compilation and PSE Pro

CLASS PATH : E:\Java\Jigsaw\classes\jigsaw.zip;E:\Java\jsdk2.1\servlet.jar;E:\ODI\PSEPROJ3\pro.jar

CLASS OUTPUT PATH : E:\Java\Jigsaw\classes

1106174542 Richard West 31

Simple PersistentPage Compilation—1

<java type=import>import COM.odi.*;</java><java>/* A comment that doesn't appear in thegenerated page! */</java><html> <head> <title>Persistent DB Test</title> </head> <body> <h1>Counter</h1> <ul> <java> // *** NOTE THIS POINT *** try { // Matched on 3 Session.create(null, null).join(); Database db = null;

. . .

1106174542 Richard West 32

Simple PersistentPage Compilation—2

try { db = Database.open("test.odb", ObjectStore.OPEN_UPDATE); } catch (DatabaseNotFoundException dbnfe) { db = Database.create("test.odb", ObjectStore.ALL_READ | ObjectStore.ALL_WRITE); } Transaction tr = Transaction.begin(ObjectStore.UPDATE); Integer count = null; try { count = (Integer)db.getRoot("Count"); } catch (DatabaseRootNotFoundException dbrnfe) { count = new Integer(1); db.createRoot("Count", count);} . . .

1106174542 Richard West 33

Simple PersistentPage Compilation—3

for (int i = 1; i <= count.intValue(); i++) { out.println ("<li> item #" + i); } db.setRoot("Count", new Integer(count.intValue()+1)); tr.commit(); db.close(); } finally { // Matches try from 1 Session.getCurrent().terminate(); } </java> // *** NOTE THIS POINT *** </ul> </body></html>

DONE!

1106174542 Richard West 34

Demonstration

Jigsaw and Pa ge Compilation with Persistence

1106174542 Richard West 35

Extendin g GeneratedFramefor Pa ge Compilation

<java type=import>import Test.PLib;</java><java type=extends>Test.PLib</java>

. . .

<java> // *** NOTE THIS POINT *** joinSession(); Transaction tr = Transaction.begin( ObjectStore.UPDATE); Integer count = (Integer)db.getRoot("Count"); count = new Integer(count.intValue()+1); for (int i = 1; i <= count.intValue(); i++) { out.println ("<li> item #" + i); } db.setRoot("Count", count); tr.commit(); leaveSession();</java> // *** NOTE THIS POINT ***

1106174542 Richard West 36

The Librar y—1

package Test;import java.util.Properties;import org.w3c.jigsaw.pagecompile.GeneratedFrame;import COM.odi.*;public abstract class PLib extends GeneratedFrame { protected static Database db = null; private static final String dbName = “test.odb", rootName = "Count"; public PLib() { } public static void joinSession() { Session.getGlobal().join(); } public static void leaveSession() { Session.getCurrent().leave(); } // Static initialiser goes here!} // - see next slide

1106174542 Richard West 37

The Librar y—2

static { // Goes into previous slide Properties props = System.getProperties(); props.put("COM.odi.useDatabaseLocking", "false"); Session global = Session.createGlobal(null,props); try { db = Database.open(dbName, ObjectStore.OPEN_UPDATE); } catch (DatabaseNotFoundException dbnfe) { db = Database.create(dbName, ObjectStore.ALL_READ | ObjectStore.ALL_WRITE); Transaction trans = Transaction.begin(ObjectStore.UPDATE); db.createRoot(rootName, new Integer(0)); trans.commit(); } global.leave();}

1106174542 Richard West 38

Questions & Break

1106174542 Richard West 39

Overview Part 2—Advanced Topics & Discussion

• Local Sessions

• Helper Classes for Session Management

• General Utilities

• Configuring Jigsaw for JavaServerPages TM software (JSP)

• The Counter Bean

• Using Persistent JSP

• Questions, Wrap Up & Discussions

1106174542 Richard West 40

Local Sessions and Utilities

• Global Sessions—fine for extremelysimple systems (i.e. demos)

• For Serious Threading, use Sessions» Update Library Code

• Need some ‘helper utilities’ to parsethe query string

1106174542 Richard West 41

The Local Librar y—1

package Test;import java.util.Properties;import org.w3c.jigsaw.pagecompile.GeneratedFrame;import COM.odi.*;public abstract class PLib extends GeneratedFrame { protected static Database db = null; protected static Session sess = null ; private static final String dbName = “test.odb", rootName = ”Count"; private static final Object rootInit = new Integer(0); public PLib() { } public static void joinSession() { sess.join(); } public static void leaveSession() { sess.leave(); } // Static initialiser goes after here!} // - see next slide

1106174542 Richard West 42

The Local Librar y—2

static { // Goes into previous slide Properties props = System.getProperties(); props.put("COM.odi.useDatabaseLocking", "false"); Session sess = Session.create(null,props); sess.join(); try { db = Database.open(dbName, ObjectStore.OPEN_UPDATE); } catch (DatabaseNotFoundException dbnfe) { db = Database.create(dbName, ObjectStore.ALL_READ | ObjectStore.ALL_WRITE); Transaction trans = Transaction.begin(ObjectStore.UPDATE); db.createRoot(rootName, new Integer(0)); trans.commit(); } sess.leave();}

1106174542 Richard West 43

General Utilities

package Test;import org.w3c.jigsaw.http.Request;import javax.servlet.http.HttpUtils;import java.util.Hashtable;public class PUtil{ public PUtil(Request req) { parms = HttpUtils.parseQueryString( req.getQueryString()); } public String getVal(String key) { String[] vals = (String[])parms.get(key); if (vals != null) return vals[0]; else return null; } private Hashtable parms = null;}

1106174542 Richard West 44

Site Structure

• Index page– Output Page : plotest.jhtml

• Page compilation Library Output TEST– Input Page : plitest.jhtml

• Page compilation Library Input TEST

• Input Processor : doPlitest.jhtml

1106174542 Richard West 45

plotest. jhtml

<java type=import>import COM.odi.*;</java><java type=import>import Test.PLib;</java><java type=extends>Test.PLib</java><html> <head> <title>Persistent DB Test</title> </head> <body> <java> joinSession(); Transaction tr = Transaction.begin( ObjectStore.READONLY); Integer count = (Integer)db.getRoot("Count"); out.println ("<H1>Current Number : " + count+"</H1>"); tr.commit(); leaveSession(); </java> <a href="/plitest.jhtml">Change Counter</a> </body></html>

1106174542 Richard West 46

plitest. jhtml

<java type=import>import COM.odi.*;</java><java type=import>import Test.PLib;</java><java type=extends>Test.PLib</java><html> <head><title>Persistent DB Input Test</title></head><body> <java> joinSession(); Transaction tr = Transaction.begin(ObjectStore.READONLY); Integer count = (Integer)db.getRoot("Count");</java> <form action="/doPlitest.jhtml" method="GET” enctype="application/x-www-form-urlencoded"> Enter New Current Number : <java> out.println("<input type=\"TEXT\" name=\"Count\” value= \""+count+"\"size=\"25\">"); </java> <input type="SUBMIT" name="Submit" VALUE="Submit"> </form> <H1>OR</H1> <a href="/plotest.jhtml">Current Value of Counter</a><java> tr.commit(); leaveSession(); </java> </body></html>

1106174542 Richard West 47

doPlitest. jhtml—1

<java type=import>import COM.odi.*;</java><java type=import>import Test.*;</java><java type=extends>Test.PLib</java><html> <head><title>Persistent DB Test</title></head> <body> <java> PUtil pu = new PUtil(request); String count = pu.getVal("Count"); Integer newCount = null; try { newCount = new Integer(count); joinSession(); Transaction tr = Transaction.begin(ObjectStore.UPDATE); Integer oldCount = (Integer)db.getRoot("Count"); db.setRoot("Count", newCount); tr.commit(); leaveSession(); </java>

1106174542 Richard West 48

doPlitest. jhtml—2

<H1>Change Successful!</H1> The number <java type=print>oldCount</java> has been sucessfully changed to <java type=print>newCount</java>. <P> Can <a href="/plotest.jhtml">Examine Current Value of Counter</a> or <a href="/plitest.jhtml">Change Current Value of Counter</a>. <java> } catch (NumberFormatException nfe) { </java> <H1>ERROR - Bad Number Format!</H1> Your number <java type=print>newCount</java> is not of the correct format. Please <a href="/plitest.jhtml">Go Back</a> and try again. <java> } </java> </body></html>

1106174542 Richard West 49

Demonstration

Input and Output to an Ob jectDatabase usin g Forms with

Page Compilation

1106174542 Richard West 50

Settin g Up Ji gsaw for JSP

– Get GNU JSP—http://www.xs4all.nl/~vincentp/gnujsp/

– Add JSP Servlet Resource– Add JSP ServletWrapper– Set Servlet Wrapper class– Add repository property to JSPServlet– Configured JSPServlet– Add Resource– Add jsp-indexer

1106174542 Richard West 51

Settin g Up Ji gsaw for JSP (Cont.)

– Add Resource to jsp-indexer– Configure FileResource for jsp-indexer– Add Frame to jsp-indexer– Add ServletMapperFrame to jsp-indexer– Configure ServletMapperFrame– Now, the way it works– Add Resource to default Indexer– Set up jsp extension for default

1106174542 Richard West 52

Add JSPServlet Resource

1106174542 Richard West 53

Add JSP ServletWrapper

1106174542 Richard West 54

Set Servlet Wrapper Class

1106174542 Richard West 55

Add Repositor yPropert y to JSPServlet

1106174542 Richard West 56

Confi gured JSPServlet

1106174542 Richard West 57

Add Resource

1106174542 Richard West 58

Add jsp-indexer

1106174542 Richard West 59

Add Resource to jsp-indexer

1106174542 Richard West 60

Confi gure FileResourcefor jsp-indexer

1106174542 Richard West 61

Add Frame to jsp-indexer

1106174542 Richard West 62

Add ServletMapperFrameto jsp-indexer

1106174542 Richard West 63

Confi gure ServletMapperFrame

1106174542 Richard West 64

Now, “The Wa y It Works”!

1106174542 Richard West 65

Add Resource to Default Indexer

1106174542 Richard West 66

Set Up jsp Extension for Default

1106174542 Richard West 67

Finally, a JavaBeans™ Architecture-Based Component and JSP!

• Not necessarily optimal structurefor performance

• JSP Spec on GNU JSP 0.99 basedaround JSP 0.92 which is quite differentto JSP 1.0!

1106174542 Richard West 68

Counter. java—Definition and Constructor

package Test;import java.util.Properties;import COM.odi.*;public class Counter{ protected static Database db = null; protected static Session sess = null; private static final String dbName = "test.odb", rootName = "Test"; private static final Object rootInit = new Integer(0); static { // Set up local Session with no Locking Properties props = System.getProperties(); props.put("COM.odi.useDatabaseLocking", "false"); sess = Session.create(null,props); sess.join();

1106174542 Richard West 69

Counter. java—Constructors

try { db = Database.open(dbName, ObjectStore.OPEN_UPDATE); } catch (DatabaseNotFoundException dbnfe) { db = Database.create(dbName, ObjectStore.ALL_READ | ObjectStore.ALL_WRITE); Transaction trans = Transaction.begin(ObjectStore.UPDATE); db.createRoot(rootName, rootInit); trans.commit(); } sess.leave(); } public Counter() { }

1106174542 Richard West 70

Counter. java—Get Accessor

public int getCount() { joinSession(); Transaction tr = Transaction.begin(ObjectStore.READONLY); Integer count = (Integer)db.getRoot("Count"); int counti = count.intValue(); tr.commit(); leaveSession(); return counti; }

1106174542 Richard West 71

Counter. java—Set Accessorand Session Methods

public void setCount(int newCounti) { Integer newCount = new Integer(newCounti); joinSession(); Transaction tr =

Transaction.begin(ObjectStore.UPDATE); Integer oldCount = (Integer)db.getRoot("Count"); // Put counter back, commit & leave db.setRoot("Count", newCount); tr.commit(); leaveSession(); } protected static void joinSession() { sess.join(); } protected static void leaveSession() { sess.leave(); }}

1106174542 Richard West 72

Site Structure

• Index page– Output Page: botest.jsp

• Bean Output TEST– Input Page: bitest.jsp

• Bean Input TEST

• Input Processor: doBitest.jhtml

1106174542 Richard West 73

botest. jsp

<%@ import="Test.Counter" %>

<html>

<head>

<title>Persistent DB Test</title>

</head>

<body>

<H1>Current Number :

<BEAN name="Counter" type="Test.Counter"></BEAN>

<%= Counter.getCount() %>

</H1>

<a href="/bitest.jsp">Change Value of Counter</a>

</body>

</html>

1106174542 Richard West 74

bitest. jsp

<%@ import="Test.Counter" %><html> <head> <title>Persistent DB Input Test</title> </head><body> <form action="/doBitest.jsp" method="GET” enctype="application/x-www-form-urlencoded"> Enter New Current Number : <BEAN name="Counter" type="Test.Counter"></BEAN> <% out.println("<input type=\"TEXT\" name=\"Count\” value=\""+Counter.getCount()+"\" size=\"25\">");%> <input type="SUBMIT" name="Submit" VALUE="Submit"> </form> <H1>OR</H1> <a href="/botest.jsp">Current Value of Counter</a></body></html>

1106174542 Richard West 75

doBitest. jhtml—1

<%@ import="Test.Counter" %><html> <head> <title>Persistent DB Test</title> </head> <body> <BEAN name="Counter" type="Test.Counter"></BEAN> <% String count = request.getParameter("Count"); Integer newCount = null; try { int oldCount = Counter.getCount(); // Parse New Count newCount = new Integer(count); Counter.setCount(newCount.intValue()); %>

1106174542 Richard West 76

doBitest. jhtml—2

<H1>Change Successful!</H1>

The number <%= oldCount %> has been sucessfully

changed to <%= newCount %>. <P> You can now

<a href="/botest.jsp">Examine Counter</a> or

<a href="/bitest.jsp">Change Counter</a>.

<% } catch (NumberFormatException nfe) { %>

<H1>ERROR - Bad Number Format!</H1> Your number <%= count %> is not of the correct format.

Please <a href="/bitest.jsp">Go Back</a> and try again.

<% } %>

</body>

</html>

1106174542 Richard West 77

Input and output to an Ob jectDatabase usin g forms with

JavaServer Pa gesTM software (JSP)

Demonstration

1106174542 Richard West 78

Real World Applications

• MoDelta

– Written in 9 person-months– All JavaTM technology based– HTML 3.2 and up compatible– Fast! —runs on a UltraTM 1 platform from Sun!!!– http://www.vwebd.com

• Brief Tour

1106174542 Richard West 79

Thanks

• The Java Web Server™ software product team– Thanks for the memories

• The Jigsaw Web Server team– Thanks for the future!

• GNUJSP

• Freebuilder—www.freebuilder.com

• Sun—Cool Technology and the JavaOne SM

conference!

• YOU—Have fun and use persistent objects ‘Au-Naturale’!!!

1106174542 Richard West 80

Wrap Up

Questions and Discussion

1106174542 Richard West 81

Recommended