Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Šta je PolyJsp?

PolyJsp je proširena JSP implementacija,dizajnirana da podržava multiple scripting languages i multiple JSP versions.

Potpuno bazirana na XML i XSL, PolyJsp trenutno podržava Java, Javascript i WebL kao skriptovani jezici. Podrška je obezbeđena za poslednju JSP spec (0.92), sa nekim izuzecima dokumentovanim ispod.

PolyJsp je besplatan, open source proizvod. Programeri su ohrabreni da doprinesu njegovom razvoju i unapređenju.

Komentari i sugestije mogu se poslati na Ricardo Rocha .

Background

PolyJsp je direktni naslednik ESP (EcmaScript Pages), servlet korišćen za autorizaciju dinamičkih web stranica u EcmaScript.

Ono što je počelo kao "jednostavan" napor da napravite ESP JSP-usaglašen je i na kraju doveo do poliglote, proširene implementacije.

ESP korisnici su ohrabreni da unaprede PolyJsp kao što joj je EcmaScript procesor je povratan -kompatibilan sa ESP i dalja poboljšanja na ovom proizvodu će biti razvijena kada je PolyJsp pušten.


Ciljevi

PolyJsp ima za cilj:

  • Suočavanje sa nekompatibilnom verzijom,predstavljenim razvojem JSP standarda.
  • Isporučuju JSP obećanja,podržana sa više skriptovanih jezika

Prvi cilj je relevantan jer je većina trenutnih JSP implementacija bazirana na specifikaciji starosti 0.91 i uprkos njihovim uspostavljenim kodnim osnovama, njihova sintaksa može biti zastarela kada JSP nastavlja da se razvija.

Višejezična podrška, sa druge strane, je poželjna da iskoristi potencijalne autorske prethodne poznatosti sa "poznatim" jezicima. Takođe se poziva za podršku web izdavanja dinamičkih sadržaja,generisanih specijalnim aplikacijama napisanih u polju -specifični jezici.

U slučaju Javascript, posebno, HTML autorima sigurno koristi upotreba jednog jezika za oba servera i skriptovane strane klijenta.

Zabeleška: u ovom dokumentu,zvanom JavaScript i EcmaScript su korišćeni naizmenično


Karakteristike

Zahvaljujući PolyJsp's proširivom dizajnu, novi jezici i verzije mogu se lako dodati na uglavnom deklerativan način.

U principu, bilo koji jezik koji postoji Java interpretira,može se dodati PolyJsp-ovom repertoaru. Oni trenutno rangiraju preko 60 jezika,od klasičnih do eksperimentalnih i sofisticiranih. Za više informacija o dostupnim jezicima, videti Robert Tolksdorf's Programming Languages for the Virtual Java Machine .

Jezici koji nisu Java interpretirani,mogu biti podržani sredstvima proste inter-process komunikacije (npr. stdin/stdout, CORBA-based IPC). Druga opcija je JDBC-bazirana na izvršenju izvoda blokova,napisanih u proceduralnoj ekstenziji u SQL, kao što je Oracle's PL/SQL.

Novi procesorski jezik može lako biti dodat kao specijalizovani Java časovi ili kao XML deklarativni jezik,definisan "scripted" sa Javascript. Skriptovani pristup je bio uspešno testiran da dokaže podršku za svoje Java jezike kao i za (Dartmouth) Basic.

Dodajući novu verziju još je lakše,jer on podrazumeva pisanje deklarativne definicije JSP verzije tagova (mali XML file) i jedan ili više jezika -specifičnog šablona (XSL stylesheets opciono ukrašene sa generativnim kodom Javascript extenzije)

Verzija tag sintakse datoteka,su dinamički učitani parser i izvršavanju na per-script osnovi; tako, PolyJsp može podržati više verzija istovremeno.

Izvorni generativni kod je implementiran kao XSL stylesheets koji transformišu DOM stablo, proizvodi JSP parser unutar jednakih programa napisanih u target scripting jeziku.


Trenutni status

U njegovoj trenutnoj alpha verziji, PolyJsp podržava Java, Javascript i WebL, kao što je JSP 0.92 spec.

JSP directives (<%@%>), declarations (<SCRIPT RUNAT="server">), scriptlets (<%%>) i expressions (<%=%>) su potpuno podržani.

Podrška za <BEAN> i udružene tagove su trenutno u razvoju,zajedno sa runtime bibliotekom koji pruža upravljanje i introspekcija.

