我想问你关于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只初始化一次,所有请求只初始化一个。只是将请求转发到我们修改请求或响应的操作。但是,我们为每个请求创建新的类实例。这里可能发生内存溢出!?还是不?
我们可以使这些操作成为静态的吗(静态方法,一对所有请求)?如果两个请求同时出现,他们会发生什么
你对此有什么看法,请分享你的经验。
附言:抱歉英语不好。
Singleton模式如何获得Action类的实例?
- 只需在
AbstractAction
中添加一些abstact getInstance()
方法即可 - 让每个实现都提供自己的实例
- 在每个实现类中,使用Singleton模式,以便只存在一个实例
- 确保没有任何操作类存储与特定请求相关的任何数据
正如我对jsp的理解,整个过程是无状态的,如果你通过http请求访问servlet,那么servlet将在一个新实例中创建。在通过.forward()离开servlet之后,它将通过垃圾回收来释放。
2,3,。。。,n个请求=2,3,。。。,n个servlet。
通过转发到jsp,从jsp访问servlet的唯一方法是一个新的http请求=新的servlet。(将转到doPost方法)