Лучшие практики для Struts 2 CRUD - PullRequest
3 голосов
/ 27 января 2011

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

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

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

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

Проектирование и программирование Struts 2 ISBN: 978-0980331608

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

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

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

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

Есть ли передовой опыт?способ сделать заполнение формы в Struts 2?

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

Ответы [ 2 ]

6 голосов
/ 27 января 2011

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

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

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

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

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

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

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

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

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

0 голосов
/ 28 января 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;
    }

}
...