Использование статики - очень плохая идея, поскольку, если вы получаете два запроса одновременно, они будут переписываться друг с другом. Возьмите этот тривиальный пример, чтобы увидеть, что может пойти не так:
1:public class Server extends HttpServlet {
2: public static int requestNo = 0;
3: public void doGet(HttpServletRequest req, HttpServletResponse resp)
4: {
5: requestNo++;
6: resp.getWriter().println(requestNo);
7: }
8:}
Теперь представьте себе следующую временную шкалу:
Запрос 1 поступает и обрабатывает до и включительно строки 5.
Запрос 2 поступает и обрабатывается полностью.
Запрос 1 продолжает обработку.
Оба запроса получат текст «2» вместо одного, получающего «1», и одного, получающего «2». Это простой пример того, как государство наступает.
Теперь, чтобы ответить на вторую часть вашего вопроса;
Или я должен переписать код и изменить его на Public UserClass User вместо Public static UserClass User и т. Д.?
Нет, это тоже недостаточно, поскольку спецификация J2EE позволяет контейнеру сервлета использовать один экземпляр класса для обслуживания всех запросов для этого отображения сервлета, то есть переменные уровня экземпляра будут иметь точно такие же как статические, они распределяются между всеми запросами.
Это оставляет только три реальных варианта:
- Запихните все в HTTPSession. Проблема здесь в том, что это карта, поэтому вы теряете безопасность типов, и трудно понять, где что-то используется.
- Создайте класс Holder для хранения всего вашего состояния и передавайте его везде. Это немного лучше, так как, по крайней мере, вы не потеряете безопасность типов, но у вас все еще нет полной видимости.
- Раздайте отдельные необходимые предметы.