Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

WEBrick почти ничего не знает о деталях Web-приложений. Он не понимает, что такое сеанс пользователя и прочие тонкости. Он оперирует лишь сервлетами, работающими независимо друг от друга. Если вам необходима функциональность более высокого уровня, поищите другую библиотеку (возможно, надстройку над WEBrick наподобие IOWA или Tofu) или напишите свою собственную.

Работа с WEBrick сводится к такой последовательности действий: создается экземпляр сервера; определяются обработчики монтирования и обработчики сигналов; запускается сервер. Вот небольшой пример:

require 'webrick'

server = WEBrick::HTTPServer.new(:DocumentRoot => '.')

# (В этом простом примере нет обработчиков монтирования)

trap('INT') { server.shutdown}

trap('TERM') { server.shutdown}

server.start

Запустив эту программу, вы получите Web-сервер, работающий на стандартном порте 80. Он раздает файлы из текущего каталога.

Для создания сервлета требуется создать класс, производный от

WEBrick::HTTPServlet::AbstractServlet
. При обработке указанного в запросе URL сервер ищет самый длинный префикс (наилучшее соответствие). Ниже приведен «пустой» пример (в нем обработчики не делают ничего полезного):

class EventsHandler < HTTPServlet::AbstractServlet

 # ...

end

class RecentHandler < HTTPServlet::AbstractServlet

 # ...

end

class AlphaHandler < HTTPServlet::AbstractServlet

 # ...

end

# ...

server.mount('/events', EventsHandler)

server.mount('/events/recent', RecentHandler)

server.mount('/events/alpha', AlphaHandler)

Как работает сервлет? Идея в том, чтобы определить метод для каждой поддерживаемой HTTP-операции, например

do_GET
для запросов типа GET. Если вы привыкли писать программы, обращающиеся к серверу, то теперь придется встать на противоположную точку зрения, ведь ваш код становится частью Web-сервера. Вы не получаете ошибку с кодом 404, а сами посылаете этот код. Вот простой пример:

class TinyHandler < WEBrick::HTTPServlet::AbstractServlet

 def do_GET(request, response)

# Обработать запрос, вернуть ответ.

status, ctype, body = process_request(request)

response.status = status

response['Content-type'] = ctype

response.body = body

 end

 def process_request(request)

text = "Очень короткая Web-страница..."

return 200, "text/html", text

 end

end

В более сложном сервлете, вероятно, использовался бы метод

initialize
. Тогда передаваемые ему параметры были бы последними при вызове метода
server.mount
.

К счастью, не нужно писать сервлеты для каждой крохотной задачки, которую должен выполнять WEBrick. У него есть несколько своих предопределенных сервлетов (все в пространстве имен

WEBrick::HTTPServlet
):

• 

FileHandler

• 

ProcHandler

• 

CGIHandler

• 

ERBHandler

Поскольку сервлет

ProcHandler
особенно интересен, скажем о нем несколько слов. Он позволяет «лениться», то есть не создавать подкласса
AbstractServlet
. Вместо этого мы передаем
proc
:

# Непосредственное монтирование блока...

server.mount_proc('/here') do |req, resp|

 resp.body = "Это то, что выводит мой блок."

end

# Создать объект Proc и смонтировать его...

some_proc = Proc.new do |req, resp|

 resp.body = ' Это то, что выводит мой Proc.'

end

server.mount_proc('/there', some_proc)

# Другой способ смонтировать Proc...

my_handler = HTTPServlet::ProcHandler.new(some_proc))

server.mount('/another', my_handler)

WEBrick располагает и многими другими возможностями, например точками подключения для выполнения дополнительных задач (скажем, запуска какой-нибудь программы при старте). Имеются также развитые средства протоколирования, аутентификации по протоколу HTTP и т.д. Дополнительную информацию ищите в онлайновой документации на сайтеили где-либо еще.

19.7.4. Сервер Mongrel

Автором Mongrel является Зед Шоу (Zed Shaw) при участии других. Основная цель этого сервера — повысить производительность по сравнению с WEBrick. В данном отношении он добился значительных успехов и работает во много раз быстрее (хотя провести точные измерения сложно: результат зависит от многих факторов).

Mongrel часто используют в сочетании с Rails, а документация местами ориентирована на Rails. Но жесткой привязки к Rails нет — сервер может работать и в других контекстах.

Mongrel — скорее, приложение, тогда как WEBrick больше напоминает библиотеку. Во многом они схожи, но порядок запуска и API различаются.

Во многих случаях Mongrel можно запустить как приложение без написания какого-либо кода. Он понимает три основные команды:

start
,
stop
и
restart
. У команды
start
много параметров, модифицирующих поведение сервера, например:
– -port portnum
,
– -log filename
,
– -daemonize
и т.д. Чтобы получить полный список, введите такую команду:

Поделиться:
Популярные книги

Академия

Сай Ярослав
2. Медорфенов
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Академия

Солнечный флот

Вайс Александр
4. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
6.00
рейтинг книги
Солнечный флот

Проданная Истинная. Месть по-драконьи

Белова Екатерина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Проданная Истинная. Месть по-драконьи

Ботаник

Щепетнов Евгений Владимирович
1. Ботаник
Фантастика:
фэнтези
боевая фантастика
4.64
рейтинг книги
Ботаник

Огнетушитель Прометея

Донцова Дарья
35. Евлампия Романова. Следствие ведет дилетант
Детективы:
иронические детективы
7.55
рейтинг книги
Огнетушитель Прометея

Adobe Photoshop CS3

Завгородний Владимир
Видеосамоучитель
Компьютеры и Интернет:
программное обеспечение
7.25
рейтинг книги
Adobe Photoshop CS3

Ученик

Первухин Андрей Евгеньевич
1. Ученик
Фантастика:
фэнтези
6.27
рейтинг книги
Ученик

Золото бунта

Иванов Алексей Викторович
Приключения:
исторические приключения
7.50
рейтинг книги
Золото бунта

Неучтенный элемент. Том 7

NikL
7. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 7

Кодекс Охотника XXXI

Винокуров Юрий
31. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника XXXI

Локки 9. Потомок бога

Решетов Евгений Валерьевич
9. Локки
Фантастика:
фэнтези
попаданцы
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 9. Потомок бога

Локки 11. Потомок бога

Решетов Евгений Валерьевич
11. Локки
Фантастика:
героическая фантастика
боевая фантастика
фэнтези
юмористическое фэнтези
6.00
рейтинг книги
Локки 11. Потомок бога

Нью-Йорк

Резерфорд Эдвард
The Big Book
Проза:
историческая проза
6.00
рейтинг книги
Нью-Йорк

Последний Паладин. Том 7

Саваровский Роман
7. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 7