手写SpringMVC简易DispatchServlet
SpringMVC中的DispatchServlet使用了适配器模式,来适配Controller类。当需要新增Controller类的时候,可以在不修改原有框架代码的基础上,添加HandlerAdapter类即可正常工作。
Controller类
public interface Controller {
}
class AnnotationController implements Controller {
public void doAnnotationController() {
System.out.println("annotation...");
}
}
class HttpController implements Controller {
public void doHttpHandler () {
System.out.println("http...");
}
}
class SimpleController implements Controller {
public void doSimplerHandler() {
System.out.println("simple...");
}
}
HandlerAdapter类
public interface HandlerAdapter {
void handle(Object controller);
boolean supports(Object controller);
}
class AnnotationHandlerAdapter implements HandlerAdapter {
public void handle(Object handler) {
((AnnotationController) handler).doAnnotationController();
}
public boolean supports(Object handler) {
return (handler instanceof AnnotationController);
}
}
class HttpHandlerAdapter implements HandlerAdapter {
public void handle(Object handler) {
((HttpController) handler).doHttpHandler();
}
public boolean supports(Object handler) {
return (handler instanceof HttpController);
}
}
class SimpleHandlerAdapter implements HandlerAdapter {
public void handle(Object handler) {
((SimpleController) handler).doSimplerHandler();
}
public boolean supports(Object handler) {
return (handler instanceof SimpleController);
}
}
DispatchServlet类
public class DispatchServlet {
public static List<HandlerAdapter> handlerAdapters = new ArrayList<>();
public DispatchServlet() {
handlerAdapters.add(new AnnotationHandlerAdapter());
handlerAdapters.add(new HttpHandlerAdapter());
handlerAdapters.add(new SimpleHandlerAdapter());
}
public void doDispatch() {
AnnotationController controller = new AnnotationController();
HandlerAdapter adapter = getHandler(controller);
adapter.handle(controller);
}
private HandlerAdapter getHandler(Controller controller) {
for (HandlerAdapter ha : handlerAdapters) {
if (ha.supports(controller))
return ha;
}
return null;
}
public static void main(String[] args) {
new DispatchServlet().doDispatch();
}
}