我构建了我的servlet吗?

时间:2015-09-07 09:08:28

标签: tomcat servlets web-applications

我开发了一个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?

2 个答案:

答案 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框架?