mvc-review

review:

1.最初的做法:一个请求对应一个servlet,这样存在的问题是servlet太多了

2.改动:把一系列请求都对应一个servlet,

IndexServlet / AddServlet / DelServlet / UpdateServlet ...-> 合并成FruitServlet

通过一个operate的值来决定调用FruitServlet中的哪个方法

使用的是swtich-case
3、在上一个版本中,Servlet中充斥着大量switch-case,试想以下,随着项目业务规模扩大,那么会有大量switch-case冗余
    因此,我们在servlet中使用了反射技术,我们规定operate的值和方法名一致,那么接收到operate的值是什么就表明我们需要
    调用对应的方法进行响应,如果找不到对应的方法,则抛异常
4、在上一个版本中,我们使用了发射技术。但其实还存在问题:每个servlet中都有类似的反射技术代码。
    因此,继续抽取,设计了中央控制器:DispatcherServlet
    DispatcherServlet这个类的工作分为两个部分:
        1、根据url定位到能够处理这个请求的controller组件:
            1)从url中提取servletPath:/fruit.do -> fruit
            2)根据fruit找到对应的组件:FruitController,这个对应关系我们存储在applicationContext.xml中
               
                通过Dom技术解析xml文件,在中央控制器形成一个beanMap容器,用来存储所有Controller组件
            3) 根据获取到的operate的值定位到FruiteController中需要调用的方法
        2、调用Controller组件中的方法
            1)获取参数
                获取即将调用的方法的参数签名信息:Parameter[] parameters = method.getParameters();
                通过parameter.getName()获取参数的名称;通过parameter.getType()获取参数类型
                准备了Object[] parameterValues这个数组来存放对应参数的值
                另外,我们需要考虑参数的类型问题,需要做类型转化的工作。通过parameter.getType()获取参数的类型
            2) 执行方法
                Object returnObj = method.invoke(controllerBean,parameterValues);
            3) 视图处理
                String returnStr = (String)ReturnObj;
                if(returnStr.startWith("redirect:")){
                    ...
                }else if ...

你可能感兴趣的:(mvc)