Как мне реализовать фронт-контроллер в Java? - PullRequest
1 голос
/ 10 февраля 2010

Я пишу очень простой веб-фреймворк, использующий Java-сервлеты в учебных целях. Я делал это раньше в PHP, и он работал, обращаясь к URI запроса, а затем создавая соответствующий класс и метод.

В PHP это работало нормально, так как можно сделать что-то вроде $c = new $x; $x->$y;. Однако я не уверен, как перевести это на Java или даже если это подходящий способ сделать это.

Пока что я пробовал:

Router router = new Router(request.getPathInfo());
String className = router.route(); //returns com.example.controller.Foo

Class c = Class.forName(className);
Object x = c.newInstance();

Foo y = (Foo) x;
y.doSomething();

Это кажется подходящим для пары маршрутов, но не похоже, что оно будет хорошо масштабироваться и не позволит получать маршруты из файла конфигурации.

Как мне заставить это работать?

Ответы [ 4 ]

2 голосов
/ 10 февраля 2010

Получите действия в Map<String, Action>, где ключ String представляет собой более или менее комбинацию метода запроса и информации о пути запроса. Я уже публиковал подобный ответ здесь: Java Front Controller

Вы можете заполнить такую ​​карту либо статически (жестко закодировать все действия), либо динамически (соглашение по конфигурации, поиск классов в определенном пакете, или сканирование всего пути к классам для классов с определенной аннотацией или реализация определенного интерфейса). 1007 *

И просто придерживайся сервлета. Фильтр не существует для. При максимальном использовании его необходимо переслать запрос к сервлету контроллера. В сервлете просто внедрите HttpServlet#service().

2 голосов
/ 10 февраля 2010

Я бы использовал Servlet Filter в качестве переднего контроллера. Маршрутизатор будет соединять пути с диспетчерами запросов. В методе doFilter вы должны преобразовать ServletRequest в HttpServletRequest, извлечь путь запроса и сопоставить его с зарегистрированными сопоставлениями. Результатом этого сопоставления является диспетчер запросов, с которым вы бы отправляли запрос.

В псевдокоде:

doFilter(ServletRequest request, ServletResponse response) {
  httpServletRequest = (HttpServletRequest) request;
  path = httpServletRequest.getRequestURI();
  dispatcher = router.getTarget(path);
  dispatcher.dispatch(request, response);
}

В зависимости от ваших потребностей может быть достаточно стандартного механизма маршрутизации Servlet API.

0 голосов
/ 10 февраля 2010

Как это сделать? Однако вы хотите этого. Если вы просто делаете это в учебных целях, все, что вы делаете, будет хорошо.

Я бы предложил, чтобы все ваши действия реализовывали один и тот же интерфейс (возможно, расширяя сервлет), чтобы вам не приходилось компилировать во всех разных классах.

Тогда вы можете по существу делать то, что делаете, за исключением того, что ваше приведение к Foo становится приведением к Servlet, и тогда вам не нужно иметь особый случай для всех ваших различных классов.

Затем вы также можете загрузить маршруты из конфигурации (возможно, файла XML).

По сути, то, что вы делаете, реализуется инфраструктурой Struts 1 , поэтому стоит почитать об этом (это с открытым исходным кодом, так что вы также можете посмотреть на источник, если хотите).

0 голосов
/ 10 февраля 2010

Не совсем уверен, что вы ищете, но вы можете взглянуть на Java-сервлеты. Конечно, многие веб-фреймворки абстрагируются от простых сервлетов, но это отличное место, чтобы начать изучать веб-приложения на Java, если вы спросите меня (что вы косвенно сделали;))

Скачать спецификацию Java-сервлета можно здесь: Спецификация Java-сервлета - это довольно интересно.

...