2015-03-23 4 views
0

Я столкнулся с ситуацией, когда значение счетчика продолжает увеличиваться при обработке входящего HTTP-запроса, а не на 0. Оно действует как переменная класса вместо переменной экземпляра. Интересно, что это b/c, как только экземпляр класса Foo создается впервые, а затем для следующего раунда запроса создается поток для одного и того же экземпляра. Кажется бессмысленным иметь переменную «counter» в качестве переменной экземпляра. Я должен сделать это как локальную переменную в методе doPost, если я хочу сбросить ее до нуля, как только процесс входящих данных будет завершен для следующего раунда входящего запроса. Есть ли лучший способ справиться с этой ситуацией как часть переменной класса?сбрасывать переменную экземпляра для класса сервлета для каждого входящего запроса

public class Foo extends HttpServlet { 
    private int counter = 0; 

    protected void doPost(.....) throws Exception { 
     // process incoming request data 
     // increment counter by one 
     counter++; 
     ...... 
    } 
} 
+1

Спецификация сервлета явно рекомендует, чтобы сервлеты были без гражданства, чтобы избежать этой проблемы. Почему вы поддерживаете счетчик в первую очередь? Это звучит как [вопрос XY] (http://meta.stackexchange.com/a/66378). –

+0

@Tom G: Я не понимал, что значение stateless для класса сервлета. Теперь я это делаю. Спасибо за ваше объяснение! – DaeYoung

ответ

1

Я не понимаю, что именно вы собираетесь достичь, но в целом вы должны избегать держать любое состояние в объектах сервлетов. Используйте request.getAttribute(), request.setAttribute(), request.getSession(). GetAttribute() или request.getSession(). SetAttribute(). В качестве альтернативы вы можете использовать компоненты с областью охвата или областью сеанса, например, jsf или spring.

+0

Я буду иметь в виду «..содерживать сохранение состояния в объектах сервлета». Спасибо! – DaeYoung

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