【问题标题】:Static or nonstatic action in mvc?mvc中的静态或非静态动作?
【发布时间】:2012-02-19 14:11:10
【问题描述】:

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

在控制器(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 只初始化一次,并且对所有请求只初始化一次。只是将请求转发到我们修改请求或响应的操作。但是,我们为每个请求创建类的新实例。这里会发生内存溢出!?或不?

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

附:抱歉英语不好。

【问题讨论】:

    标签: java model-view-controller servlets


    【解决方案1】:

    单例模式如何获取Action类的实例?

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

    【讨论】:

    • 我知道该怎么做,但还有另一个问题。我在一个问题中展示的代码,基于 MVC 上的示例。但我认为这种方法有一个缺点。所以我问,这有什么理由吗?我只是一个初学者。
    • 如果并发请求数很高,为每个请求创建新实例可能会产生问题。大多数(可能是全部)使用 Singelton 模式来控制实例的数量。
    【解决方案2】:

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

    2,3,...,n 个请求 = 2,3,...,n 个 servlet。

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

    【讨论】:

    • 你错了。 servlet 的生命周期由部署 servlet 的容器控制。 Servlet 不能被垃圾收集器销毁。查看更多 servlet 生命周期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多