2009-10-27 3 views
0

Я делаю статические классы в сервлете, эти классы являются контроллерами для веб-страниц. Запросы перенаправляются контроллерам по URL-адресам контроллера, которые находятся в статическом HashMap, который содержит все контроллеры. Существуют ли какие-либо возможности, с помощью которых пользовательский/сеансовый контент может быть запутан с другими сеансами пользователей? Я, конечно, сохраню все связанные с сеансом данные в HttpSession, а запросы запроса, ответа и HttpSession передаются контроллеру, когда вызывается обработчик запроса контроллера.Статические классы в сервлете

UPDATE:

Вот пример:

public class MainControllerServlet extends HttpServlet { 
static HashMap<String, ControllerAbstract> controllers = new HashMap<String, ControllerAbstract>(); 

    public MainControllerServlet() 
    { 
     controllers.put("url", new Controller()); 
    } 

} 

ControllerAbstract:

public abstract class ControllerAbstract { 
    private String url; 
    private HashMap<String, ControllerAbstract> children = new HashMap<String, ControllerAbstract>(); 

    public abstract void handleRequest(HttpServletRequest request, HttpServletResponse response, SessionBean session, String type) throws Exception; 

} 
+0

Вы должны просто написать этот код, чтобы мы могли посмотреть –

+0

Его не полный код, а только части, которые вам нужно увидеть ... – newbie

+1

Немного в стороне от вашей темы ... но вы посмотрели на Весну (http://springsource.org), поскольку кажется, что вы пытаетесь написать что-то в том же ключе, что и Spring MVC. Просто предложение. – cjstehno

ответ

1

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

  • Ваша карта не является потокобезопасной, что может быть проблемой при конфликтах между созданием и извлечением объектов. Учитывая потенциальные проблемы с совместным использованием/потоком, где еще вы кладете объекты на карту?
  • У ваших объектов ControllerAbstract есть состояние, и вы можете столкнуться с ситуацией, когда несколько запросов будут использовать один и тот же контроллер. Например, будут ли какие-либо запросы добавлять к хэш-карте детей в свои собственные объекты ControllerAbstract? У вас может быть несколько запросов с использованием одного и того же ControllerAbstract - например. если запрос 1 хочет добавить или удалить на его карту ControllerAbstract.children, а запрос 2, ссылающийся на тот же объект, решает, что ему нужно итератировать через своих детей, вы получите исключение ConcurrentModificationException.
  • Строительство сервлета управляется контейнером. Если вам понадобится жестко указать URL-адрес, чтобы он существовал в конструкторе сервлета, это просто постоянная строка? Если да, то было бы проще просто объявить его как константу в объекте ControllerAbstract? Если нет, откуда это? В любом случае то, что вы делаете, изменяет карту контроллеров всякий раз, когда контейнер решает, что ему нужно создать новый сервлет.
+0

Что может быть потокобезопасным выбором для хранения контроллера? или я должен назвать контроллеры Url's? например/site_url/controller_url/=> controller_urlController (имя класса) и создать новый класс по имени класса? – newbie

1

Насколько я помню статический класс не более чем вложенный класс. Поэтому я не понимаю, почему он должен отличаться от обычного публичного класса.

2

Вы имеете в виду статические ссылки? нет таких вещей, как статические классы, , если они являются внутренними классами, но у них нет статического поведения. Если вы используете статические ссылки в качестве контроллеров, вы заботитесь обо всех атрибутах в этих контроллерах.

+0

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

1

Статические Внутренние классы ведут себя точно так же, как и обычные классы, они просто имеют дополнительный объем. Тем не менее, если вы разделяете состояние между классами, используя статические переменные во внешнем классе, это может привести к проблемам. Учитывая, что вы сказали, что будете использовать объект HttpSession для передачи данных между вызовами, это не будет проблемой для вас.

2

Статические внутренние классы являются альтернативой нормальным классам в другой упаковке. Поэтому вам не придется беспокоиться о том, что они смешиваются с вашими классами сервлетов.

Потому что вы называете .handleRequest() метод в результате сервлет вызовов, вы должны убедиться, что , что реализация ваших контроллеров Реентрантной. То естьих выполнение не должно использовать переменное хранилище, отличное от стека, и объекты, которые вы передаете в качестве аргументов.

Это говорит о том, что я бы выбрал контроллеры в своем пакете за пределами пакета, содержащего ваши сервлеты. Затем вы можете добавить класс менеджера, который владеет и инициализирует карту, и обрабатывает вызовы из сервлетов (абстрагирование деталей реализации.)

+0

Все контроллеры создаются в конструкторе сервлетов, и в дальнейшем эти обновления не будут обновлены или изменены – newbie

1

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

Смежные вопросы