Java servlet - 实现命令模式

时间:2014-04-19 08:38:24

标签: java jsp servlets request command-pattern

我试图了解如何实施“命令设计”'进入我的java servlet。这是servlet的一个例子:

protected void processRequest(HttpServletRequest ...) {

    String action = request.getParameter("action"); 
    String destination = null;

    } if (action.equals("Home")) 
        destination = "Home";
    } else if (action.equals("Add")) {
         String var = request...

         try {
            db.add(var);
         } (DatabaseException e) {
            request.setAttribute("errorMessage", e.getMessage());
         }
         ...
    }
 }

我的理解是每个if语句都应该转换为一个单独的类,其中包含一个处理例如添加对象的执行函数。我不明白的是请求是如何处理的,它们是在execute函数中处理还是从那里返回到Servlet / JSP(我的catched错误放在请求中并在我的JSP文件中使用)?

我希望有人可以给我一个基本结构并告诉我如何开始实现它。

2 个答案:

答案 0 :(得分:8)

  

如何实施命令设计'进入我的java servlet。

什么是命令模式?

在面向对象的编程中,命令模式是一种行为设计模式,其中一个对象用于表示和封装稍后调用方法所需的所有信息。此信息包括方法名称,拥有该方法的对象以及方法参数的值。

来源:wekipedia

要在您的案例中实施命令设计模式HttpServletRequest动作参数主页& 添加,我正在考虑两个更像删除更新等。

你说,

  

我的理解是每个if语句都应转换为a   使用执行函数来分隔类,该函数处理例如   添加一个对象。

好的,创建一个interface,其执行方法返回类型为String,即视图名称。像:

public interface Action {
   public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception
}

为所有操作创建具体的操作类,如:

public class HomeAction implements Action {
    public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
         //perform your home related action here..
         return "home";
    }
}

然后你说,

  

我捕获的错误被放入请求中并在我的JSP文件中使用。

所以实现添加动作类,如:

public class AddAction implements Action {
    public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {

         //get request parameters here..

         try {
               //perform add action which throws exception..
               return "success";
         }catch(DatabaseException e) {
               request.setAttribute("errorMessage", e.getMessage());// to show exception msg in jsp.
              //log exception to console or file here..
              return "failure";
         }
    }
}

同样的更新& amp;删除,然后在Servlet中将所有操作保留在以下地图中:

//Declare one map in your servlet to hold all concrete action objects.
private Map<String,Action> actionMap = new HashMap<String,Action>();

将所有操作对象放入构造函数中的actionMapServlet#init(ServletConfig config)中:

actionMap.put("home", new HomeAction());
actionMap.put("add", new AddAction());
actionMap.put("update", new UpdateAction());
actionMap.put("delete", new DeleteAction());

在没有if&amp;的情况下执行操作Servlet#service(HttpServletRequest request, HttpServletResponse response)

中的else条件
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String actionKey = request.getParameter("action");
        Action action = actionMap.get(actionKey);
        String view = action.execute(request, response);

        //Here, if view is if failure then, forward to jsp, to available request attributes in jsp. 
        //      if view is success redirect to jsp..

}

答案 1 :(得分:2)

您可以创建多达任何命令的视图。例如home.jspadd.jsp等。

创建一个控制器servlet,其唯一目的是检查命令并根据命令发送更正后的视图。

基本上我说的是一个众所周知的 MVC [模型 - 视图 - 控制器]模式

有关详细信息,请查看Model–view–controller

enter image description here