我试图了解如何实施“命令设计”'进入我的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文件中使用)?
我希望有人可以给我一个基本结构并告诉我如何开始实现它。
答案 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>();
将所有操作对象放入构造函数中的actionMap
或Servlet#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.jsp
,add.jsp
等。
创建一个控制器servlet,其唯一目的是检查命令并根据命令发送更正后的视图。
基本上我说的是一个众所周知的 MVC [模型 - 视图 - 控制器]模式。
有关详细信息,请查看Model–view–controller。