2010-02-10 2 views
1

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

Это хорошо работает на 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(); 

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

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

ответ

0

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

Загрузить спецификацию сервлета Java здесь: Java Servlet Spec - это довольно интересно.

+0

К сожалению, я забыл упомянуть, что мой код до сих пор реализован как сервлет. – etheros

+0

... Спецификация Servlet стоит прочитать. – deamon

0

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

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

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

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

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

2

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

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

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

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

+1

Pathinfo недоступен в фильтрах. – BalusC

+0

pathinfo доступен после каста ServletRequest для HttpServletRequest. – deamon

+0

Я не имел в виду это :) Он всегда будет возвращать null в фильтрах. – BalusC

1

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

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

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

+0

Преимущество фильтра заключается в том, что вы можете использовать его вместе с сервлетами, которые не отображаются на переднем контроллере. Кабинет использует этот подход. – deamon

+0

Это будет «патч» MVC для существующих приложений на сервлетах, а не для полнофункциональной структуры MVC. – BalusC

Смежные вопросы