2015-09-04 65 views
0

我有一個類Task。這是bean:在JSP中鑄造抽象類

public class Task { 

    @Autowired private User user; 
    @Autowired private Machine machine; 

    private String status; 

    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    public Machine getMachine() { 
     return machine; 
    } 

    public void setMachine(Machine machine) { 
     this.machine = machine; 
    } 

    public String getStatus() { 
     return status; 
    } 

    public void setStatus(String status) { 
     this.status = status; 
    } 

Machine是三個子類的抽象類:CarTruckMotorcycle

然後在我的控制,我結合Task到JSP:

@RequestMapping(value="/create", method = RequestMethod.POST) 
    public String submitForm(@ModelAttribute("task")Task task, 
       BindingResult result, ModelMap model) { 

     System.out.println(task.toString()); 

     return "home"; 
    } 

我的問題:

爲了使新Task我需要知道正在使用哪種類型的Machine。在表格上有一個菜單,用戶決定它是哪種類型的Machine。有沒有辦法在JSP裏面輸入Machine來說,Truck並填寫數據?

或者,我可以綁定多個類到窗體?所以我綁定Task,Truck,Car,Motorcycle,並填寫它們全部(留下未選中的Machine爲空)?然後在post方法中處理該鑄造?

或者我是否真的錯過了這種錯誤的方式,需要重組我如何做事?如果我不能計算抽象類,那麼我只是將Car,Truck,Motorcycle添加到Task bean中,並且一起廢除抽象類。

回答

0

我真的會做一個適合窗體屬性的形式支持對象。因此,我個人認爲,至少在綁定層中,我會遠離抽象類。

這就是說,您可以通過自定義InitBinder來達到您想要的效果。您可以根據請求參數解析具體類型,例如type,這裏是一個例子

@InitBinder 
public void initBinder(WebDataBinder binder, HttpServletRequest request) { 
    String machineType = request.getParam("type"); 

    PropertyEditor machineEditor; 
    if("car".equalsIgnoreCase(machineType)) { 
     machineEditor = new Car(); 
    } else if("truck".equalsIgnoreCase(machineType)) 
     machineEditor = new Truck(); 
    } else { 
     machineEditor - new Motorcycle(); 
    } 
    binder.registerCustomEditor(Machine.class, machineEditor); 
}