Статьи

Перетинаючи кордони: Continuation, Web-розробка і Java-програмування

  1. Серія контенту:
  2. Цей контент є частиною серії: Перетинаючи кордони
  3. Про цю серії статей
  4. поява Web
  5. Поява Web-розробки
  6. Чи не утопія
  7. Малюнок 1. Web-додатки виконують пари запит / відповідь
  8. Нові відповіді на старі питання
  9. Ruby-приклад
  10. Лістинг 1. Створення методу loop
  11. Лістинг 2. Виконання методу loop
  12. За та проти
  13. Малюнок 2. Continuation дозволяють додатком функціонувати більш природним способом
  14. Реалізації в інших мовах
  15. Continuation-сервери на мові програмування Java
  16. Емулювання вбудованих continuation
  17. Лістінг 3. Подання процесса в Web Flow
  18. альтернативні мови
  19. Лістинг 4. Використання Cocoon
  20. Реалізація continuation
  21. Лістинг 5. RIFE-приклад
  22. Найближче майбутнє
  23. Ресурси для скачування

перетинаючи кордони

Модель із запам'ятовуванням для програмістів, робота без запам'ятовування для користувачів

Серія контенту:

Цей контент є частиною # з серії # статей: Перетинаючи кордони

https://www.ibm.com/developerworks/ru/views/global/libraryview.jsp?series_title_by=Пересекая+границы

Слідкуйте за виходом нових статей цієї серії.

Цей контент є частиною серії: Перетинаючи кордони

Слідкуйте за виходом нових статей цієї серії.

Про цю серії статей

У серії статей " перетинаючи кордони "Її автор Брюс Тейт розвиває думку про те, що сучасні Java-програмісти мають широкі можливості для вивчення інших підходів і мов. Сфера програмування змінилася після того, як Java-технологія стала очевидним кращим вибором для всіх проектів, що розробляються. Інші інтегровані середовища формують спосіб побудови Java-середовищ, а концепції, освоюються вами в інших мовах, можуть дати новий імпульс вашому Java-програмування. Написаний вами Python-код (або Ruby, або Smalltalk, або ...) може змінити спосіб вашого Java-кодування.

Дана серія статей знайомить вас з концепціями та методиками програмування, які радикально відмінні від Java-розробки, але в той же час безпосередньо застосовні до неї. В одних випадках вам знадобиться інтегрувати технологію для використання її можливостей. В інших ви будете здатні застосувати концепції безпосередньо. Конкретне інструментальний засіб не так важливо, як ідея про те, що інші мови програмування та інтегровані середовища можуть вплинути на розробників, середовища розробки і навіть на фундаментальні підходи в Java-співтоваристві.

Звичайна Web-розробка є іноді приємною, а іноді болісної роботою. Java-розробники проходять довгий шлях, надаючи модель без запам'ятовування стану, але одержувані в результаті продуктивність і легкість розробки стоять витрачених зусиль. У даній статті я розповідаю про радикально відрізняється підході до Web-розробці, званому continuation-сервером. Пропонуючи програмну модель із запам'ятовуванням стану, яка не впливає на масштабованість, властиву моделям без запам'ятовування стану, continuation-сервери значно полегшують розробку Web-додатків.

поява Web

Коли в середині 1990-х років вся індустрія переходила на Web-розробку, розробники програмного забезпечення були в захваті. Клієнт-серверні додатки, які ми створювали, були більш дружні до користувачів у порівнянні з альтернативами термінал-хост, але нас мучило кілька проблем:

  • Продуктивність часто була жахливою. Одним з переваг термінальній розробки є обмеження програмної моделлю витрат на взаємодію. Після усунення цих обмежень нам стало не вистачати пропускної здатності, інструментальних засобів або кваліфікації для створення простих розподілених додатків.
  • Додатки були стерпні. Більшість середовищ розробки клієнт-серверних додатків нав'язували нам апаратне і програмне забезпечення.
  • Додатки були важкі в розгортанні. Потенційно ми повинні були керувати тисячами клієнтів незалежно.
  • Найбільші витрати були приховані. Розгортання перетворювалося в найсерйознішу обмеження, оскільки вартість завершального етапу впровадження злітала вгору.

