first shot to a docu of servlets
This commit is contained in:
parent
08eee1915b
commit
67d1587e72
|
@ -0,0 +1,306 @@
|
|||
\documentclass{article}
|
||||
|
||||
\usepackage[latin1]{inputenc}
|
||||
\usepackage{alltt}
|
||||
\usepackage{tex2page}
|
||||
|
||||
\author{Andreas Bernauer \and Martin Gasbichler}
|
||||
\title{The Servlet Handler of the \textit{SUnet} Web Server}
|
||||
|
||||
\input{../../../doc/latex/decls}
|
||||
|
||||
\begin{document}
|
||||
\maketitle
|
||||
\begin{abstract}
|
||||
\noindent The Scheme Untergrund Network Package (\textit{SUnet} for
|
||||
short) comes along with a modular web server. The servlet handler
|
||||
described here extends it by the capability of writing programs in
|
||||
Scheme, that yield an HTML page.
|
||||
|
||||
Suspending of servlet computation.
|
||||
Using Oleg's SXML.
|
||||
|
||||
blabla and something more.
|
||||
\end{abstract}
|
||||
|
||||
\section{How to write a servlet}
|
||||
|
||||
Use this skeleton to get started quickly:
|
||||
\begin{alltt}
|
||||
(define-structure servlet servlet-interface
|
||||
(open servlets
|
||||
scsh
|
||||
scheme
|
||||
; more packages...
|
||||
)
|
||||
(begin
|
||||
|
||||
(define (main req)
|
||||
; This is the entry point.
|
||||
)
|
||||
|
||||
;; Add more definitions here.
|
||||
))
|
||||
\end{alltt}
|
||||
|
||||
See the examples for further informations.
|
||||
|
||||
\section{The \texttt{servlets} structure}
|
||||
|
||||
\defun{send/suspend}{response-maker}{request}
|
||||
\defunx{send/finish}{response}{\noreturn}
|
||||
\defunx{send}{response}{\noreturn}
|
||||
\defunx{send-html/suspend}{SXML-maker}{request}
|
||||
\defunx{send-html/finish}{SXML}{\noreturn}
|
||||
\defunx{send-html}{SXML}{\noreturn}
|
||||
\begin{desc}
|
||||
These procedures let the server send a response to the client. From
|
||||
the servlet's point of view, \ex{send/suspend} suspends the current
|
||||
computation, calls \semvar{response-maker} with an argument and lets
|
||||
the server send it to the client. \semvar{response-maker} is a
|
||||
procedure getting one argument, the ``continuation address'' and
|
||||
yielding a valid response---\ie an \ex{httpd} \ex{response}
|
||||
object. See the manual of the \ex{httpd} for details about
|
||||
generating such an object. If you use SXML, you won't need the
|
||||
details, though. If the browser sends a request to the
|
||||
``continuation address'', the computation of the servlet is resumed
|
||||
and \ex{send/suspend} returns the browser's request. Note that,
|
||||
technically, the computation is not really suspended---it just
|
||||
looks this way from the servlet's point of view.
|
||||
|
||||
\ex{send/finish} returns the \semvar{response} to the server and
|
||||
finishes the computation of the servlet---\ie the instance of the
|
||||
servlet will not accept any more requests. \semvar{response} must be
|
||||
a valid \ex{httpd} \ex{response} object.
|
||||
|
||||
\ex{send} returns the \semvar{response} to the server. It does not
|
||||
finish the computation of the servlet, although it does not
|
||||
return---\ie the instance of the servlet may accept future
|
||||
requests. Usually, you won't need this procedure.
|
||||
|
||||
The \ex{send-html...} procedures do the same as their counterparts
|
||||
sans \ex{-html}, except that the expect SXML objects rather than
|
||||
response objects. SXML objects are lists that describe an HTML
|
||||
page---\eg
|
||||
\begin{alltt}
|
||||
`(html (title "My Homepage")
|
||||
(body (h1 "Welcome to my homepage!")
|
||||
(p "How are you?")))
|
||||
\end{alltt}
|
||||
\end{desc}
|
||||
|
||||
|
||||
\defun{form-query}{string}{bindings}
|
||||
\defunx{get-bindings}{req}{bindings}
|
||||
\begin{desc}
|
||||
\ex{form-query} does the same as \ex{cgi-form-query}: It parses the
|
||||
\semvar{string} that may be the search part of a \ex{GET} request
|
||||
line into an association list of bindings---\eg
|
||||
\begin{alltt}
|
||||
(form-query "button=on&select=13")
|
||||
==> '(("button" . "on") ("select" . "13"))
|
||||
\end{alltt}
|
||||
|
||||
You can get the search part of a \ex{GET} request \ex{request} by
|
||||
using \codex{(http-url:search (request:url request))} This is how
|
||||
\semvar{get-bindings} accesses the search part, if \ex{req} is a
|
||||
\ex{GET} request. If it is a \ex{POST} request, though, it reads the
|
||||
string from the associated input port. In both cases, \ex{GET} or
|
||||
\ex{POST} request it returns an association list of bindings as
|
||||
\ex{form-query} does. Note that as \ex{get-bindings} reads from the
|
||||
associated input port, you must not invoke it more than once for a
|
||||
specific \ex{POST} request---doing so on a \ex{GET} request does not
|
||||
harm. This restriction should be removed in future versions.
|
||||
\end{desc}
|
||||
|
||||
\defun{extract-bindings}{bindings name}{strings}
|
||||
\defunx{extract-single-binding}{bindings name}{string}
|
||||
\begin{desc}
|
||||
\ex{extract-bindings} returns a list of \semvar{strings}, that are
|
||||
values of the \semvar{name} in \semvar{bindings}.
|
||||
\ex{extract-single-binding} returns the value of \semvar{name} in
|
||||
\semvar{bindings}. If there are more than one or zero \semvar{name}s
|
||||
in \semvar{bindings}, an error is signalled. \Eg
|
||||
|
||||
\begin{alltt}
|
||||
(extract-bindings (form-query "button=on&select=13") "select")
|
||||
==> '("13")
|
||||
(extract-single-binding (form-query "button=on&select=13") "button")
|
||||
==> "on"
|
||||
\end{alltt}
|
||||
\end{desc}
|
||||
|
||||
\subsection{Forms and Input Fields}
|
||||
\FIXME{Prolog to input fields}
|
||||
|
||||
\defun{generate-input-field-name}{prefix}{string}
|
||||
\begin{desc}
|
||||
Generates a pseudo-unique name with prefix
|
||||
\semvar{prefix}. Precisely, a continuously increased number is
|
||||
append to \semvar{prefix}. This gives us good chances, that the name
|
||||
is unique---we cannot check the uniqueness, though.
|
||||
\end{desc}
|
||||
|
||||
\defun{make-input-field}{name transformer SXML}{input-field}
|
||||
\defunx{make-upper-input-field}{transformer SXML}{input-field}
|
||||
\begin{desc}
|
||||
\ex{make-input-field} creates an input field for a web
|
||||
form. \semvar{SXML} is an SXML-reprentation of the
|
||||
input-field. \semvar{transformer} gets the value of the input field
|
||||
as a string and returns the scheme value of the input field. \Eg you
|
||||
can do a string to number conversion with this (see
|
||||
\ex{make-number-input-field below}). \semvar{name} Is used to acces
|
||||
the value of the input field out of a request---it should be
|
||||
included in \semvar{SXML} to let the machinery work. This package
|
||||
provides several constructors for various types of input fields, so
|
||||
you usually don't have to bother about it.
|
||||
|
||||
\ex{make-upper-input-field} creates a special kind of an
|
||||
input-field: the \semvar{transformer} function does not get only one
|
||||
value, but the whole bindings list. See the byte input widget for an
|
||||
example.
|
||||
|
||||
The returned \semvar{input-field}s can be used as-is in SXML.
|
||||
\end{desc}
|
||||
|
||||
\defun{make-text-input-field}{\ovar{default-text \ovar{attributes}}}{input-field}
|
||||
\defunx{make-hidden-input-field}{value \ovar{attributes}}{input-field}
|
||||
\defunx{make-password-input-field}{\ovar{attributes}}{input-field}
|
||||
\defunx{make-number-input-field}{\ovar{default \ovar{attributes}}}{input-field}
|
||||
\defunx{make-textarea-input-field}{\ovar{default-text \ovar{attributes}}}{input-field}
|
||||
\defunx{make-select-input-field}{options \ovar{attributes}}{input-field}
|
||||
\defunx{make-checkbox-input-field}{\ovar{value \ovar{attributes}}}{input-field}
|
||||
\defunx{make-radio-input-fields}{values \ovar{attributes}}{input-fields}
|
||||
\begin{desc}
|
||||
These functions generate various kind of \semvar{input-field}s. The
|
||||
\semvar{attributes} argument contains a list of attributes in SXML
|
||||
notation---\eg \ex{'(@ (id 13))}. It is appended to the attributes
|
||||
of the input field that are generated by the functions.
|
||||
|
||||
\ex{make-text-input-field} creates a text input field, optionally
|
||||
filled out with \semvar{default-text}. \ex{make-hidden-input-field}
|
||||
creates a hidden input field with value
|
||||
\semvar{value}. \ex{make-password-input-field} creates a password
|
||||
input field. \ex{make-number-input-field} creates a text input
|
||||
field, whose value is a number. An error is signalled, if the string
|
||||
cannot be interpreted as a number in the sense of
|
||||
\ex{string->number}. The number input field may have a default
|
||||
filling of \semvar{default}, that may be a string, a symbol or a
|
||||
number. \ex{make-textarea-input-field} creates a textarea input
|
||||
field, optionally filled out with \semvar{default-text}. You may
|
||||
want to give the \ex{cols} and \ex{rows} attributes
|
||||
explicitly. \ex{make-select-input-field} creates a select input
|
||||
field that is either displayed as scrollable list (the \ex{size}
|
||||
attribute is not given or greater than 1) or a drop down list (the
|
||||
\ex{size} attribute is equal to 1). The items of the list is given
|
||||
in \semvar{options} and the result of the select input field is a
|
||||
list of all selected items in \semvar{options}.\FIXME{let select
|
||||
input fields really return a list of values in
|
||||
servlets.scm}\ex{make-checkbox-input-field} creats a checkbox input
|
||||
field, optional with a value of \semvar{value}. If \semvar{value} is
|
||||
not given, the browser usually returns
|
||||
``on''. \ex{make-radio-input-fields} is somewhat special as it
|
||||
returns a \emph{list} of radio button input fields. The reason is
|
||||
that radio input fields must have the same name, but the text that
|
||||
surrounds the radio input fields is not included in the definition
|
||||
of the input field. \Ie you must split the resulting list up into
|
||||
its parts and distribute them among your HTML text. The value of the
|
||||
\textit{n}th radio input field is the \textit{n}th element of
|
||||
\semvar{values}.
|
||||
\end{desc}
|
||||
|
||||
\defun{make-submit-button}{\ovar{caption \ovar{attributes}}}{input-field}
|
||||
\defunx{make-reset-button}{\ovar{caption \ovar{attributes}}}{input-field}
|
||||
\defunx{make-image-button}{source \ovar{attributes}}{input-field}
|
||||
\begin{desc}
|
||||
The \semvar{attributes} of all functions are appended to the
|
||||
generated attributes of the input fields.
|
||||
|
||||
\ex{make-submit-button} creates a submit button with an optional
|
||||
caption \semvar{caption}. If you omit the caption, the browser will
|
||||
choose a default value like ``Submit''. \ex{make-reset-button}
|
||||
creates a reset button that clears all entry fields of the form. If
|
||||
you omit the \semvar{cpation}, the browser will choose a default
|
||||
value for the caption of the button---\eg ``Reset''---otherwise
|
||||
\semvar{caption}. \ex{make-image-button} creates an image
|
||||
button using the image located at \semvar{source}.
|
||||
\end{desc}
|
||||
|
||||
\defun{input-field-binding}{input-field bindings}{binding}
|
||||
\defunx{input-field-value}{input-field bindings}{value}
|
||||
\begin{desc}
|
||||
\ex{input-field-binding} returns the binding for
|
||||
\semvar{input-field} out of \semvar{bindings}.
|
||||
\ex{input-field-value} returns the value for the input field, using
|
||||
the transformer function of the input field.
|
||||
\end{desc}
|
||||
|
||||
\subsection{Return addresses}
|
||||
\FIXME{Prolog to return addresses}
|
||||
|
||||
\defun{make-address}{}{address}
|
||||
\begin{desc}
|
||||
\ex{make-address} creates a return \semvar{address}, that may be
|
||||
used to create links in the output of the servlet. With this, the
|
||||
servlet can check which link was clicked by the user.
|
||||
\semvar{address} is a procedure expecting the prefix of the
|
||||
URL. Usually, it is called with the contination address given by
|
||||
\ex{send-html/suspend} (or \ex{send/suspend}).
|
||||
\end{desc}
|
||||
|
||||
\defun{returned-via?}{address bindings}{boolean}
|
||||
\begin{desc}
|
||||
Returns \sharpt, if the user has clicked on the link generated by
|
||||
\semvar{address}.
|
||||
\end{desc}
|
||||
|
||||
\defun{make-callback}{procedure}{url}
|
||||
\begin{desc}
|
||||
\semvar{procedure} Is a function accepting one argument, a request
|
||||
object. If the browser requests to a \semvar{url} returned by
|
||||
\ex{make-callback}, \semvar{procedure} will be called.
|
||||
\end{desc}
|
||||
|
||||
\subsection{Servlet data}
|
||||
\FIXME{Prolog to servlet data}
|
||||
|
||||
\defun{set-instance-data!}{new-value}{\undefined}
|
||||
\defunx{get-instance-data}{}{value}
|
||||
\begin{desc}
|
||||
\ex{set-instance-data!} saves \semvar{new-value} linked with the
|
||||
current instance of the servlet. \ex{get-instance-data} returns this
|
||||
linked value.
|
||||
\end{desc}
|
||||
|
||||
\subsection{Data out of date}
|
||||
\FIXME{Prolog to data ouf of date}
|
||||
|
||||
\defun{make-outdater}{}{outdater}
|
||||
\begin{desc}
|
||||
Creates an \ex{outdater} object. In conjunction with
|
||||
\ex{if-outdated} if ensures, that a specific part of you program is
|
||||
executed only once.
|
||||
\end{desc}
|
||||
|
||||
\dfn{if-outdated}{outdater consequence alternative}{value(s)}{syntax}
|
||||
\begin{desc}
|
||||
This form ensures that code protected by \semvar{outdater} is
|
||||
executed only once. If outdater hasn't been used in this form
|
||||
previously, the \semvar{alternative} is evaluated and
|
||||
\ex{if-outdated} returns whatever \semvar{alternative} returns. As a
|
||||
side effect, \semvar{outdater} is marked used. In future uses of
|
||||
this form with the same \semvar{outdater}, the \semvar{consequence}
|
||||
is evaluated and \ex{if-outdated} returns whatever
|
||||
\semvar{consequence} returns.
|
||||
\end{desc}
|
||||
|
||||
\defun{show-outdated}{new-url}{\noreturn}
|
||||
\begin{desc}
|
||||
\ex{show-outdated} sends a message to the browser indicating that
|
||||
the data is out of date. If \semvar{url} has a true value, it is
|
||||
shown as a reload address. This procedure is helpful in conjunction
|
||||
with \ex{if-outdated}.
|
||||
\end{desc}
|
||||
|
||||
|
||||
\end{document}
|
Loading…
Reference in New Issue