使用列表和复选框的 Spring MVC 数据绑定

2023-12-01

我知道已经有人提出过关于此事的问题,但我找到的答案都没有解决我的问题。

我的数据库中有多对多关系。我正在使用 JPA 和 Hibernate 来创建和更改我的表。这是我的模型类:

书本.java

@Entity
@Table(name="tb_books")
public class Book implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false, insertable = false)
    private Integer id;

    @Column(name = "title", nullable = false, length = 255)
    private String title;

    @Column(name = "author", nullable = false, length = 255)
    private String author;

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER)
    @JoinTable(name = "book_tag",
               joinColumns = { @JoinColumn(name = "fk_book") },
               inverseJoinColumns = { @JoinColumn(name = "fk_tag") })
    private List<Tag> tags;

    //getters, setters, equals and hash methods...

}

Tag.java

@Entity
@Table(name="tb_tags")
public class Tag implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private Integer id;

    @Column(name = "description", nullable = false, length = 255)
    private String description;

    //getters, setters, equals and hash methods...
}

我正在尝试使用 Spring MVC 来自 JSP 的数据在我的 book_tag 表上进行插入和更新。这是我的控制器和插入页面:

BookController.java

@Controller
@RequestMapping(value = "/book")
public class BookController {

    @Autowired
    private BookService bookService;

    /*
        Controller method that gets us to the adding book page. 
    */    
    @RequestMapping(value = "/add", method = RequestMethod.GET)
    public ModelAndView addBookPage() {

        List<Tag> tags = tagService.getTags(); //all tags from the database

        ModelAndView modelAndView = new ModelAndView("form-book");
        modelAndView.addObject("book", new Book());
        modelAndView.addObject("tags", tags);

        return modelAndView;
    }

    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public ModelAndView addBookProcess(@ModelAttribute Book book) {

        bookService.addBook(book);
        return new ModelAndView("redirect:/book/add");
    }

    //...

}

表单-book.jsp

<form:form method="POST" modelAttribute="book" action="${pageContext.request.contextPath}/book/add.html">
<table>
    <tbody>
        <tr>
            <td>Title:</td>
            <td><form:input path="title" autocomplete="off" /></td>
        </tr>
        <tr>
            <td>Author:</td>
            <td><form:input path="author" autocomplete="off" /></td>
        </tr>
        <tr>
            <td colspan="2">

                <form:checkboxes path="tags" 
                items="${tags}" 
                itemLabel="description"
                itemValue="id"/>

            </td>
        </tr>
        <tr>
            <td><input type="submit" value="Add" /></td>
            <td><input type="button" onclick="location.href = '${pageContext.request.contextPath}/index'" value="Cancel"/></td>
        </tr>
    </tbody>
</table>

</form:form>

一切工作正常,除了当我尝试更新或插入选中一个或多个复选框的书籍时。当我尝试这样做时,我只是得到一个“错误请求”页面,我想是因为我在数据绑定方面做了一些错误。

这是我应该处理这种情况的方式吗?有没有更好的办法?我究竟做错了什么?


显然,来自复选框的列表实际上是一个字符串数组,它无法转换为模型类定义的标签列表。

我通过创建自定义 PropertyEditor 解决了我的问题,它允许我将复选框与标签列表绑定。

public class TagPropertyEditor extends PropertyEditorSupport {

    private TagService tagService;

    public TagPropertyEditor(TagService tagService){
        this.tagService = tagService;
    }

    @Override
    public String getAsText() {
        return ((Tag) getValue()).getId().toString();
    }

    @Override
    public void setAsText(String incomingId) throws IllegalArgumentException {
        Tag tag = tagService.getTag(Integer.valueOf(incomingId));
        setValue(tag);
    }
}

然后在我的 BookController 上注册:

//...
@InitBinder
public void initBinder(WebDataBinder binder){
    binder.registerCustomEditor(Tag.class, new TagPropertyEditor(tagService));
}

这是我的 JSP 上的复选框标记:

 <form:checkboxes path="tags" 
                  items="${tags}"
                  itemLabel="description"
                  itemValue="id"/>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用列表和复选框的 Spring MVC 数据绑定 的相关文章