PolyJsp predstavlja nekoliko (opcionih) extenzija u JSP:

  • A <%@ version="..." > directive
    Korisno za instrukciju korišćenja parser verzije drugačije po sadržaju (trenutno 0.92)
  • A <%@ contenttype="..."> directive
    Korisno za slučajeve u kojima se očekuje izlaz MIME kucanja je drugačije od text/html
  • A <header name="..." value="...">
    Korisno je da podesite zaglavlja odgovora. Primer: namestite expires da kontrolišete browser chaching

Za Java jezik, PolyJsp obezbeđuje kompletnu servlet generaciju, katalogizaciju i kompilaciju kao automatski pretovar. Trenutno, ugrađen Sun compiler je iskorišćen.

Za Javascript, PolyJsp koristi FESI i obezbeđuje neprekidni izvorni generativni kod,automatsko premotavanje i ocenjivanje udruživanja da ubrza izvršenje. Uprkos njihovoj interpretiranoj prirodi, Javascript stranice objavljuju pri brzinama uporedivim sa njihovim Java pandanima.

Za WebL, PolyJsp obezbeđuje stalni izvorni generativni kod i automatsko premotavanje.Kao u slučaju Javascript , WebL stranice ostvaruju brzine uporedive sa Java.


Kako PolyJsp radi?

Glavne PolyJsp komponente su :

  • Proširivi Parser, napisan u JavaCC
  • Jezički procesor. Interfejs je implementiran ili proceduralno ili deklarativno
  • Source Code Generator. Implementiran kao XSL stylesheet processor
  • Script Executive. Implementiran kao Java servlet i script cache
  • Runtime Environment. Java biblioteka obezbeđuje opštu podršku za JSP konstrukcije

Ove komponente su integrisane unutar sledećeg protoka izvršenja:

  1. JSP script zahtev je primljen preko izvršnog servlet

  2. Zahtev URL je preveden na datoteku referenci,lokalno dostupan na servlet mašini

  3. Rezultat imena fajla je izgledao kao JSP script u script cache. Ukoliko se utvrdi (i trenutno), kontrola je prešla na njegov udruženi object program; inače, JSP parser je pozvan da ga obradi

  4. Baziran na JSP script's verziji, parser ga prevodi unutar jednake, jezički-nezavisne DOM tree reprezentacije (XML)

  5. Baziran na JSP script jeziku i verzija, na XSL stylesheet je selektovana i primenjena na DOM tree proizvedena od strane parser. Rezultirajući source program je sačuvan u stage directory gde je sačuvan programski fajl za sledeću PolyJsp instantiations

  6. Compile rukovalac za script jezik, ako je obezbeđena, pozivaju da sastavi source program i generišu object program. Ovaj fajl je takođe sačuvan u stage directory

  7. Load handler za scriptovani jezik je pozvana da učita odgovarajući source/object program unutar memorije i smesti ga na script cache

  8. Poslednja modifikacija datuma sa originalnog JSP scripta i njegovog udruženog source/object program file se porede. Ako je JSP script novija od programa, to je reparsed, rekompajlirano i premotano. Tokom ovog procesa, unload handler za script jezik, ako je obezbeđena, je pozvana,tako da je object program poništen i uklonjen iz memorije. Odgovarajući script cache ulaz, ako je postojao,je osvežen

  9. Execute handler za script jezik je pozvana na object program sa servlet's request i response objekti kao argumenti

  10. Programski izlaz (koji može biti učitan) je poslat na pretraživač

Tokom ovog procesa, stanje grešaka je zarobljeno i prijavljeno korisnicima bilo putem scripte-specifikovane error page ili servlet-generisane HTML error message. Output buffering može biti iskorišćen da se izbegne garbling program output i servlet error stranice.


Proširivi Parser

Kao generalno pravilo, verzija-specifični JSP tagovi (kao što su <USEBEAN> ili <DISPLAY>) nisu izgrađeni unutar parser's lexical proizvodnje; radije, naprave posebnim putem dinamički tražene XML version tag file. Ovo je suština verzije nezavisnog mehanizma.

JSP directives (<%@ ... %>), scriptlets (<% ... %>) i izrazi (<%= ... %>) su direktno prepoznati parserom.

Takođe prepoznat parserom je <SCRIPT RUNAT="server"> tag. Ovo je specijalan slučaj jer <SCRIPT> tag može biti legitimno predstavljen kao u client-side code.

