#java #session #gwt #servlets
#java — язык #сеанс #gwt #сервлеты #java
Вопрос:
Как я могу обрабатывать статические переменные внутри моего сеанса сервера?
У меня есть 30 различных функций, не имеющих реальной реализации на сервере, но в настоящее время они обмениваются данными через некоторые статические переменные (я знаю, что это плохо, но я просто тестировал это). Теперь, если у меня разные клиенты, подключающиеся к серверу, они будут взаимодействовать друг с другом, и ни один клиент не получит нужные данные.
Итак, я подумал, какой хороший способ обрабатывать эти разные данные сеанса, не передавая двадцать ссылок на другие объекты классу при создании класса.
Другая проблема заключается в том, что классы создают экземпляры потоков, поэтому я не могу быть уверен, что действия будут завершены, когда я отправлю ответы обратно на сервер. (Таким образом, переключение текущих статических переменных в зависимости от клиента не является вариантом)
Комментарии:
1. Используете ли вы статические переменные, чтобы определить, завершены ли ваши потоки? Помогите мне понять, почему вам все еще нужны статические переменные 🙂
2. Я хочу пометить этот вопрос чем-то другим, а не просто [java]. Подходит ли [j2ee]? Или есть что-то специфичное для веб-сервера, например [weblogic] или [struts] или что-то еще?
3. @ Bart Vangeneugden: использовать статические переменные было легко, потому что мне не нужно было передавать 20 переменных, когда мне это было нужно в классе, я просто обращался к статической переменной (поэтому есть такие вещи, как высота окна клиента … и т.д.)
4. @Эрик Робертсон: Не знаю, в зависимости от ответов, я думаю…
5. @Erick: OP, скорее всего, имеет в виду Servlet API.
HttpSession
и далее.
Ответ №1:
Если вы не хотите размещать все эти вещи в сеансе ( session.setAttribute(..)
и .getAttribute()
), то, возможно, вы можете использовать карту карт:
public static Map<String, Map<String, Object>> sessionValues = ...
и установите / получите из этой карты. Где:
- ключом 1-й карты является идентификатор сеанса (может быть получен через
session.getId()
- ключом 2-й карты является имя свойства
- значение 2-й карты является значением свойства
Таким образом, вы сможете иметь значения, уникальные для сеансов, не полагаясь на servlet API.
Комментарии:
1. проблема с этим заключается в том, что не у каждого класса есть идентификатор сеанса … (или есть у них)
2. вам придется передавать его по кругу. Это один строковый параметр, так что это не должно быть проблемой. Вы должны каким-то образом идентифицировать сеанс, сервлет или нет.
3. Я делаю это, но если я передам идентификатор сеанса, я мог бы также передать класс, объединяющий все общие поля (который тогда был бы только ссылкой, так что на самом деле было бы быстрее)
4. да, это тоже хороший вариант, если он не нарушает границ слоя
5. что вы подразумеваете под нарушением границ слоя?