@section Servlet連携機能

Servletと連携して、SchemeにてサーバサイドJavaを利用したWebアプリケーションを記述することができます。

サーバサイドSchluesselを使用するためにはTomcat等のWebコンテナが必要です。
Webコンテナの設定方法は次の通りです。

@enumerate
@item Webコンテナのルート配下にWEB-INFディレクトリとその配下にlib, classesというディレクトリを用意します。
@item libディレクトリ配下にschluessel.jarとschluessel-sss.jarを配置します。
@item WEB-INFディレクトリ配下にweb.xmlというファイルを生成し、次のように生成します。

@example
<?xml version="1.0" encoding="UTF-8"?>
<web-app
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://java.sun.com/xml/ns/javaee" 
 xmlns:web=
  "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 id="WebApp_ID"
 version="2.5">
  <servlet>
    <servlet-name>Schluessel</servlet-name>
    <servlet-class>
 net.morilib.lisp.sss.servlet.http.SchlushHttpServlet
    </servlet-class>
    <init-param>
      <param-name>scheme-root</param-name>
<!-- ↓Schemeソースがあるパッケージのルートを記述する -->
      <param-value>test.scheme</param-value>
    </init-param>
    <init-param>
      <param-name>scheme-encoding</param-name>
      <!-- ↓Schemeソースのエンコードを記述する -->
      <param-value>UTF-8</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>Schluessel</servlet-name>
    <url-pattern>*.scm</url-pattern>
  </servlet-mapping>
</web-app>
@end example

@item web.xmlにて指定したSchemeのWebアプリケーションがあるパッケージにSchemeソースを配置します。
@end enumerate

このとき、Webコンテナは次のようになっていると思います。(ここでは、ルートパッケージをtest.schemeとしています)

@example
Webコンテナのルート
 +- WEB-INF
     + lib
     + classes
     |  + test
     |     + scheme
     |        + Schemeソース(拡張子は.scm)
     + web.xml
@end example

配置したアプリケーションは
@example
  http://ホスト名:nnnn/Webコンテナ名/WebApplicationName.scm
@end example
で参照できます。

Webアプリケーションと使用するSchemeアプリケーションは

@itemize @bullet
@item    do-get (HTTP GETメソッドを処理)
@item    do-post (HTTP POSTメソッドを処理)
@item    do-delete (HTTP DELETEメソッドを処理)
@item    do-head (HTTP HEADメソッドを処理)
@item    do-options (HTTP OPTIONSメソッドを処理)
@item    do-put (HTTP PUTメソッドを処理)
@item    do-trace (HTTP TRACEメソッドを処理)
@end itemize

の手続きのいずれかを定義することが必要です。これらの手続きは2つの引数

@itemize @bullet
@item    HTTPリクエストオブジェクト
@item    HTTPレスポンスオブジェクト
@end itemize

を伴って呼び出されます。これらのオブジェクトの詳細については以下を参照してください。

@defun get-parameter request string-of-param-name
戻り値: パラメータを表す文字列@*
HTTPリクエストオブジェクトから文字列でパラメータを受け取ります。
@end defun

@defun get-parameter-integer request string-of-param-name
戻り値: パラメータを表す整数@*
HTTPリクエストオブジェクトから整数でパラメータを受け取ります。
パラメータが整数に解析できなかったときはエラーをraiseします。
@end defun

@defun set-character-encoding request encoding
戻り値: 未定義@*
フォームの文字コードを指定します。
適切な文字コードを指定しなかったときはget-parameterの結果が文字化けすることがあります。
@end defun

@defun session-valid? request
戻り値: セッションが有効ならば#t@*
現在のセッションが有効かを調べます。
@end defun

@defun get-session request
戻り値: HTTPセッションオブジェクト@*
HTTPセッションを取得します。
現在のセッションが無効なときは新規に生成します。
@end defun

@defun set-content-type response content-type
戻り値: 未定義@*
Content-Typeをセットします。
@end defun

@defun get-output-port response
戻り値: 出力ポート@*
レスポンスを送る出力ポートを取得します。
@end defun

@defun get-attribute attribute-holder string-of-attr-name
戻り値: パラメータを表す整数@*
属性を属性ホルダーから取得します。
「属性ホルダー」とは、HTTPリクエストオブジェクト、HTTPセッション、Servletコンテキストを指します。
@end defun

@defun set-attribute! attribute-holder string-of-attr-name datum
戻り値: パラメータを表す整数@*
属性を属性ホルダーにセットします。
「属性ホルダー」とは、HTTPリクエストオブジェクト、HTTPセッション、Servletコンテキストを指します。
任意のSchemeオブジェクトをセットすることができます
@end defun

