Далее я разместил код хэндлера Do, предполагается, что остальной код модуля не меняется. По сути, ему и не надо меняться, весь сервлет расположен в этом методе.
В сообщении m есть описание запроса .rq, и, в зависимости от запроса есть еще и данные .query.
Опишем простую форму, которая будет использовать метод POST для отправки данных на сервер.
Данные на сервер отправляются на адрес "/".
На сервере мы анализируем запрос, и если вдруг POST, то проверяем .query на NIL. Query содержит в себе список полей с идентификаторами, поэтому можно просто запросить по идентификатору значение этого поля val.
Далее мы значение поля отправляем обратно в виде строки. Вот и всё.
Код:
   PROCEDURE (s: Servlet) Do (m: O3baseWebServlets.Msg);
      VAR file: O3baseFiles.File; val: O3baseWebHttp.QVal;
      PROCEDURE Generate (IN text: ARRAY OF CHAR);
         VAR wr: O3baseFiles.Writer; i: INTEGER;
      BEGIN
         file := O3baseFiles.factory.Temp();
         wr := file.WrNew();
         i := 0;
         WHILE i < LEN(text$) DO
            wr.Char(text[i]);
            INC(i)
         END
      END Generate;
   BEGIN
      Log.String(m.rq.uri$); Log.Tab; Log.String(m.rq.method$); Log.Ln;
      IF (m.rq.uri$ = '/') THEN
         IF m.rq.method$='GET' THEN 
            Generate('<html><body><form method="post" action="/"><input name="text"><input type="submit"></form></body></html>'); (* как будто загрузили с диска *)
         ELSIF m.rq.method='POST' THEN
            IF m.query#NIL THEN val:=m.query.Get('text') END;
            IF val#NIL THEN
               Generate('Hello, world!'+'</br>'+val.sp$);
            END;
         END;
      END;
      IF file # NIL THEN m.Respond(O3baseWebHttp.ResponseUtf8Html(file)) END;
   END Do;