Клієнт-серверні обчислення все ще розвиваються. Часто компанії брали фінансові рішення на основі більш низької вартості програмного і апаратного забезпечення, а бачили вибух вартості обслуговування тільки після впровадження. У 1995 році клієнт-серверна модель потребувала значних поліпшень - і все йшло до цього.

Поява Web-розробки

Взривоподібний поширення Web-розробки сталося в середині 1990-х років. З появою мови програмування Java стало можна створювати розподілені Web-додатки і одночасно вирішувати найсерйозніші клієнт-серверні проблеми за допомогою нових можливостей:

  • Обмежені взаємодії. Web-модель запит / відповідь має всі характеристики термінальній розробки. Користувач вводить інформацію в форму, виконує запит і отримує відповідь. "Болтливость" при взаємодіях зникла, а продуктивність підвищилася.
  • Архітектури, які не використовують загальні ресурси. Заснована на сервлетах модель програмування могла не зберігати стану. Це означало, що один сервлет міг обслуговувати будь-якого клієнта, а фіксований пул сервлетів міг обслуговувати набагато більше число клієнтів. Ви не повинні були резервувати сервлет для кожного користувача. Продуктивність покращилася ще більше.
  • Загальні стандарти для клієнтів. Несподівано, розгорнувши загальний браузер у всіх клієнтів, ви могли створити один інтерфейс і взаємодіяти практично з усіма клієнтами. Підтримка багатьох браузерів була проблематичною, але це і близько не було так важко, як підтримка рідних бібліотек призначених для користувача інтерфейсів. Багато проблем переносимості просто зникли.
  • Більш досконала модель розгортання. Використовуючи браузер в якості стандартного клієнтського додатка, стало набагато простіше поширювати розробки. Компанія могла розгорнути додаток на парі Інтернет-серверів і надати доступ до них для всього підприємства. Мережева архітектура часто могла розподіляти запити по декількох серверах, тому збільшити потужність стало так само просто, як встановити ще один сервер. Розгортання на стороні клієнта було настільки простим, що зводилося до перевірки установки у клієнта потрібного браузера. Обслуговування значно спростилося.

Продуктивність, масштабованість і переносимість, все стало набагато краще, і Інтернет-революція включила останню передачу. Але ми повинні були піти на деякі значні компроміси.

Чи не утопія

