mvc中的静态或非静态动作?

时间:2012-01-26 13:34:09

标签: java model-view-controller servlets

我想问你关于mvc的事。这个怎么运作。所以,这是一个简单的例子(我不使用任何框架)

在Controller(Servlet)中

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(); 
        }
    }
}

我们来到了困惑的地方。 Servlet只初始化一次,所有请求只有一个。只是转发对我们修改请求或响应的操作的请求。但是,我们为每个请求创建类的NEW实例。这里可以发生内存溢出!?或不?

我们可以将这些操作设为静态(静态方法,一个用于所有请求)?如果两个请求同时发生,他们会发生什么? 您对此有何看法,请分享您的经验。

P.S。抱歉英语不好。

2 个答案:

答案 0 :(得分:1)

如何使用Singleton模式获取Action类的实例?

  1. 只需在abstact getInstance()中添加一些AbstractAction方法即可。
  2. 让每个实现提供自己的实例。
  3. 在每个实现类中,使用Singleton模式,以便只存在一个实例。
  4. 确保没有操作类存储与特定请求相关的任何数据。

答案 1 :(得分:0)

正如我理解jsp,整个事情是无状态的,如果你通过http请求访问servlet,servlet将在一个新实例中创建。 通过.forward()离开servlet后,它将被垃圾收集释放。

2,3,...,n requests = 2,3,...,n servlets。

通过转发到jsp,从jsp访问servlet的唯一方法是新的http request = new servlet。 (将移至doPost方法)