2015-09-04 83 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); 
}