2015-05-03 3 views
2

Я пытаюсь создать веб-интерфейс для нашей БД, используя Struts2.Наследование с помощью действия ModelDriven в Struts2

Мне удалось отобразить и заполнить все поля в веб-форме, но теперь проблема с сохранением ввода в БД.

Вот сниженный пример проблемы (конечно, это не реальный код, но достаточно, чтобы понять дилемму:

Animal.java:

public class Animal{ 
    private final static long serialVersionUID = 2L; 
    protected String id; 
    protected String comment; 
    protected String name; 
    protected BaseAnimal subanimal; 
    protected Date undotted; 

    // All getters+setters also exist. 
    public String getAnimalType(){ 
     return subanimal.getClass().getSimpleName(); 
} 

Cat.java:

public class Cat extends BaseAnimal{ 

    private final static long serialVersionUID = 2L; 
    protected Gender gender; 
    protected int age; 
    protected Color color; 
    protected Voice voice; 
    //All getters+setters also exist 
} 

Turtle.java:

public class Turtle extends BaseAnimal{ 

    private final static long serialVersionUID = 2L; 
    protected Gender gender; 
    protected int circlesOnBack; 
    protected int speed; 
    //All getters+setters also exist 
} 

DoAction.java:

public class DoItem extends ActionSupport implements ModelDriven<Animal>{ 
    private static final long serialVersionUID = 2L; 
    protected String idForm; 
    protected Animal animal; 

    @Override 
    public String execute(){ 
     if (idForm != null && !idForm.equals("")){ 
      showAnimal(session); //loads animal from DB 
     } 
     return SUCCESS; 
    } 

    public void saveAnimal(Map<String,Object> session){ 
     // Stuck here, help?   
    } 
    public Animal getModel() { 
     return animal; 
    } 
    public void setModel(Object animal) { 
     this.animal = (Animal) animal; 
    } 
    public String getIdForm() { 
     return idForm; 
    } 
    public void setIdForm(String idForm) { 
     this.idForm = idForm; 
    } 
    public Animal getAnimal() { 
     return animal; 
    } 
    public void setAnimal(Animal animal) { 
     this.animal = animal; 
    } 
} 

animal.jsp:

<%@ taglib prefix="s" uri="/struts-tags" %>  
<html> 
<head></head> 
<body> 

<s:form method="post" theme="simple"> 
<table> 
<tr> 
    <td><s:textfield key="name"/></td> 
    <td><s:textarea key="comment"/></td> 

    <td class='show4cat show4Turtle'> 
    <s:select key="animal.subanimal.gender" list='getMap("Gender")'/> 
    </td> 
    <td class='show4cat'> 
    <s:select key="animal.subanimal.color" list='getMap("Color")'/> 
    </td> 

    <td class='show4turtle'> 
    <s:select key="animal.subanimal.speed" list='%{#{'1':'Fast','2':'Ultra Fast'}}'/> 
    </td> 
</tr> 
<tr> 
    <td class='show4turtle'> 
    <s:submit action='saveTurtle' name='submitAnimal' value='save'/> 
    </td> 
    <td class='show4cat'> 
    <s:submit action='saveCat' name='submitAnimal' value='save'/> 
    </td> 
</tr> 
</table> 
</s:form> 
</body> 
</html> 

теперь я хочу представить эту форму и сохранить животных в БД. Как мне управлять этим действием? Моя главная задача - создать объект соответствующего дочернего класса.

ПРИМЕЧАНИЕ: Я не могу изменить дизайн модели данных! но может изменить JSP или классы действий.

Заранее благодарен!

ответ

1

Ваши две кнопки <s:submit/> предназначены для двух разных действий (которые вы не показываете нам).

Это переключатель в вашем случае.

Задайте два действия, одно с данными Черепаха, другое с данными Кота и выполните правильную операцию в методе execute() каждого действия. Так как пользователь выбрал правильную кнопку, действие называется «знает, какое животное нужно сохранить».

Эти действия могут быть как двумя разными способами одного и того же файла физического действия, так и двумя различными файлами действий, это зависит от вас, и это также зависит от того, сколько «общего» кода у вас есть в действии, которое должно быть выполненных для обоих действий. Но в первом случае это означало бы много неиспользуемых данных в одном файле (например, с 100 животными, всеми атрибутами 100 животных в одном действии, но только один, который использовался при сохранении), поэтому я пошел бы со вторым способом.

Вы можете создать три отдельные действия, один для показа страницы перед тем и после спасительного животного (например, ReadAnimal.java) и два действий для сохранения (например, SaveTurtle.java и SaveCat.java), и в конечном итоге решений последние два простираются на первый. Read more on this answer.

Заключительные мысли:

  • SessionAware is the right way to get the Session в классе действий. И это должно быть на уровне класса, нет необходимости передавать его между методами действия.
  • Не используйте ModelDriven, так как это может быть грязно, когда вы точно не знаете, что делать.
+0

Спасибо за идеи, за которыми следуют эти 2 вопроса: Имея 2 java-файла для каждого животного, суммирует до написания около 50 классов Java-классов (BaseAnimal наследуется 20 + классами). Я стремился сделать это как можно более общим. Какие-либо предложения? Кроме того, что вы предлагаете вместо ModelDriven? Пока мне кажется, что это лучше всего подходит для этого случая. – Slava

+0

1) Это зависит от вас. 50 файлов каждый с 5 атрибутами или 1 файл с 250 атрибутами и 50 методов. Первый кажется более чистым :) особенно когда вам нужно вернуться и добавить/изменить/удалить что-то. 2) Вместо использования ModelDriven используйте простые действия. Примечание: вы даже не используете modeldriven в своем JSP ... просто удалите 'implements ModelDriven ' из вашего действия, и он будет работать одинаково;) P.S: пожалуйста, помните, чтобы поддержать и/или принять ответ, если он помог –

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