我开发了一个Web应用程序(WebApplication 1),它有一个servlet和许多JSP,这个应用程序有一定的功能(比方说No1)。
在该应用程序中,在servlet的processRequest(HttpServletRequest request, HttpServletResponse response)
方法中,有许多if else
语句,以便检测用户想要做什么。
的Servlet
public class MyServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException{
init();
HttpSession session = request.getSession(true);
String jspAction = request.getParameter("action");
if(jspAction.equals("home")){
//do sth
RequestDispatcher disp = getServletContext().getRequestDispatcher("/home.jsp");
disp.forward(request, response);
}else if(jspAction.equals("out")){
//do sth
RequestDispatcher disp = getServletContext().getRequestDispatcher("/out.jsp");
disp.forward(request, response);
}//etc..
}
}
在JSP链接或表单提交中,此链接格式为MyServlet?action=out
。按照这种方法,我现在有25条if语句。
所以我的问题是:这是构建我的应用程序的正确方法,还是应该为我想要做的每个函数创建不同的servlet?
答案 0 :(得分:2)
虽然这是一个有效的(也是非常基本的)解决方案,但最好使用MVC框架来解决这个问题,而不是重新发明轮子。作为应用程序访问点的中央servlet是一种常见做法,例如可以在早期Java EE design patterns中找到,作为"前端控制器" 和 "调度员视图" 。
例如,你应该看看Spring MVC或Struts 2。
答案 1 :(得分:1)
您可以使用java.util.HashMap<String, String>
配置导航规则。 Map键是动作参数值,Map值是jsp页面。
这样你就可以做到以下
HashMap<String, String> navigationMap = new HashMap<String, String>();
navigationMap.put("home", "/home.jsp");
navigationMap.put("out", "/out.jsp");
...
String jspAction = request.getParameter("action");
String page = navigationMap.get(jspAction);
RequestDispatcher disp = getServletContext().getRequestDispatcher(page);
...
这将解决你的大if-else问题,但如果你想为每个navigationRule做一些动作,你将不得不使用一个更复杂的Map来映射一个处理请求和返回页面的Action对象。
这是像Structs或JSF那样的MVC框架的一些方式,为什么不尝试MVC框架?