Subsections


C. Przykładowe aplikacje

Jako przykład zastosowania LSP, zamieszczono tu dwa krótkie programy będące częścią prezentacji na seminarium Systemy Rozproszone, poświęconej właśnie LSP. Nie jest to oczywiście kompletny system, ale ukazuje sporą część możliwości środowiska.

1 Strona główna

<?xml version="1.0" encoding="iso-8859-2"?>
<?xml-stylesheet type="text/xsl" href="lsp.xsl"?>
<lsp:application name="XRP" 
 xmlns:lsp="http://nutki.com/NS/lsp-1.0">
<lsp:param name="chapter"/>
<content>

  <head>
  <lsp:choose>
    <lsp:if check="{$chapter}">
      <b>[ - ]</b>
    </lsp:if>
    <lsp:else>
      <b>[ <link href="index.lsp">Home</link> ]</b>
    </lsp:else>
  </lsp:choose>
  </head>

  <lsp:choose>
    <lsp:if check="$chapter!=''">
      <lsp:include src="intro.lsp"/>
      <bigbox title="Fortune">
        <cmd>
          <lsp:call function="exec" param="/usr/games/fortune"/>
        </cmd> 
      </bigbox>
    </lsp:if>  
    <lsp:else>
      <lsp:include src="chapter{$chapter}.xml"/>
    </lsp:else>
  </lsp:choose>

  <smallbox title="Spis treści">
    <A HREF="index.lsp?chapter=1">1: Tech</A><BR/>
    <A HREF="index.lsp?chapter=2">2: Język</A><BR/>
    <A HREF="index.lsp?chapter=3">3: Autoryzacja</A><BR/>
    <A HREF="index.lsp?chapter=4">4: Formularze</A><BR/> 
    <A HREF="index.lsp?chapter=5">5: Sesja</A><BR/>
    <A HREF="index.lsp?chapter=6">6: Cache</A><BR/>
    <A HREF="index.lsp?chapter=7">7: Rozszerzenia</A><BR/>
  </smallbox>    

  <smallbox title="Links">
    <l><link href="http://bibliotgrafia.icm.edu.pl">Publikacje UW</link></l>
    <l><link href="http://nutki.com/moviedb/">Katalog filmów</link></l>
    <l><link href="http://nsdn.nutki.com/">NSDN</link></l>
    <l><link href="http://democsm.nutki.com/">CSM (demo)</link></l>
  </smallbox>

</content>
</lsp:application>

Przedstawiona aplikacja określa podstawowe elementy strony, treść jest ładowana bądź z pliku intro.lsp, bądź (jeśli ustawiona jest zmienna chapter) z pliku zawierającego treść wybranego rozdziału.

Poza tymi operacjami tworzone są elementy wspólne dla każdego z tych rozdziałów. Całość wygenerowanej treści przetworzona zostanie przez arkusz stylów XSLT.

2 Edycja użytkowników

<?xml version="1.0" encoding="iso-8859-2"?>
<?xml-stylesheet type="text/xsl" href="lsp.xsl"?>
<lsp:application name="User Admin" 
 xmlns:lsp="http://nutki.com/NS/lsp-1.0"
 class="system" group="1" level="3">

<lsp:param name="group_id"/>
<lsp:param name="field_user_id"/>
<lsp:set name="user_id" value="{$field_user_id}"/>
<lsp:query table="users" key="user_id">
  <lsp:set param="group_id" value="{$users/group_id}"/>
</lsp:query>

<lsp:choose>
<lsp:if check="$users/user_id > 0">
  <lsp:set name="group_id" value="{$users/group_id}"/>
  <lsp:set name="header" value="Użytkownik: {$users/login}"/>
  <lsp:set name="action" value="update"/>
  <lsp:set name="profil" value="{$users/profile_id}"/>
</lsp:if>
<lsp:else>
  <lsp:set name="header" value="Nowy użytkownik"/>
  <lsp:set name="action" value="create"/>
  <lsp:set name="profil" value="1">
  <lsp:query table="groups" key="group_id">
    <lsp:if test="$groups/parent_id = 1">
      <lsp:set name="profil" value="2">
    </lsp:if>
  </lsp:query>
</lsp:else>
</lsp:choose>

<content>
  <head>
    <b>[ <link href="index.lsp">Home</link> ]</b>
  </head>
  <bigbox title="{$header}">
  <lsp:form table="users" key="user_id" page="index.lsp?chapter=4">

  <TABLE>
  <TR>
    <TD>Login <FONT COLOR=RED>(*)</FONT></TD>
    <TD>
       <lsp:input name="login" type="string(1,16)">
    </TD>
    <TD>Profil zabezpieczeń</TD>
    <TD>
       <lsp:link name="profile_id" table="profiles" label="name"
        filter="profile_id>={bind($LSPauth/profile)}" 
        value="{$profil}">
    </TD>
    <lsp:if check="$action = 'create'">
    <lsp:include src="passwd.lsp"/>
    </lsp:if>
  </TR>
  <TR>
    <TD>Imię <FONT COLOR=RED>(*)</FONT></TD>
    <TD>
      <lsp:input name="name" type="string(1,32)">
    </TD>
    <TD>Nazwisko <FONT COLOR=RED>(*)</FONT></TD>
    <TD>
      <lsp:input name="surname" type="string(1,32)">
    </TD>
  </TR>
</TABLE>

<lsp:input type="hidden" name="group_id" value="{$group_id}"/>
<BR><FONT COLOR=RED>(*)</FONT> Pole obowiązkowe</BR>
<lsp:button name="OK" action="submit"/>
<lsp:button name="Cancel" action="cancel"/>
</lsp:form>

</bigbox>
</content>
</lsp:application>

Ten przykład zawiera przede wszystkim kod tworzący formularz obsługujący edycję i dodawanie użytkowników systemu. Całość programu, podobnie jak poprzedni przykład, zostanie przetworzona przez procesor XSLT. Używany arkusz stylów zachowuje już istniejące znaczniki HTML, dzięki temu możliwe jest wstawienie formularza w tabelkę.

Główny element programu (lsp:application) wykorzystuje atrybuty autoryzacyjne, odbierając dostęp niepowołanym użytkownikom.

3 Pełne przykłady

Na płytce dołączonej do pracy znajduje się pełny kod aplikacji MovieDB oraz kilka małych programów przykładowych. Można także znaleźć tam kod przeglądarki publicznej systemu Bibliografia UW, jednak wykorzystuje ona poprzednią wersję systemu, o nieco innej składni.