1

我的应用程序基本上是一本字典。当我单击“提交”时,一个新的 Word 对象将与其几个字段一起保存到数据库中。其中一个字段称为类别,它显示 Word 属于哪个组。当前,此值是 Word 对象的字符串字段。

这是 jsp.file 的简化代码

    <form:form method="post" action="addNewWord.html" commandName="word" >

    <table>


    //many other fields;    


        <tr>
            <td>Category:</td>
            <td><form:select path="category" items="${CATEGORIES}"
                    var="cat">
                </form:select></td>
            <td><form:errors path="category" cssClass="error" /></td>
        </tr>


        <tr>
            <td colspan="2"><input type="submit" value="Add new word" /></td>
        </tr>
    </table>

</form:form>

这是 Word 对象。

@Entity
@Table(name = "word")
public class Word {

    //other instance variables either primitives or Strings;

    @Column(name = "category", nullable = false, length = 80)
    private String  category;
        //getters-setters 

在这种情况下,一切都很好并且运行良好,并且 Word 对象被保存到数据库中。但是,如果我决定创建一个独立的 Category 对象并且 Word 对象中的 category 字段不是 String 而是 Category 的一个实例,该怎么办?

    @ManyToOne
@JoinColumn(name = "category_id")
private Category category;

我应该如何修改 .jsp 文件上的表单以提交具有不是字符串而是类别的字段的词对象?就整体而言,让我展示一下提交调用的控制器中的方法:

@RequestMapping(value = "/addNewWord", method = RequestMethod.POST)
public String addNewWord(@ModelAttribute Word word, BindingResult result, Model model) {
    WordValidator validator = new WordValidator();
    validator.validateWord(word, result, wordService.getAllWord(), categoryService.getAllCategories());
    if (!result.hasErrors()) {
        wordService.save(word);
        word.clearValues();
    }
    fillCategoryNames(model);
    return "addNew";
}

我有一种感觉,我应该使用@InitBinder 方法,但我不知道如何使用,这更像是一种感觉,而不是坚如磐石的事实。欢迎任何建议。

4

1 回答 1

2

干得好 :

public class CategoryEditor extends PropertyEditorSupport {

    // Converts a String to a Category (when submitting form)
    @Override
    public void setAsText(String text) {
        Category c = new Category();
        c.setName(text);
        this.setValue(c);
    }

    // Converts a Category to a String (when displaying form)
    @Override
    public String getAsText() {
        Category c = (Category) this.getValue();
        return c.getName();
    }

}

...
public class MyController {

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

    ...

}

更多信息:

于 2012-09-15T17:28:47.810 回答