Сколько действий должен выполнить сервлет? - PullRequest
7 голосов
/ 27 августа 2009

Я новичок в веб-разработке и просто интересуюсь лучшими практиками для Java-сервлетов. Должен ли каждый сервлет выполнять только одно действие, то есть сервлет для входа в систему, сервлет для регистрации и т. Д., Или я должен объединить похожие действия, передавая другой параметр, чтобы сообщить сервлету, какое действие выполнить?

Приветствия

Ответы [ 5 ]

4 голосов
/ 27 августа 2009

Вы никогда не должны передавать аргументы, чтобы заставить сервлет выполнять другие действия. Все, что вы делаете с этим, это объединение двух сервлетов в один, и с этим становится все труднее управлять. Вам понадобится сервлет для каждого «действия».

Один из примеров того, чего следует избегать, это:

/ App / servlet1? Действие = редактировать

if (request.getParamater("action").equals("edit")) {
//update fields

} else if (request.getParamater("action").equals("view")) {
//just query
}

Это приводит к большому количеству проблем, когда вы хотите что-то изменить. Вы захотите иметь отдельные сервлеты, потому что они разъединяют вашу логику, так что вы можете легко изменить ее, а не соединять различные тонкости кода, с которыми она не должна быть связана. Также посмотрите в Разделение проблем .

Пересмотренный / редактирование: Я собираюсь сказать это сейчас (гораздо позже к исходному ответу) ... Вы можете сохранить концепцию "нескольких действий" и поместить ее в один сервлет (контроллер). Этот контроллер может и должен делегировать отдельным обработчикам действий. Я думаю, что это то же самое с точки зрения разделения интересов И чище, чем мой первоначальный ответ. Другими словами, не реализуйте ничего в сервлете, используйте это только для маршрутизации.

4 голосов
/ 27 августа 2009

В таких фреймворках, как Struts, есть один единственный сервлет (хотя может быть несколько запущенных экземпляров). Этот сервлет будет обрабатывать запросы на различные URL-адреса и передавать их соответствующим обработчикам действий.

В итоге я пишу только дополнительные сервлеты для обслуживания различных типов контента, таких как сервлет рендеринга изображений.

1 голос
/ 24 декабря 2009

Каждый сервлет должен иметь от одного до четырех действий с именами doDelete, doGet, doPost и doPut. Эти имена соответствуют именам методов HTTP DELETE, GET, POST и PUT. Вместе они создают REST ful API. Вы будете использовать всю мощь HTTP, если будете писать ресурс сервера с этим унифицированным интерфейсом.

Чтобы получить RESTful API, воспринимайте ресурсы как существительные со стандартным набором действий. В итоге вы получите больше сервлетов (контроллеров), чем фреймворков, подобных Struts, но каждый сервлет имеет только ограниченное количество действий.

Многие фреймворки используют шаблон фронт-контроллера с одним сервлетом, который отправляет запрос контроллеру или действию. Но контроллеры каркаса или действия имеют тенденцию дублировать функциональность API сервлета. Контейнер сервлета уже является своего рода фронт-контроллером, который отправляет запросы обработчику (сервлету).

1 голос
/ 27 августа 2009

Я предпочитаю меньше сервлетов и чем больше. Вы можете очень хорошо использовать сервлет в качестве единой точки входа, как во многих веб-фреймворках. Один сервлет получает все HTTP-запросы и на основании запроса выбирается правильное действие. Это базовый шаблон фронт-контроллера, который создал множество преимуществ, таких как возможность довольно легко создавать централизованные функции, например, аутентификацию и т. Д. Вот еще немного информации об этом: http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontController.html

Наличие функциональности во многих сервлетах просто усложняет вещи. Однако имейте в виду, что вы также можете создать беспорядок, используя только один сервлет, если не разберетесь и не будете хорошо управлять своим кодом.

0 голосов
/ 28 августа 2009

Если ваше веб-приложение достаточно сложное, чтобы число действий могло превышать количество сервлетов, с которыми вам удобно работать, тогда вы можете рассмотреть веб-среду для абстрагирования. эта проблема исчезла.

Ваш слой сервлетов должен делать только несколько вещей:

  1. Ввод янки из запроса
  2. Управление состоянием сеанса
  3. Отправка объектов в / из слоя бизнес-объектов
  4. Вставить данные в ответ
  5. Вперед к просмотру
  6. Обработка ошибок / неверный ввод / вывод

Почти все, что застряло в сервлете, - плохая идея.

Если вы следуете некоторым простым рекомендациям, простой сервлет может вызвать процессор ввода, чтобы превратить данные из запроса и данные, которые могут быть в сеансе, в соответствующий объект. Этот объект затем может быть передан в слой BizObject. Этот слой будет возвращать информацию, которая может храниться в сеансе, и некоторый объект, который будет передан в представление.

Я использовал принудительное правило 40 строк для методов обслуживания сервлетов. Если вы прошли 40 строк, я ожидал хорошего объяснения.

Я работал над Java-веб-приложением на 80 тыс. Строк, в котором было два сервлета, ни один не превышал 40 строк. Было обработано около 60 форм / состояний.

Я никогда не думал, что было бы проще управлять / поддерживать / изменять приложение, если бы в сервлете было больше кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...