Статическое или нестатическое действие в mvc? - PullRequest
2 голосов
/ 26 января 2012

Я хочу спросить вас о MVC. Как это устроено. Итак, это простой пример (я не использую никаких фреймворков)

в контроллере (сервлете):

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    processRequest(request, response);
}

protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    processRequest(request, response);
}

private void processRequest(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    String page = null;
    AbstractCommand action;

    action = ActionFactory.getAction(request);// get command from factory
    page = action.execute(request, response); 
    RequestDispatcher dispatcher = getServletContext()
            .getRequestDispatcher(page);
    dispatcher.forward(request, response);
}

для действий мы создаем общий интерфейс (шаблон стратегии):

public interface AbstractAction {

    public String execute(HttpServletRequest request, HttpServletResponse response);
}

Простое действие (пример):

public class HelloAction implements AbstractAction {

    @Override
    public String execute(HttpServletRequest request,
            HttpServletResponse response) {
        //....(some actions to modify request)
        String page = "/main.jsp";
        return page;
    }   
}

А теперь наш завод:

public class ActionFactory {

    private enum Actions{
        HELLO;
    }

    public static AbstractAction getAction(HttpServletRequest request){
        String action = request.getParameter("action");//take parameter from jsp
        Actions actionEnum = Actions.valueOf(action.toUpperCase());
        switch (actionEnum) {
        case HELLO:
            return new HelloAction(); 
        }
    }
}

Мы пришли к тому месту, где я в замешательстве. Сервлет инициализируется только один раз и только один для всех запросов. Просто перенаправляет запросы на действия, где мы изменяем запрос или ответ. Но мы создаем НОВЫЙ экземпляр класса для каждого запроса. Здесь может произойти переполнение памяти !? Или нет?

Можем ли мы сделать эти действия статическими (статический метод, один для всех запросов)? Если два запроса поступят одновременно, что с ними будет?
Что вы думаете по этому поводу, пожалуйста, поделитесь своим опытом.

P.S. извините за плохой английский.

Ответы [ 2 ]

1 голос
/ 26 января 2012

Как насчет шаблона Singleton для получения экземпляра класса Action?

  1. Просто добавьте метод abstact getInstance() в AbstractAction.
  2. Сделайте так, чтобы каждая реализация предоставляла свой собственный экземпляр.
  3. В каждом классе реализации используйте шаблон Singleton, чтобы существовал только один экземпляр.
  4. Убедитесь, что ни один класс действий не хранит никаких данныхна конкретный запрос.
0 голосов
/ 26 января 2012

Как я понял jsp, все это без сохранения состояния, если вы обращаетесь к сервлету по запросу http, сервлет будет создан в новом экземпляре. После выхода из сервлета с помощью .forward () он будет освобожден сборщиком мусора.

2,3, ..., n запросов = 2,3, ..., n сервлетов.

путем пересылки в jsp, единственный способ получить доступ к сервлету из jsp - это новый http request = new servlet. (перейдем к методу doPost)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...