Лучшие практики для Struts 2 CRUD

Итак, я нашел кучу примеров Struts 2 CRUD в Интернете:

Демонстрация Struts 2 CRUD

и несколько книг:

ISBN разработки веб-приложений Apache Struts 2: 978-1847193391

Struts 2 Дизайн и программирование ISBN: 978-0980331608

Но все они немного отличаются тем, как формировать население.

Некоторые предлагают реализовать интерфейсы Java ModelDriven или Prepareable для вызова функции подготовки для предварительного заполнения любых необходимых элементов данных.

Другие предлагают создать собственное действие PrepareForUpdate, которое вызывает функцию предварительного заполнения, а затем перенаправляет в основное представление редактирования.

Они также очень хорошо знают, как передать идентификатор объекта, чтобы указать, какой объект нужно получить для редактирования. Некоторые предлагают перехватывать то, что другие добавляют в параметры URL, и извлекать их через ActionContext или передавать через поле s:hidden.

Есть ли способ наилучшей практики для формирования населения в Struts 2?

Каковы преимущества/недостатки методов, упомянутых выше?


person Spacebob    schedule 27.01.2011    source источник


Ответы (2)


Мне неизвестны какие-либо задокументированные передовые практики, но я использую Webwork и Struts2 уже около трех лет, поэтому могу рассказать вам, что я использовал в своих проектах. Кстати, демонстрационная документация CRUD, на которую вы ссылались, кажется мне немного устаревшей (я понимаю ее с сайта проекта).

Я разделил свою работу с CRUD на три разных действия:

  • Действие, которое перечисляет сущности. Он поддерживает нумерацию страниц и заполняет какой-либо вид таблицы или сетки.
  • Действие, которое обрабатывает функции добавления и редактирования. Использует метод prepare() для настройки раскрывающихся списков и т. д.
  • Действие, которое обрабатывает функцию удаления.

Некоторые предлагают реализовать интерфейсы Java ModelDriven или Prepareable для вызова функции подготовки для предварительного заполнения любых необходимых элементов данных.

Я бы рекомендовал именно этот подход, хотя я и не использую интерфейс ModelDriven. Подробнее см. в разделе как работает интерфейс Struts2 ModelDriven и в комментариях к мой ответ. Используете ли вы ModelDriven или нет, это просто личный выбор. Кроме того, проверьте почему действие, управляемое моделью, предпочтительнее, чем свойства компонента, поддерживаемые объектами.

Другие предлагают создать собственное действие PrepareForUpdate, которое вызывает функцию предварительного заполнения, а затем перенаправляет в основное представление редактирования.

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

Они также очень хорошо знают, как передать идентификатор объекта, чтобы указать, какой объект нужно получить для редактирования.

Просто передайте идентификатор в URL или форме. Это стандартный подход для веб-приложений.

person Steven Benitez    schedule 27.01.2011
comment
+1 Я делаю то же самое. Обычно эти действия находятся в одном классе, а для функциональности ajax я просто добавляю пакет json и аннотацию типа результата к классу, и все работает отлично. - person Quaternion; 28.01.2011

Я использую Struts 2 около 3 лет. Я использую ModelDriven и Prepareable вместе в одном действии. Каждый объект предметной области (модель) имеет класс действий Struts, который возвращает список или один объект в зависимости от того, был ли идентификатор передан действию. Это работает очень хорошо для меня, и единственный раз, когда это было проблематично, - это использование Ajax. Обычно я выделяю свои действия Ajax в отдельное действие для модели, если я их использую. Я сохраняю идентификатор модели, а также любые связанные объекты, которые могут мне понадобиться, в виде скрытых полей HTML в представлении.

При таком подходе действие и вид успокаивают. Вы можете покинуть страницу на длительный период времени и вызвать действие, не опасаясь, что действие не удастся. Вот пример:

public class ApplicationAction extends MyBaseAction 
implements ModelDriven<Application>, Preparable {

    private static final long serialVersionUID = 7242685178906659449L;
    private ApplicationService applicationService;
    private Application application;
    private Integer id;
    List<Application> allApplications;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

    public Application getModel() {
        return application;
    }

    public void prepare() throws Exception {
        if(id == null || id.intValue() == 0){
            application= new Application();
        }else{
            application= applicationService.getApplication(id);
        }
    }

    @SkipValidation
    public String list() throws Exception {
        allApplications = applicationService.getApplications();
        return SUCCESS;
    }

    @Validations( visitorFields = {@VisitorFieldValidator(message = "Validation Error", fieldName = "model", appendPrefix = false)})
    public String update() throws Exception {
        applicationService.saveApplication(application);
        addActionMessage("Application Saved Successfully.");
        return SUCCESS;
    }

    public void setApplicationService(ApplicationService applicationService) {
        this.applicationService = applicationService;
    }

    public List<Application> getAllApplications() {
        return allApplications;
    }

}
person Griff    schedule 27.01.2011