- •Затверджений
- •02070743.00569-01 81 01
- •2.1. Вступ
- •02070743.00569-01 81 01
- •2.2.1.1. Статичний html
- •5 02070743.00569-01 81 012.2.1.2 Cgi
- •2.2.1.3. Active Server Pages і asp.Net
- •02070743.00569-01 81 01
- •702070743.00569-01 81 012.2.1.4. Asynchronous Javascript and xml
- •2.3. Мови реалізації мережевих технології
- •9 02070743.00569-01 81 012.3.3. C# і vb.Net
- •02070743.00569-01 81 01
- •2.4. Безкоштовні технології
- •02070743.00569-01 81 01
- •02070743.00569-01 81 01
- •2.5. Мова програмування Ruby
- •02070743.00569-01 81 01
- •02070743.00569-01 81 01
- •2.6. Конкретизація задачі
- •2.6.1. Ruby для Web-застосувань
- •02070743.00569-01 81 01
- •2.6.1.2. Ruby on Rails
- •2.6.1.3. Принципи і техніка
- •02070743.00569-01 81 01
- •02070743.00569-01 81 01
- •02070743.00569-01 81 01
- •2.6.1.5. Додаткові інструменти і бібліотеки
- •02070743.00569-01 81 01
- •2.7. Ruby і Web-сервер
- •02070743.00569-01 81 01
- •2.7.1. Модуль mod_ruby
- •02070743.00569-01 81 01
- •2.2.2. Сервер weBrick
- •02070743.00569-01 81 01
- •2.7.3. Сервер Mongrel
- •02070743.00569-01 81 01
- •26 02070743.00569-01 81 012.8. Особливості розробки алгоритмів для Ruby
- •02070743.00569-01 81 01
- •02070743.00569-01 81 01
- •02070743.00569-01 81 01
- •02070743.00569-01 81 01
- •02070743.00569-01 81 01
- •02070743.00569-01 81 01
2702070743.00569-01 81 01
{ |req,
resp| . } –
процедурному (як і будь-якому іншому)
сервлету передається в замикання дві
змінні. Змінна req містить інформацію
про запит (який браузер запрошує, які
змінні передаються і так далі), а за
допомогою змінної resp формується відповідь
(який тип інформації передається,
інформація для відображення і так далі).
. if req.query["text"] – постфіксний запис умовного оператора if. Блок, перед if виконуватиметься лише у тому випадку, коли сервлету передаватиметься змінна text. Метод .query повертає асоціативний масив у вигляді {имя_переменной=>значение}.
File.open('notepad.txt', 'w'){|f| f.write(req.query["text"]) } – відкриваємо файл notepad.txt для запису і пишемо туди значення змінної text (передається сервлету в тілі запиту).
resp['Content-Type']= 'text/html' – встановлюємо типа передаваних нами даних. Зазвичай тип визначається по розширенню файлу, але процедурний сервлет про файл, а тим більше про його розширення, нічого не чув. Ось і доводиться вказувати типу передаваних даних через параметр Content-Type.
resp.body = %& . & – за допомогою методу .body= ми передаємо HTML-код як відповідь на запит. Сам HTML-код передається у вигляді рядка, поміщеному в %& . &. Це альтернативний спосіб завдання рядка. Після символу % йде символ, який буде таким, що замикає (у нашому випадку & ). Такий спосіб завдання рядка використовується у випадках, коли рядок містить багато лапок і апострофів (аби не займатися їх екрануванням).
server.start – за допомогою методу .start ми запускаємо Web-сервер.
Для того, щоб припинити роботу Web-сервера, треба його просто вивантажити. Це робиться за допомогою комбінації клавіш Ctrl+Break або Ctrl+C.
2802070743.00569-01 81 01
Вийшов трохи громіздкий опис, але це лише спочатку. Далі ми розглядатимемо лише зміни, а їх буде істотно менше.
Тепер приступимо до ERB. Це шаблонна бібліотека, яка дозволяє здійснювати вставку в довільний текст будь-якої Ruby-коду. Для цього є два основних тега:
<% . %> – Код усередині тега виконується. Під час обробки він замінюється на порожній рядок.
<%= . %> – Код усередині тега виконується. Результат останнього обчислення перетвориться в рядок і вставляється замість тега.
Обробка коду всередині тегів ERB йде лише під час обробки шаблону (виклику методу .result).
ERB для прихильників РНР – це «PHP, лише на Ruby». Ця фраза володіє настільки магічною властивістю, що після неї співбесідникові все стає зрозумілим. Давайте поглянемо, як може виглядати наша програма в якій використовується ERB-шаблон:
require 'webrick'
require 'erb'
server = WEBrick::HTTPServer.new(:Port=>8080)
server.mount_proc('/'){ |req, resp|
File.open('notepad.txt', 'w'){ |f| f.write req.query["text"] } if req.query["text"]
resp['Content-Type']= 'text/html'
template = %& <html><body><center><form method="post">
<textarea name="text" rows="4"cols="40"><%=IO.read('notepad.txt')%></textarea><br/>
<input type="submit" name="update" value="Сохранить"/>
</form></center></body></html>&
resp.body = ERB.new(template).result
2902070743.00569-01 81 01
}
server.start
Що змінилося? Змін небагато, але вони все ж є:
require 'erb' – підключаємо бібліотеку ERB.
template = %& . <%=IO.read('notepad.txt')%> . & – створюємо змінну template і привласнюємо їй рядок, який за сумісництвом є ERB-шаблоном. Усередині рядка можна відмітити тег <%= . %>, усередині якого здійснюється зчитування файлу notepad.txt. Результат зчитування буде вставлений замість тега <%= . %> під час обробки ERB-шаблона.
resp.body = ERB.new(template).result – створюємо об'єкт ERB і передаємо туди підготовлений ERB-шаблон. Обробляємо його методом .result і результуючий рядок передаємо методу .body =, який підставляє її як відповідь на запит.
І що ми отримуємо в результаті? Підключили «зайву» бібліотеку і створили «зайву» змінну? Не квапитимемося з виводами. Використання бібліотеки ERB дозволяє винести шаблон в зовнішній файл. Тим самим ми очищаємо Ruby-код від HTML-коду.
ERB-шаблон істотно псує красу нашої Ruby-коду. Тому, рішення винести шаблон в зовнішній файл сповна виправдане. Тим паче, що це дозволить нам правити ERB-шаблон окремо від програми. Більш того, внесені до шаблону зміни набиратимуть чинності без перезавантаження сервера.
Файл з ERB-шаблоном (index.html) виглядатиме таким чином:
<html>
<body>
<center>
<form method="post">