Статические классы в сервлете - PullRequest
0 голосов
/ 27 октября 2009

Я делаю статические классы в сервлете, эти классы являются контроллерами для веб-страниц. Запросы перенаправляются на контроллеры по 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;

}

Ответы [ 6 ]

2 голосов
/ 27 октября 2009

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

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

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

2 голосов
/ 27 октября 2009

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

1 голос
/ 28 октября 2009

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

1 голос
/ 27 октября 2009

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

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

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

1 голос
/ 27 октября 2009

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

...