Konačno, NCSA directive (kao što su <!--# include>) su takođe prepoznate parserom, iako ovako može biti onesposobljen da dozvoli web serveru lično da ga obradi.

Izbor JSP verzije vrši se tokom rada i na per-script osnovi. Zbog toga,isti PolyJsp primeri mogu podržavati više verzija istovremeno.

A PolyJsp propietary directive tag (<%@ version="..." >) je dodat dozvoljenim skriptama da odrede posebne verzije. U odsustvu odabrane verzije, trenutna implementacija sadržaja na 0.92, iako ovo može biti poništeno postavljanjem polyjsp.default.version system property.

U istoj veni, i prema specifikaciji, sadržaj language directive na java; opet, ovo može biti promenjeno postavkom polyjsp.default.language sistemske imovine.

U zavisnosti od odabrane verzije, parser dinamički traži odgovarajući tag,po definiciji xml file. Za verziju 0.92 ovaj file sadrži:

       <tags>
         <tag name="comment" empty="true" body="true"/>
         <tag name="declaration" empty="false" body="false"/>
         <tag name="errorpage" empty="true" body="false"/>
         <tag name="import" empty="true" body="false"/>
         <tag name="language" empty="true" body="false"/>
         <tag name="boilerplate" empty="true" body="true"/>
         <tag name="display" empty="true" body="true"/>
         <tag name="excludeif" empty="false" body="true"/>
         <tag name="expression" empty="true" body="true"/>
         <tag name="include" empty="true" body="true"/>
         <tag name="includeif" empty="false" body="true"/>
         <tag name="loop" empty="false" body="true"/>
         <tag name="scriptlet" empty="true" body="true"/>
         <tag name="setfromrequest" empty="true" body="true"/>
         <tag name="setoncreate" empty="true" body="true"/>
         <tag name="usebean" empty="false" body="true"/>
         <!-- Non-standard tags added by PolyJsp -->
         <tag name="contenttype" empty="true" body="false"/>
         <tag name="header" empty="true" body="false"/>
       </tags>
      

gde je upotreba boolean atributa:

Osobine Značenje
prazan Ovo je prazan tag,ne sadrži umetnute subtagove ili tekst
telo Ovaj tag nije direktiva ili deklaracija,mora biti napravljen generisani deo source program

Izvan ove klasifikacije (jedino treba kontrolisati raščlanjivanje rekurzije i drvo generacije), parser ne dozvoljava interpretaciju aktuelnog sadržaja JSP tagova.

Sav remaining JSP script sadržaj (tipični HTML tagovi i običan tekst) je tretiran kao boilerplate i izdvojen doslovno unutar generisanog tela DOM stabla.

Za detalje u vezi strukture i sadržaja JSP DOM stabala, molim vas pogledajte JSP 0.92 DTD .

Verzija DTD's je korišćena da potvrdite vrednosti JSP tag atributa,kao i tag i boilerplate nesting tokom izgradnje DOM stabla.


Definicija skriptovanog jezika

Skriptovani jezici su definisani u XML file,učitani i pokrenuti. Za Java i Javascript ovaj fajl sadrži:

      <languages>
        <language
          name="java"
          source-extension="java"
          object-extension="class"
          processor="org.plenix.jsp.language.java.JavaProcessor"
        >
          <version name="0.92" stylesheet="java-0.92.xsl"/>
        </language>
        <language
          name="ecmascript|javascript"
          source-extension="es"
          processor="org.plenix.jsp.language.ecmascript.ESProcessor"
        >
          <version name="0.92" stylesheet="ecmascript-0.92.xsl"/>
          <version name="0.91" stylesheet="ecmascript-0.91.xsl"/>
          <param name="extension" value="FESI.Extensions.BasicIO,FESI.Extensions.FileAccess,FESI.Extensions.Database"/>
        </language>
      </languages>
      

gde processor Java class implementira LanguageProcessor interface.

Alternativno, jezički procesori mogu biti definisani ugrađenim EcmaScript rukovaocima u <language> tag kao sledeći:

      <language name="..." source-extension="..." object-extension="..." />
	...
        <init-script>
	  // Init logic
	  ...
        </init-script>

        <compile-script>
	  function compileProgram(baseName, path) { ... }
        </compile-script>

        <load-script>
	  function loadProgram(baseName, path) { ...; return objectProgram }
        </load-script>

        <unload-script>
	  function unloadProgram(objectProgram) { ... }
        </unload-script>

        <execute-script>
	  function executeProgram(objectProgram, request, response) { ... }
        </execute-script>
      </language>
      

Funkcionalna imena i potpisi moraju biti određeni kao što je pokazano iznad. Međutim, samo loadProgram i executeProgram funkcije su obavezne.

Za primer skriptovanog jezičkog procesora, molim vas pogledajte pojednostavljenu scripted Java language definition .


Izvorni generacijski kod

Izvorni kod je generisan primenom XSL stylesheets na DOM stabla izgrađenih analizatorom. Odvojene XSL stylesheet su potrebne za svaki language/version par.

Za primer generacijskog koda XSL stylesheet, molim vas pogledajte pojednostavljenu EcmaScript 0.92 stylesheet .

      <%@ version="0.92" %>
      <%@ language="javascript" %>
      <%@ contenttype="text/html" %>

      <header name="expires" value="Tues, 01 Jan 1980 00:00:00 GMT">

      <%@ import="util.es" %>

      <SCRIPT RUNAT="server">
        var accessCount = 0;
      </SCRIPT>

      <%
        var today = new Date();
      %>

      <HTML>
      <HEAD>
      <TITLE>A PolyJsp Demo</TITLE>
      </HEAD>
      <BODY BGCOLOR="#ffffff">
      <H1><FONT COLOR="navy">A PolyJsp Demo</FONT></H1>
      <P>
      This page has been accessed <%= ++accessCount %> times so far.
      <P>
      Generated by PolyJsp on <%= today %>
      </BODY>
      </HTML>
      

Ovako, date su sledeće ulazne JSP scripte:

      <jsp-script name="sample.jsp">
        <version>0.92</version>
        <language>javascript</language>
        <import>util.es</import>
        <contenttype>text/html</contenttype>
        <header name="expires" value="Tues, 01 Jan 1980 00:00:00 GMT"/>
        <declaration><![CDATA[
	  var accessCount = 0;
	]]></declaration>
        <body>
          <scriptlet><![CDATA[
            var today = new Date();
          ]]></scriptlet>
          <boilerplate><![CDATA[\n\n<HTML><HEAD><TITLE>A PolyJsp Demo</TITLE></HEAD><BODY BGCOLOR=\"#ffffff\">\n]]></boilerplate>
          <boilerplate><![CDATA[<H1><FONT COLOR=\"navy\">A PolyJsp Demo</FONT></H1><P>\n]]></boilerplate>
          <boilerplate><![CDATA[This page has been accessed \n]]></boilerplate>
          <expression><![CDATA[++accessCount]]></expression>
          <boilerplate><![CDATA[ times so far.\n]]></boilerplate>
          <boilerplate><![CDATA[<P>\n]]></boilerplate>
          <boilerplate><![CDATA[Generated by PolyJsp on \n]]></boilerplate>
          <expression><![CDATA[today]]></expression>
          <boilerplate><![CDATA[</BODY></HTML>\n]]></boilerplate>
        </body>
      </jsp-script>

PolyJsp's parser će proizvoditi DOM stabla jednaka sledećem XML documentu:

Kao što je iznad pomenuto EcmaScript 0.92 stylesheet je primenjen na ovo DOM stablo,sledeći Javascript izvorni fajl će biti generisan:

      
      // User imports
      load("util.es");
        
      // Declarations
      var accessCount = 0;
        
      function service(servletrequest, servletresponse) {
        var headerCount = 0;
        var headers = new Array();
      
        var errorPage = null;
        var contentType = "text/html";
      
        var input = servletrequest.getReader();
        var output = servletresponse.getWriter();
        
        servletresponse.setContentType(contentType);

	headers[headerCount++] = new Header("expires", "Tues, 01 Jan 1980 00:00:00 GMT");
      
        for (var i = 0; i < headers.length; i++) {
          servletresponse.setHeader(headers[i].name, headers[i].value);
        }
      
        // User code
        var today = new Date();
        output.print("\n\n<HTML><HEAD><TITLE>A PolyJsp Demo</TITLE></HEAD><BODY BGCOLOR=\"#ffffff\">\n");
        output.print("<H1><FONT COLOR=\"navy\">A PolyJsp Demo</FONT></H1><P>\n");
        output.print("This page has been accessed \n");
        output.print(++accessCount);
        output.print(" times so far.\n");
        output.print("<P>\n");
        output.print("Generated by PolyJsp on \n");
        output.print(today);
        output.print("</BODY></HTML>\n");
      }
      

Download

Avanturistički može download trenutnu alpha verziju u polyjsp.tgz (188k). Molim vas zabeležite to da je,za sada, ovo jedina (funkcionalna) svakodnevna snapshot.

Prva beta verzija biće napravljena kratko na raspolaganju sa kompletnom Javadoc dokumentacijom.

PolyJsp zahteva sledeće dodatne alatke:

  • IBM's Xml4j XML processor
  • Keith Visco's Xslp XSL processor
  • Jean-Marc Lugrin's FESI EcmaScript interpreter
  • Opciono, Compaq's WebL interpreter

Ove biblioteke su uključene u polyjsp.tgz distributivni fajl.Zabeležite to, trenutno, PolyJsp requires specifične verzije ovih proizvoda koji su uključeni u distribuciju. Posao je u toku da unaprede PolyJsp na poslednju verziju XML i XSL procesora.

Instalacija

Da bi instalirali PolyJsp morate imati :

  • Funkcionalno,konfigurisan web server
  • Funkcionalno, konfigurisanu servlet mašinu
  • 1.1 JDK koji obuhvata the sun.tools.javac compiler

PolyJsp zahteva instalaciju direktorijuma koji će biti dostupan vašoj servlet mašini. Ova struktura je sadržana u polyjsp.tgz distributivnom fajlu sa sledećim subdirektorijumima:

  • config. Ovaj direktorijum sadrži sve xml i xsl izvorne fajlove korišćene za PolyJsp. Vaš servlet mašinski proces mora imati učitan pristup u ovaj direktorijum.
  • stage. Ovaj direktorijum će nositi generativni izvor i object programe. Vaš servlet mašinski proces mora imati read/write pristup u ovaj direktorijum.
  • lib. Ovaj direktorijum sadrži polyjsp.jar class library.

Za konfiguraciju PolyJsp na vaš web server/servlet engine environment pratite sledeće korake:

  1. Extract polyjsp.tgz na pristupnu lokaciju na vašu servlet mašinu
  2. Dodajte biblioteku polyjsp.jar na vaš CLASSPATH i/ili servlet engine class tražite put
  3. Dodavanjem biblioteka xml4j.jar, xslp.jar i fesi.jar vašem CLASSPATH i/ili servlet engine class tražite put
  4. Registrujte class org.plenix.jsp.JspServlet sa vašom servlet mašinom
  5. Dodavanjem init parametara za vaš servlet org.plenix.jsp.JspServlet:
    Parameter Required? Default Value Contents
    configurationDirectory Yes   Direktorijum sadrži PolyJsp XML/XSL resource fajlove.

    Ovo je normalan subdirektorijum config ispod vašeg PolyJsp instaliranog direktorijuma
    stageDirectory Yes   Direktorijum da postavi generisani izvor i object fajlovi.

    Ovo je normalan subdirektorijum stage ispod vašeg PolyJsp instaliranog direktorijuma
    defaultLanguage No java Jezik će biti upotrebljen kada JSP scripts nisu eksplicitno navela jezik
    defaultVersion No 0.92 Verzija će biti upotrebljena kada JSP scripts nisu eksplicitno navela verziju

  6. Udružena ekstenzija sa servlet org.plenix.jsp.JspServlet. Tipično,ali ne obavezno, ova ekstenzija je .jsp.

Related Free/Open-Source projekti

  • ASPy. Non-JSP razvojne alatke za izgradnju dinamičkih web stranica u Python.
  • ESP. Non-JSP razvojne alatke za izgradnju dinamičkih web stranica u EcmaScript.
  • GNUJSP. Besplatna implementacija JSP 0.91 za Java
  • Resin. JSP implementacija za (sastavljenu!!) Javascript
  • SJSP. A JSP 0.92 implementacija za Java koja koristi compile-time introspekciju
  • zJSP. Besplatna implementacija JSP 0.91 za Java

Krediti

Posebno zahvaljujemo Peter Saitz (Optical Arts) za njegovu neprocenjivu kontrolu kvaliteta i neumoljiv bug-hunting.

Posebna zahvalnost Alfonzo Forgione (AF Advanced Systems) za njegovo sponzorstvo i nastavak podrške PolyJsp.

Zahvaljujemo, takođe, svim programerima iza free/open-source products koji su koristili za razvoj PolyJsp:





Published (Last edited): 07-04-2013 , source: http://www.plenix.org/older/polyjsp/