form:select不设置所选值

时间:2016-03-31 10:11:33

标签: spring forms hibernate model-view-controller

基本上我需要一个CRUD申请付款。每笔付款都分配到一个帐户。

我的jsp页面显示"帐户"的正确列表对象,但它不设置所选帐户。

  1. 问题:如何预先选择已分配帐户的下拉框?

  2. 问题:分配(付款帐户)有效,但只能使用我的PaymentDaoImpl.java中的以下代码(标记为变通方法)。为什么会这样呢?

  3. PaymentDaoImpl.java

    ..
    @Override
    @Transactional
    public int insertRow(Payment obj) {
        // Session session = HibernateUtil.getSessionFactory().openSession();
        Session session = sessionFactory.openSession();
    
        // !!!! workaround?? If I don't do this, account won't be assigned
        int accountId = obj.getAccount().getId();   
        Account account = (Account) session.get(Account.class, accountId);
        obj.setAccount(account);
    
        Transaction tx = session.beginTransaction();
        session.saveOrUpdate(obj);
        tx.commit();
        Serializable id = session.getIdentifier(obj);
        session.close();
        return (Integer) id;
    }
    ..
    

    JSP:

    <form:select path="account.id"   >
        <form:option  value="-1" label="Select Account" />         
        <form:options items="${accountList}" itemValue="id" itemLabel="iban" />
    </form:select>
    

    Domain Account.java:

    package com.beingjavaguys.domain;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Set;
    
    import javax.persistence.Entity;  
    import javax.persistence.GeneratedValue;  
    import javax.persistence.GenerationType;  
    import javax.persistence.Id;
    import javax.persistence.*;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    
    @Entity
    public class Account {
    
        @Id
        @GeneratedValue
        private int id;
    
        private String iban;
    
        private String bank;
    
        private String beschreibung;
    
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getIban() {
            return iban;
        }
    
        public void setIban(String iban) {
            this.iban = iban;
        }
    
        public String getBank() {
            return bank;
        }
    
        public void setBank(String bank) {
            this.bank = bank;
        }
    
        public String getBeschreibung() {
            return beschreibung;
        }
    
        public void setBeschreibung(String beschreibung) {
            this.beschreibung = beschreibung;
        }
    
    }
    

    域名付款

    package com.beingjavaguys.domain;
    import javax.persistence.CascadeType;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    
    
    @Entity
    public class Payment {
    
    
        private int id;
    
    
        private Account account;
    
        private float amount;
    
        private String text;
    
        private String comment;
    
        @Id
        @GeneratedValue
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
    
        @ManyToOne(cascade = CascadeType.ALL, targetEntity = Account.class, fetch=FetchType.EAGER)
        @JoinColumn(name="fk_account")
        public Account getAccount() {
            return account;
        }
    
        public void setAccount(Account account) {
            this.account = account;
        }
    
        public float getAmount() {
            return amount;
        }
    
        public void setAmount(float amount) {
            this.amount = amount;
        }
    
        public String getText() {
            return text;
        }
    
        public void setText(String text) {
            this.text = text;
        }
    
        public String getComment() {
            return comment;
        }
    
        public void setComment(String comment) {
            this.comment = comment;
        }
    
    
    }
    

    PaymentController.java

    package com.beingjavaguys.controller;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.servlet.ModelAndView;
    
    import com.beingjavaguys.domain.Payment;
    import com.beingjavaguys.services.AccountService;
    import com.beingjavaguys.services.PaymentService;
    
    @Controller
    @RequestMapping("/payment")
    public class PaymentController {
    
        @Autowired
        PaymentService dataService;
        @Autowired
        AccountService accountService;
    
        @RequestMapping("form")
        public ModelAndView getForm(@ModelAttribute Payment obj) {
            ModelAndView mav = new ModelAndView("payment/form");
            mav.addObject("accountList", accountService.getList());
            return mav;
        }
    
        @RequestMapping("insert")   
        public ModelAndView insert(@ModelAttribute Payment obj) {       
            dataService.insertRow(obj);
            return new ModelAndView("redirect:list");
        }
    
        @RequestMapping("list")
        public ModelAndView getList() {
            List objList = dataService.getList();
            return new ModelAndView("payment/list","objList",objList);
        }
    
        @RequestMapping("delete")
        public ModelAndView deleteUser(@RequestParam int id) {
            dataService.deleteRow(id);
            return new ModelAndView("redirect:list");
        }
    
        @RequestMapping("edit")
        public ModelAndView editUser(@RequestParam int id,@ModelAttribute Payment obj) {
            ModelAndView mav = new ModelAndView("payment/form");
    
            Payment paymentObj = dataService.getRowById(id);
            mav.addObject("accountList", accountService.getList());
            mav.addObject("paymentObj", paymentObj);
    
            return mav;
        }
    
        @RequestMapping("update")
        public ModelAndView updateUser(@ModelAttribute Payment obj) {
            dataService.updateRow(obj);
            return new ModelAndView("redirect:list");
        }
    
    }
    

    您能看一下我对AccountEditor的实现吗?我需要AccountService来查找帐户吗?但是,我没有在这里实例化服务..

    public class AccountEditor extends PropertyEditorSupport {
        @Autowired
        AccountService dataService; // == null ??
    
        @Override
        public void setAsText(String text) {
            Account account = lookupAccount(text); // lookup account by accountId
                                                    // text
            setValue(account);
        }
    
        private Account lookupAccount(String text) {
            int id = Integer.parseInt(text);
            return dataService.getRowById(id);
        }
    }
    

1 个答案:

答案 0 :(得分:0)

您需要的是一个PropertyEditor实现,用于将String accountId转换为Account对象。然后在你的jsp中你使用路径形式:select path =“account”而不是form:select path =“account.id”

按如下方式实施PropertyEditor

public class AccountEditor extends PropertyEditorSupport{

   @Override 
   public void setAsText(String text){
      Account account = lookupAccount(text); //lookup account by accountId text
      setValue(account);
  }
}

然后在您的控制器中注册您的AccountEditor

@InitBinder
 public void initBinder(WebDataBinder binder){
   binder.registerCustomEditor(Account.class , new AccountEditor());
 }

通过以上更改,您将不需要您的解决方法。您的解决方案只是设置帐户的id属性而不是整个对象