随机推荐

  • Python/Selenium 隐身/私有模式

    我似乎找不到任何有关如何使 Selenium 以隐身模式打开浏览器的文档 我是否必须在浏览器中设置自定义配置文件 首先 自从selenium默认情况下会启动一个带有干净 全新配置文件的浏览器 您实际上已经在私密浏览了 参考 Python 在
  • 如何使用 python HTMLParser 库从特定 div 标签中提取数据?

    我正在尝试使用 python HTMLParser 库从 HTML 页面中获取值 我想要获取的值位于此 HTML 元素内 div 20 div 到目前为止 这是我的 HTMLParser 类 class LinksParser HTMLPa
  • 如何从网页(不同域)获取html代码?

    如何创建一个 javascript 脚本 允许我从不同域获取不同页面的 html 代码 并允许我编辑和显示代码 提前致谢 看一下使用 jQuery 进行跨域请求 GitHub 仓库
  • 在 Vuforia 中获取纯视图矩阵

    我正在使用 Vuforia SDK 构建我的 AR 应用程序 通过使用 trackableResult gt getPose 我可以获得目标帧标记的模型视图矩阵 但我还需要纯视图矩阵来进行一些计算 有什么办法可以得到吗 继上面的 peede
  • Javascript - 如何从特定 div 类内的标签获取属性值?

    我需要从以下位置检索值的 HTML 代码片段 div class elgg foot div
  • 使用 MySQLi 时在非对象上调用成员函数 real_escape_string()

    我已经尝试了有关此主题的其他问题上发布的所有解决方案 但没有一个有效 如果这是一个基本问题 我很抱歉 但我是 MySQLi 新手 我不明白为什么这个连接不起作用 我的functions php 文件中有一个函数 其中包含 function
  • C 中求整数的长度

    我想知道如何在C中找到整数的长度 例如 1 gt 1 25 gt 2 12512 gt 5 0 gt 1 等等 我怎样才能在C中做到这一点 C 您可以取数字绝对值的以 10 为底的对数 向下舍入 然后加一 这适用于非 0 的正数和负数 并且
  • 超出范围循环(0)

    这是函数 def is sorted L str gt Bool Return True iff the L is sorted in nondecreasing order Otherwise return False gt gt gt
  • 如何使用 PHP 正则表达式向第一个 P 标签添加属性?

    WordPress 以这种格式吐出帖子 h2 Some header p First paragraph of the post p p Second paragraph of the post p etc 为了在第一段中获得很酷的样式 这
  • 数组应该在使用之前声明吗? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 哪种做法更好 代码 A 或 B A array array array value B
  • 表单提交触发器 - 来自 Google 文档表单的脚本结果

    我有一个提交数据的表单 一旦新表单数据附加到电子表格 就需要测试和操作 因此 我希望使用 表单提交 触发器来处理最新条目 新的最后一行 然而 在我深入研究该触发器的脚本之前 我很想知道 表单提交 触发器是否可靠 例如 它会立即触发吗 如果同
  • 将变量存储在Movieclip或Sprite中

    如何将数据添加到动态创建的 MovieClip Sprite 中 以便稍后可以在与该 MovieClip Sprite 协调的事件中访问数据 示例代码 for var i int i lt xml children i var button
  • 按频率对列表进行排序

    Python 有什么方法可以按频率对列表进行排序吗 例如 1 2 3 4 3 3 3 6 7 1 1 9 3 2 上面的列表将按照其值的频率顺序排序 以创建以下列表 其中频率最高的项目放在前面 3 3 3 3 3 1 1 1 2 2 4 6
  • Android 以编程方式获取特定应用程序的数据使用情况,例如:“Facebook”上使用的数据使用情况

    我想按以下方式对数据使用情况进行分类 OS 60 300MB used so far Music 10 50MB used so far Facebook 5 25MB used so far 任何人都可以帮助我解决这个Android编程问
  • 无法从 nib 实例化 UIView。 “警告:无法加载任何 Objective-C 类信息”

    我得到 无法加载任何 Objective C 类信息 这将显着降低可用类型信息的质量 初始化此类的实例时控制台中出现警告 IBDesignable class SystemMessage UIView IBOutlet weak var l
  • 循环运行 .py 文件

    我目前正在尝试运行 py文件但在循环中 只是为了测试我正在使用 I 0 while I lt 10 os pause 10 open home Tyler desktop test py I I 1 我确信这是一个非常简单的问题 但我无法弄
  • Objective C - UITableViewCell 异步加载图像

    我正在显示一张桌子 每行都有一个从 URL 加载的图像图标 由于同步下载图像会阻塞 UI 因此我通过中央调度实现了异步方式 我的问题是 当我向下和向上滚动时 由于单元格被重复使用 因此会显示不正确的图像 我可以猜测为什么会发生这种情况 这是
  • Telerik MVC Grid - 可空 DateTime 属性的问题

    我对 Telerik MVC 扩展相当陌生 我已经在视图中成功实现了我的第一个实例 我没有使用 Telerik MVC 网格实现第二个视图 但是绑定到网格的类有 2 列 其类型为 Nullable 当我运行代码时 视图会输出错误 如下所示
  • 无法在 MVC 3、Visual Studio 2010 中使用 PagedList.Mvc

    我正在使用 Visual Studio 2010 构建 MVC 3 Web 我想要对数据进行分页 因此我使用 PagedList 效果很好 现在 我需要在页面之间创建导航 我使用 PagedList Mvc 为其获取 HtmlHelper
  • 使用列表和复选框的 Spring MVC 数据绑定

    我知道已经有人提出过关于此事的问题 但我找到的答案都没有解决我的问题 我的数据库中有多对多关系 我正在使用 JPA 和 Hibernate 来创建和更改我的表 这是我的模型类 书本 java Entity Table name tb boo