Я пытаюсь создать веб-интерфейс для нашей БД, используя 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 или классы действий.
Заранее благодарен!
Спасибо за идеи, за которыми следуют эти 2 вопроса: Имея 2 java-файла для каждого животного, суммирует до написания около 50 классов Java-классов (BaseAnimal наследуется 20 + классами). Я стремился сделать это как можно более общим. Какие-либо предложения? Кроме того, что вы предлагаете вместо ModelDriven? Пока мне кажется, что это лучше всего подходит для этого случая. – Slava
1) Это зависит от вас. 50 файлов каждый с 5 атрибутами или 1 файл с 250 атрибутами и 50 методов. Первый кажется более чистым :) особенно когда вам нужно вернуться и добавить/изменить/удалить что-то. 2) Вместо использования ModelDriven используйте простые действия. Примечание: вы даже не используете modeldriven в своем JSP ... просто удалите 'implements ModelDriven' из вашего действия, и он будет работать одинаково;) P.S: пожалуйста, помните, чтобы поддержать и/или принять ответ, если он помог –