воскресенье
Про AppFuse
Использование MultiActionController для CRUD. Часть 1
Какую функциональность чаще всего приходиться реализовывать в веб-приложениях? Не знаю, как вам, а лично мне очень часто приходится программировать стандартные CRUD-операции над разными сущностями. На всякий случай напомню, что CRUD расшифровывается как Create, Read, Update, Delete (т.е. по-русски это будет примерно так: Создание, Чтение, Обновление, Удаление).
Данная статья предполагает, что вы используете программный каркас Spring версии 2.5, в частности, одну из его компонент – Spring MVC. Рассмотрим, что Spring MVC может нам предложить для CRUD по части контроллеров.
Spring MVC предлагает нам большое количество разнообразных контроллеров. Это и SimpleFormController для упрощения работы с формами, и AbstractWizardFormController для построения т.н. «мастеров». Есть среди контроллеров и MultiActionController, который, собственно, и представляет сейчас для нас наибольший интерес.
Данный контроллер поддерживает (вольный пересказ Spring Reference) «аггрегацию множественных методов обработки запросов в один контроллер для группировки схожей функциональности». Думаю, бесспорно, что CRUD-операции над сущностью попадают под определение «схожей функциональности».
Итак, для начала нам следует создать наследника класса MultiActionController.
public class BeanController extends MultiActionController { ... }
Затем добавим к контроллеру методы list, view, edit, save.
//просмотр списка сущностей
public ModelAndView list(HttpServletRequest request,
HttpServletResponse response) { ... }
//просмотр сущности
public ModelAndView view(HttpServletRequest request,
HttpServletResponse response) { ... }
//подготовка к редактированю сущности
public ModelAndView edit(HttpServletRequest request,
HttpServletResponse response) { ... }
//сохранение/обновление и удаление сущности
public ModelAndView save(HttpServletRequest request,
HttpServletResponse response, Bean beanToSave) { ... }
}
Надо отметить, что эти методы не соответствуют CRUD-операциям на 100%. Однако с их помощью будет легко соорудить UI схожий с тем, который генерируется scaffolding-ом Ruby On Rails - т.е. страницу со списком объектов, страницу с подробной информацией об объекте и страницу с формой для редактирования объекта.
Прежде чем писать "начинку" для этих методов, пропишем наш контроллер в конфигурационном файле для Spring MVC. По умолчанию он называется dispatcher-servlet.xml и должен храниться на classpath-е нашего приложения.
Добавляем bean нашего контроллера:
<bean id="beanController " class="com.mycompany.BeanController ">
<property name="methodNameResolver" ref="actionResolver"/>
</bean>
Контроллеру надо сделать как минимум одну инъекцию в свойство methodNameResolver. Это объект, реализующий интерфейс MethodNameResolver из пакета org.springframework.web.servlet.mvc.multiaction. У него есть единственный метод со следующей сигнатурой:
String getHandlerMethodName(HttpServletRequest request) throws NoSuchRequestHandlingMethodException.
Нетрудно догадаться, что по контракту он должен вернуть имя метода, который будет выполнять обработку запроса.
<bean id="actionResolver" class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver"/>
Работает он следующим образом.
Мы прописываем отображение запросов по определенным путям на наш контроллер в urlMapping:
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"
<property name="mappings">
<value> /bean/*=beanController</value>
</property>
<property name="order" value="0"/>
</bean>
Теперь строка, которая в URL идет после "/bean/" будет ассоциироваться с одноименным методом нашего контроллера. Таким образом, наши методы привязаны к URL-ам /bean/view.html, /bean/list.html, /bean/edit.html и /bean/save.html при условии, что DispatcherServlet обрабатывает запросы вида *.html.
Продолжение следует...
Это beta-версия статьи.