Одне коротке слово stateless (не запам'ятовує стану) переклала величезний вантаж з системи на плечі розробника. Вигоди навіть не обговорюються: ви отримуєте фантастичну масштабованість, оскільки не повинні утримувати одну службу або сервлет для кожного користувача. Але тягар управління станом змістилося з мови програмування на розробника. Сьогодні ви можете розглядати Web-розробку як послідовність перестав зберігають стану запитів (див. Малюнок 1).

Малюнок 1. Web-додатки виконують пари запит / відповідь
перетинаючи кордони   Модель із запам'ятовуванням для програмістів, робота без запам'ятовування для користувачів   Серія контенту:   Цей контент є частиною # з серії # статей: Перетинаючи кордони   https://www

У цій моделі браузер знаходиться під жорстким управлінням. Додаток може реагувати тільки на запити, зроблені браузером. Ця модель працює тоді, коли запити є маленькими і незалежними, але це суттєве обмеження для Web-додатків, які керують багатокомпонентними додатками. Найпоширенішим прикладом є інтерактивні покупки. Натисніть на кнопку Submit два рази, і ви часто ненавмисно замовите два однакових товару. Покинувши Web-магазин і повернувшись через два тижні, ви можете виявити ці ж товари в корзині, зовсім не чекаючи цього.

Збереження стану для ваших користувачів зазвичай реалізується приміщенням всіх даних, що відносяться до взаємодії, в сесію і відміткою цієї користувальницької сесії на клієнтському комп'ютері з використанням кукі (cookie), прихованих полів або URL-змінних. Для кожного нового запиту ви змушені виконувати такі дії:

  • Отримати ідентифікатор користувача від клієнта
  • Відновити стан взаємодії з сесії
  • Обробити користувальницький запит
  • Відповісти
  • Зберегти стан взаємодії в сесії
  • Послати відповідь користувачеві

Я дуже спростив проблему, оскільки використання не пам'ятною стану моделі для емуляції запам'ятовуючих стан додатків може викликати ще більш серйозні проблеми. Найважливіше питання також старий, як і Web-розробка: як обробити кнопку "Назад" (Back)?

Нові відповіді на старі питання

Для вас може бути шоком дізнатися, що можна створити Web-додаток, що працює без запам'ятовування стану для користувача, але використовує модель із запам'ятовуванням стану для програміста. Насправді ще в 1995 році в книзі "Хакери і художники" (див. Розділ " ресурси ") Пол Грехем (Paul Graham) говорив про застосування такого підходу в ViaWeb. Цей підхід використовував програмну керуючу структуру, яка називається continuation (спадкоємність).

Основна ідея полягає в наступному: ви можете дозволити вашої інтегрованої середовищі програмування завантажити стан вашого застосування перед запитом і зберегти стан вашого застосування після кожного запиту. Я почну з розгляду continuation в мові програмування Ruby.

Ruby-приклад

Якщо ви хочете кодувати самостійно, встановіть Ruby і виконайте команду irb. Визначте метод під назвою loop, ввівши команди після символу>, як показано в лістингу 1:

Лістинг 1. Створення методу loop

irb (main): 001: 0> def loop (interrupt) irb (main): 002: 1> for i in 1..10 irb (main): 003: 2> puts "Value of i: # {i}" irb (main): 004: 2> callcc {| c | return c} if i == interrupt irb (main): 005: 2> end irb (main): 006: 1> end => nil

Метод loop приймає один параметр interrupt. Ви починаєте цикл for з 1 до i, роздруковуєте значення i, а потім ... зупиняєтеся. Загадковий оператор callcc означає виклик з використанням continuation. Розглядайте continuation як стан програми в замороженої точці часу. Ruby викликає блок коду в фігурних дужках, передаючи об'єкт continuation. Код в фігурних дужках є замкнутим виразом і просто блоком коду, переданим в callcc. Кінцевим результатом є збір інформації про стан процедурою callcc і збереження її в змінній c. Ви можете тепер викликати цей метод і перервати виконання в будь-якій точці циклу, зберігаючи стан програми. Потім ви в будь-який час можете продовжити.

Тепер виконайте метод кілька разів, як показано в лістингу 2:

Лістинг 2. Виконання методу loop

irb (main): 007 0> cont = loop 5 Value of i: 1 Value of i: 2 Value of i: 3 Value of i: 4 Value of i: 5 => # <Continuation: 0x2b5a358> irb (main) : 008: 0> cont.call Value of i: 6 Value of i: 7 Value of i: 8 Value of i: 9 Value of i: 10 => 1. 10 irb (main): 009: 0> cont = loop 8 Value of i: 1 Value of i: 2 Value of i: 3 Value of i: 4 Value of i: 5 Value of i: 6 Value of i: 7 Value of i: 8 => # <Continuation: 0x2b562f0> irb ( main): 010: 0> cont.call Value of i: 9 Value of i: 10

При кожному виклику continuation запам'ятовує, де перервалося виконання. Тобто, середа Web-розробки, що використовує continuation, може захопити continuation після обробки кожного запиту і записати в сесійний змінну за допомогою ідентифікатора. Потім середовище може відновити continuation з сесії перед кожним новим запитом, використовуючи той же підхід, який ви використовували для зберігання призначених для користувача даних.

За та проти

Підхід з використанням continuation-сервера в багатьох випадках дозволяє вам мати ваш шматок пирога, а також є його - модель програмування із запам'ятовуванням стану і робота користувача при продуктивності систем без запам'ятовування стану. Заглиблюючись далі, перерахуємо переваги такого підходу:

  • Він гарантує запам'ятовування стан між запитами. Інтегроване середовище може ідентифікувати конкретні continuation в URL і зберігати їх в сесії.
  • Він надає програмну модель із запам'ятовуванням стану. Інтегроване середовище може відновити будь-яку continuation в будь-який час. Якщо користувач підтверджує форму вдруге, continuation може підхопити обробку на більш ранньому часовому відрізку.
  • Ви можете скасувати continuation на основі бізнес-правил, тому легко захистити форму від подвійного підтвердження.
  • Ви безкоштовно отримуєте підтримку кнопки "Назад". Оскільки у вас без перебільшення є стан виконання в будь-який момент часу, інтегроване середовище може просто відновити відповідну continuation, якщо користувач коли-небудь натисне кнопку "Назад".
  • Організувати кілька потоків тепер легко, оскільки немає спільно використовуваних ресурсів. Відсутність змагання за ресурси означає відсутність більшості проблем багатопоточності.

Continuation значно спрощують модель Web-розробки. Використовуючи continuation, ви можете розглядати Web-додаток як додаток до послідовності запитів для надання додаткової інформації користувача. На малюнку 2 показана переглянута схема роботи програми. Після початку роботи користувача з додатком Web-сервер вступає в дію. Замість обслуговування довільних запитів в довільному порядку, додаток стає цілісним, спрямованим на взаємодію з користувачем.

Малюнок 2. Continuation дозволяють додатком функціонувати більш природним способом

Аналогічно багатьом високорівневим абстракцій, continuation мають і негативні сторони. Ці недоліки будуть переноситися на весь підхід, що залежить від них. Continuation-сервери повинні вирішувати наступні загальні проблеми:

  • Continuation можуть бути дорогими. Полегшення приміщення даних в сесію означає те, що більше користувачів буде поміщати більше даних в сесію. Проектувальники інтегрованого середовища можуть зменшити витрати, використовуючи підхід, званий "часткові continuation", при якому інтегроване середовище зберігає тільки відноситься до додатка частина continuation.
  • Жахливі URL. Більшість continuation-серверів додають дивні ідентифікатори для continuation.
  • Зміна парадигми роботи з користувачем. Якщо ви використовуєте continuation-сервери всюди, робота користувача зміниться. Кнопка "Назад" дійсно буде працювати, і це може дезорієнтувати деяких користувачів. Наприклад, натиснувши кнопку "Назад" після приміщення якогось товару у ваш кошик, очікували б ви, що додаток прибере його з кошика?

Загалом, я вірю, що continuation становлять значний крок вперед, і ви, ймовірно, побачите широке поширення реалізацій continuation-серверів в найближчому майбутньому. А зараз, давайте коротко розглянемо деякі реалізації в інших мовах, а потім я покажу вам, що відбувається ближче до дому.

Реалізації в інших мовах

Виявляється, що кілька мов програмування використовують засновані на continuation підходи (посилання на додаткову інформацію про всі них наведені в розділі " ресурси "). Найбільш поширені є в Lisp, Ruby і, більш за все, в Smalltalk.

  • Seaside, найпоширеніший continuation-сервер, реалізований на Smalltalk Еві Бріанта (Avi Bryant). Якщо ви хочете познайомитися з радикально відрізняється і дуже продуктивною інтегрованою середовищем Web-розробки, виберіть Seaside. Робота з нею змінить ваш підхід до Java-програмування.
  • Інтегроване середовище Iowa на Ruby була теж створена Еві Бріанта під впливом Web Objects. Зараз вона використовується і підтримується в Ruby.
  • Інтегроване середовище Wee - це ще одна Ruby-середовище, що має багато характеристик continuation-сервера, але не використовує continuation на рідній мові.
  • ViaWeb використовувала continuation з мовою Lisp для отримання кращої продуктивності в порівнянні з конкурентами в 1995.
  • Continuity - це написаний на Perl continuation-сервер. Perl 6 матиме вбудовану підтримку continuation.

Існує кілька інших реалізацій, які я не перерахував. Таким чином, ви можете подумати, що більшість реалізацій continuation-серверів написано на мовах, що підтримують continuation, і що це не дуже поширені мови. Але це не зовсім точна картина того, що відбувається.

Continuation-сервери на мові програмування Java

Java-розробники з усе зростаючим інтересом спостерігають за можливостями заснованого на використанні continuation підходу до створення інтегрованих Web-середовищ, але мова Java не має вбудованої підтримки continuation. Якщо ваша мова не підтримує continuation, у вас є обмежена кількість варіантів: емулювати continuation, додати continuation до вашого мови або вибрати нову мову. Різні інтегровані Java-середовища (див. Розділ " ресурси ") Використовують кожен з цих підходів:

  • Емулювання continuation. Деякі інтегровані Java-середовища використовують альтернативні методи для збору стану виконання програми. Lakeshore використовує потоки, а Spring Web Flow використовує кінцеві автомати (більш докладно ви дізнаєтеся про Web Flow в даній статті пізніше).
  • Вибір іншої мови. Віртуальна машина Java має альтернативні мови, які можуть працювати поверх неї. Cocoon 2 використовує такий підхід за допомогою Rhino, віртуальної машини, що підтримує JavaScript, але також і Java.
  • Реалізація continuation. Цей підхід використовують контейнер сервлетів Jetty 6, RIFE і WebWork.

Емулювання вбудованих continuation

Ви не повинні використовувати continuation для захоплення стану виконання програми. Призупинені потоки і кінцеві автомати можуть прекрасно захоплювати стан виконання. Підхід з використанням потоків просто "заморожує" і зберігає існуючий потік. Цей підхід трохи більш обмежений, оскільки не забезпечує продуктивність не запам'ятовуючих стану програм - фактично ви використовуєте окремий потік для кожного користувача.

Але кінцевий автомат є прекрасним підходом для емуляції continuation. Кінцевий автомат - це програма з чітко визначеними переходами між станами. Найпопулярнішою Java-середовищем з великим впливом continuation-сервера є Spring Web Flow. Web Flow моделює навігацію по сторінках призначеного для користувача інтерфейсу у вигляді кінцевого автомата. Web Flow може моделювати процеси у вигляді Java-об'єктів, але зазвичай для опису процесу використовується XML. Розгляньте уявлення процесу в лістингу 3 з керівництва по Web Flow (див. Розділ " ресурси "):

Лістінг 3. Подання процесса в Web Flow

<? Xml version = "1.0" encoding = "UTF-8"?> <! DOCTYPE webflow PUBLIC "- // SPRING // DTD WEBFLOW // EN" "http://www.springframework.org/dtd/spring- webflow.dtd "> <webflow id =" myFlow "start-state =" displayForm "> <view-state id =" displayForm "view =" form "> <entry> <action bean =" myFlowAction "method =" setupForm " /> </ entry> <transition on = "submit" to = "processSubmit"> <action bean = "myFlowAction" method = "bindAndValidate" /> </ transition> </ view-state> <action-state id = " processSubmit "> <action bean =" myFlowAction "/> <transition on =" success "to =" finish "/> </ action-state> <end-state id =" finish "view =" success "/> </ webflow>

Процес має три основні стани: displayForm, processSubmit і finish. Процес визначає дії, які будуть викликати перехід автомата з одного стану в наступне. Наприклад, підтвердження буде викликати перехід стану з displayForm в processSubmit. Web Flow працює над звичайним рівнем модель-уявлення-контролер. Ви можете використовувати багато різних технологій перегляду для відображення ваших форм.

При переході з одного стану в наступне інтегроване середовище автоматично реєструються поточний стан з усіма змінними примірника. Ви отримуєте таку ж підтримку кнопки "Назад" і програмну модель із запам'ятовуванням стану, яку забезпечують і інші continuation-сервери. Цей підхід не використовує вбудовані continuation, але ви отримуєте багато переваг continuation-серверів, а також інші переваги:

  • Персистенція. Хоча не можна захопити весь стек викликів, але ви можете захопити поточний стан виконання і навіть зберегти поточний стан.
  • Довгоживучі процеси, такі як потоки робіт (workflow). Оскільки стан не залежить від даного стека викликів, підхід більш стабільний для таких елементів, як тривалі потоки робіт.
  • Інструментальні засоби. Щодо легко створити інструментальні засоби для XML.

альтернативні мови

Cocoon використовує Rhino, віртуальну машину JavaScript, яка підключається в JVM. Cocoon-контролери використовують модифіковану версію Rhino для вираження continuation, тому Cocoon дозволяє вам висловлювати логіку вашого контролера на Java або JavaScript. Погляньте на додаток, наведене в лістингу 4 і взяте з керівництва по Cocoon (див. Розділ " ресурси "):

Лістинг 4. Використання Cocoon

try {if (operator == "plus") cocoon.sendPage ( "result.html", {result: a + b}); else if (operator == "minus") cocoon.sendPage ( "result.html", {result: a - b}); else if (operator == "multiply") cocoon.sendPage ( "result.html", {result: a * b}); else if (operator == "divide") cocoon.sendPage ( "result.html", {result: a / b}); else cocoon.sendPage ( "invalidOperator.html", {operator: operator}); } Catch (e) {cocoon.sendPage ( "error.html", {message: "Operation failed:" + e.toString ()}); }

Зверніть увагу на метод sendPage в лістингу 4. Цей метод посилає сторінку назад користувачеві. Ви не побачите будь-якого звичайного громіздкого коду для підтримки кнопки "Назад" або для збереження призначених для користувача даних в сесії - все це інкапсульоване в середу Cocoon.

Реалізація continuation

Інтегроване середовище RIFE реалізує свої власні continuation, а інтегроване середовище WebWork використовує реалізацію continuation в RIFE. Jetty 6 також містить реалізацію continuation на Java. У лістингу 6 показаний приклад з керівництва по RIFE для гри в вгадування числа:

Лістинг 5. RIFE-приклад

while (mGuess! = answer) {print (template); pause (); guesses ++; if (answer <mGuess) {template.setBlock ( "indication", "lower"); } Else if (answer> mGuess). {Template.setBlock ( "indication", "higher"); }}

У цьому прикладі метод pause () захоплює continuation і посилає шаблон (template) назад користувачеві для дії. RIFE робить continuation простими і доступними для Web-розробника.

Найближче майбутнє

Ви можете помітити, що continuation представляють реальне вдосконалення інтегрованих середовищ Web-розробки. При використанні цього підходу ви можете підвищити продуктивність. А оскільки Web-додаток виражається у вигляді зрозумілого Java-коду (замість сотень роз'єднаних сервлетів), ваші програми набагато легше зрозуміти і підтримувати.

Нові досягнення в Web-розробці швидко роблять підхід з continuation все більш важливим. Замість вибірки повних Web-сторінок в традиційних моделях запит / відповідь, Ajax-додатки можуть асинхронно вибирати маленькі фрагменти Web-сторінки і вставляти результати в існуючу сторінку. Але Ajax-додатки змушують підтримувати з'єднання з користувачем тривалий період часу, для того щоб зберегти "чуйність" додатка і легкість кодування системи відстеження стану. Такий режим роботи анулює призначення програмування без запам'ятовування стану, оскільки ви дійсно повинні утримувати ресурси для кожного підключеного користувача. Використовуючи continuation, ви можете зберігати стан в них і відновлювати стан при необхідності.

У найближчому майбутньому розвиток апаратного забезпечення зробить додаткові витрати ресурсів на continuation менш суттєвими. Без повного перегляду інтегровані середовища Web-розробки все одно будуть занадто складними. Ajax віщує ще більше ускладнення Web-розробки. Всі ці фактори неухильно приведуть до використання continuation-сервера. Через два роки більшість нових Web-розробок буде використовувати будь-якої continuation-сервер або яку-небудь емуляцію continuation.

Наступного разу я розповім про предметно-орієнтованих мовах і їх ролі в Ruby on Rails. Потім я розгляну суть ідеї і покажу вам, що (в цьому контексті) відбувається в Java-програмуванні.

Ресурси для скачування

Схожі тими

  • Оригінал статті " Crossing borders: Continuations, Web development, and Java programming ".
  • " Java Web-сервер: Jetty 6.0 Continuations для Ajax-архітектур ": Бен Галбрейс (Ben Galbraith) розповідає про силах в Ajax, що впливають на підхід, заснований на використанні continuation.
  • " Секрети успішної полегшеної розробки, частина 8: Seaside "(Брюс Тейт (Bruce Tate), developerWorks, листопад 2005): Введення в найпопулярніший і важливий continuation-сервер.
  • Хакери і художники Пола Грехема (Paul Graham) (O'Reilly, 2004): Одна з багатьох статей в цій книзі детально розповідає про початок використання continuation.
  • Вдосконалена система розподілу ресурсів процесами - Continuations : Цей фрагмент користувальницької документації по популярному проекту Apache Cocoon досліджує використання continuation в Cocoon.
  • Що таке Iowa : Навчальний посібник з Iowa, continuation-сервера в Ruby.
  • RIFE : RIFE - це інноваційна інтегроване середовище, яка використовує continuation і багато інших методики, популярні в динамічних мовами.
  • RIFE / continuations : RIFE / continuations - субпроект RIFE, метою якого є зробити його підтримку continuations на чистому Java доступною в якості бібліотеки загального призначення.
  • Експериментальні continuations в WebWork : Інтегроване середовище розробки Java Web-додатків WebWork використовує RIFE continuations для своєї нової реалізації continuation.
  • Spring's Web Flow : Spring Web Flow - це загальний механізм процесів, призначений для визначення і виконання процесу надання сторінок в Web-додатку.
  • Швидкий старт в Spring Web Flow : Цей навчальний посібник допомагає швидко почати працювати з Spring Web Flow 1.0.
  • Lakeshore : Lakeshore - це заснована на Java інтегрована компонентна Web-середовище, на яку зробили вирішальний вплив Seaside 2 і середовище Borges Ruby.
  • Jetty 6 : Jetty - це контейнер сервлетів на мові Java з підтримкою continuation.
  • Seaside : Seaside - це найпопулярніший і впливовий continuation-сервер.
  • Wee : Wee - це ще одна інтегроване середовище Ruby continuations.
  • Continuity : Continuity - заснована на continuation інтегроване середовище Web-програмування для Perl.
  • За межами Java (O'Reilly, 2005): Книга Брюса Тейта (Bruce Tate) про підйом і стабілізації розвитку Java і про технології, які могли б кинути виклик мови Java в деяких нішах.
  • Зона Java-технології : Сотні статей по кожному аспекту Java-програмування.

Підпішіть мене на ПОВІДОМЛЕННЯ до коментарів

Jsp?
Найважливіше питання також старий, як і Web-розробка: як обробити кнопку "Назад" (Back)?
Наприклад, натиснувши кнопку "Назад" після приміщення якогось товару у ваш кошик, очікували б ви, що додаток прибере його з кошика?
Encoding = "UTF-8"?