Программирование на языке Ruby - [224]
Что если включить «магическую строку» в сам текст в виде литерала? Экранирование с помощью обратной косой черты не работает. Мы рекомендуем такой способ:
>В этой строке есть цепочка меньше-процент <%="<%"%>,
>а в этой больше-процент <%="%"+">"%>.
>Здесь мы видим <%="<%="%> и <%="<%#"%>.
Результат таков:
>В этой строке есть цепочка меньше-процент <%,
>а в этой больше-процент >%.
>Здесь мы видим <% и <%#.
Включать открывающий тег немного проще, чем закрывающий. Объясняется это тем, что теги не могут быть вложенными, а программа >erb
недостаточно «умная», чтобы игнорировать закрывающий символ внутри строки.
Конечно, в >erb
есть кое-какие функции, «заточенные» под HTML. Для установки режима работы предназначен флаг >-M
, он может принимать значения >f
, >с
и >n
.
Режим >f
(фильтр) подразумевается по умолчанию, поэтому во всех предыдущих примерах мы не задавали флаг >-Mf
явно. В режиме >-Mc
(CGI) все ошибки печатаются в виде HTML. В режиме >-Mn
(NPH-CGI — без разбора заголовков) автоматически выводятся дополнительные HTTP-заголовки. В двух последних режимах для безопасности переменная >$SAFE
устанавливается в 1 (исходя из допущения, что это CGI-приложение, которое может вызвать враждебный пользователь). Флаг >-n
(и эквивалентный ему >--noheader
) подавляет вывод CGI-заголовка.
Можно настроить сервер Apache так, что он будет распознавать страницы с встроенным кодом на Ruby. Для этого нужно ассоциировать тип >application/x-httpd-erb
с каким-нибудь расширением (было бы логично использовать >.rhtml
) и определить действие, которое ассоциирует этот тип с исполняемым файлом >eruby
. Более подробные сведения вы найдете в документации по Apache.
19.7.3. Сервер WEBrick
Авторами WEBrick являются Масаёси Такахаши (Masayoshi Takahashi) и Юзоу Готоу (Yuuzou Gotou) при участии многих других разработчиков. Это библиотека для создания полноценного HTTP-сервера; она входит в стандартный дистрибутив Ruby. Название происходит от слова «brick» (кирпич) — то есть подразумевается нечто небольшое, компактное и автономное.
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.'
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.