你说:
最近尝试单纯使用Servlet来做Control,实现MVC。 
由于之前都是直接使用Struts来做MVC,能够很好的避免Control过多问题,但是换成Servlet,始终没有找到好的解决方法但请你注意,在struts 中ActionServlet就是一个Servlet,来做Control的
在一般的jsp+sevlet项目中,servlet就是做control。如果单纯使用Servlet实现MVC,要分情况考虑了:要是业务逻辑比较简单,使用Servlet实现比较好(但注意不一定就是MVC框架);要是业务逻辑比较复杂,要是使用servlet而不使用映射机制控制就比较繁琐了,
你要把所有的流程都要想到,这样你就会发现做的好累的。
所以总结起来就是:没有必要非要使用Servlet来实现MVC(这里先不讨论能不能实现和实现后效率问题)
重要的是拿到一个东西,你能很好的判断使用什么来解决他就是很高的境界了!不过楼主有这个思路已经很不错了

解决方案 »

  1.   

    我当初刚用Servlet做MVC,就被Struts吸引了,发现Struts很好用。   最近遇见一个小的项目,准备尝试不使用框架来做MVC,发现业务逻辑还是满复杂的,单纯的使用Servlet没啥好的解决方法,没有动态的方法调用。
       我想这也是MVC框架之所以如此受欢迎的原因吧。  楼上的说的很好,任何MVC框架都是借用Servlet的,Struts1,2,Spring都是这样。
      

  2.   

    把之前那个方法调用,使用反射做了下:
    public abstract class BaseAction extends HttpServlet {

    public void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

    String methodName = request.getParameter("method");
    Method methods[] = this.getClass().getMethods();
    for(int i=0;i<methods.length;i++){
    if(methods[i].getName().equals(methodName)){
    System.out.println("methodName-->"+methods[i].getName()+"参数长度->"+methods[i].getParameterTypes().length);
    try {
    if(methods[i].getParameterTypes().length==2){
    Object[] args = {request,response};
    methods[i].invoke(this,args);// 调用
    }else if(methods[i].getParameterTypes().length==3){
    String userid = (String)request.getSession().getAttribute("userid");
    Object[] args = {request,response,userid};
    /**
     * 这里就不做权限认证了
     */
    methods[i].invoke(this,args);// 调用
    }
    break;
    } catch (IllegalArgumentException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    } catch (InvocationTargetException e) {
    e.printStackTrace();
    }
    }
    }
    }
                                 /**省略**/
    }