2011-01-27 2 views
3

Так я нашел кучу Struts 2 примера CRUD вокруг сети:Рекомендации по Struts 2 CRUD

Struts 2 CRUD Demo

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

Apache Struts 2 Web Application Development ISBN : 978-1847193391

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

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

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

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

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

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

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

ответ

6

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

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

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

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

Это подход, который я бы отстаивал, хотя я не использую интерфейс ModelDriven. Для получения дополнительной информации ознакомьтесь с how Struts2 ModelDriven interface works и комментариями к моему ответу. Используете ли вы ModelDriven или нет, это всего лишь личный выбор. Кроме того, проверьте why is model-driven action preferred over object backed bean properties.

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

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

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

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

+0

+1 Я делаю то же самое. Как правило, эти действия в одном классе и для функции ajax я просто удаляю json-пакет и аннотацию типа результата в класс, и все это работает персик. – Quaternion

0

Я использую Struts 2 около 3 лет. Я использую ModelDriven и Prepareable вместе в одном и том же действии. Каждый объект (модель) домена имеет класс действия struts, который возвращает список или отдельный объект в зависимости от того, был ли id передан в действие. Это работает очень хорошо для меня, и единственный раз, когда это было проблематично, это использование 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; 
    } 

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