原文: http://zetcode.com/vaadin/grid/

在 Vaadin Grid教程中,我们学习了 Vaadin Grid组件的基础知识。 Vaadin 网格示例显示网格中来自 MySQL 数据库的数据。

Vaadin 框架

Vaadin 是一种流行的 Java Web 开发框架,用于构建单页 Web 应用。

Vaadin Grid

Grid组件用于显示和编辑以行和列排列的表格数据。

Vaadin Grid示例

以下示例演示了 Vaadin Grid组件的用法。 我们从 MySQL 数据库加载数据并将其显示在Grid组件中。

NetBeans IDE 可用于轻松创建 Vaadin Web 应用。 我们需要安装 NetBeans Vaadin 插件,然后创建一个新的 Vaadin Web 应用项目。

  1. <dependency>
  2. <groupId>mysql</groupId>
  3. <artifactId>mysql-connector-java</artifactId>
  4. <version>5.1.42</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework</groupId>
  8. <artifactId>spring-jdbc</artifactId>
  9. <version>4.3.9.RELEASE</version>
  10. </dependency>

我们向 POM 文件添加了两个依赖关系:MySQL 驱动程序和JdbcTemplate库。 JdbcTemplate简化了 Java 中的数据库编程。

cars_mysql.java

  1. -- SQL for the Cars table
  2. CREATE TABLE Cars(Id BIGINT PRIMARY KEY AUTO_INCREMENT,
  3. Name VARCHAR(150), Price INTEGER);
  4. INSERT INTO Cars(Name, Price) VALUES('Audi', 52642);
  5. INSERT INTO Cars(Name, Price) VALUES('Mercedes', 57127);
  6. INSERT INTO Cars(Name, Price) VALUES('Skoda', 9000);
  7. INSERT INTO Cars(Name, Price) VALUES('Volvo', 29000);
  8. INSERT INTO Cars(Name, Price) VALUES('Bentley', 350000);
  9. INSERT INTO Cars(Name, Price) VALUES('Citroen', 21000);
  10. INSERT INTO Cars(Name, Price) VALUES('Hummer', 41400);
  11. INSERT INTO Cars(Name, Price) VALUES('Volkswagen', 21600);

这是 MySQL 数据库表的数据。

MyUI.java

  1. package com.zetcode.main;
  2. import javax.servlet.annotation.WebServlet;
  3. import com.vaadin.annotations.Theme;
  4. import com.vaadin.annotations.VaadinServletConfiguration;
  5. import com.vaadin.server.VaadinRequest;
  6. import com.vaadin.server.VaadinServlet;
  7. import com.vaadin.ui.Button;
  8. import com.vaadin.ui.Grid;
  9. import com.vaadin.ui.HorizontalLayout;
  10. import com.vaadin.ui.UI;
  11. import com.vaadin.ui.VerticalLayout;
  12. import com.zetcode.bean.Car;
  13. import com.zetcode.service.ReadCars;
  14. import java.util.List;
  15. @Theme("mytheme")
  16. public class MyUI extends UI {
  17. @Override
  18. protected void init(VaadinRequest vaadinRequest) {
  19. VerticalLayout vbox = new VerticalLayout();
  20. HorizontalLayout hbox = new HorizontalLayout();
  21. Grid grid = new Grid();
  22. grid.addColumn("Id", Long.class);
  23. grid.addColumn("Name", String.class);
  24. grid.addColumn("Price", Integer.class);
  25. Button loadButton = new Button("Load data");
  26. loadButton.addClickListener(e -> {
  27. grid.getContainerDataSource().removeAllItems();
  28. List<Car> cars = ReadCars.read();
  29. for (Car car : cars) {
  30. grid.addRow(car.getId(), car.getName(), car.getPrice());
  31. }
  32. });
  33. Button clearButton = new Button("Clear data");
  34. clearButton.addClickListener(e -> {
  35. grid.getContainerDataSource().removeAllItems();
  36. });
  37. vbox.addComponents(grid);
  38. hbox.addComponents(loadButton, clearButton);
  39. hbox.setSpacing(true);
  40. vbox.addComponent(hbox);
  41. vbox.setMargin(true);
  42. vbox.setSpacing(true);
  43. setContent(vbox);
  44. }
  45. @WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
  46. @VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
  47. public static class MyUIServlet extends VaadinServlet {
  48. }
  49. }

这是MyUI类。 它是应用的入口点。 我们有一个Grid组件和两个按钮。 一个按钮从数据库中加载数据并将其插入Grid,另一按钮从Grid中删除数据。

  1. VerticalLayout vbox = new VerticalLayout();
  2. HorizontalLayout hbox = new HorizontalLayout();

要创建布局,我们使用HorizontalLayoutVerticalLayout

  1. Grid grid = new Grid();

Grid组件已创建。

  1. grid.addColumn("Id", Long.class);
  2. grid.addColumn("Name", String.class);
  3. grid.addColumn("Price", Integer.class);

使用addColumn()方法,我们向Grid添加新列。 方法的第二个参数是列的日期类型。

  1. Button loadButton = new Button("Load data");
  2. loadButton.addClickListener(e -> {
  3. grid.getContainerDataSource().removeAllItems();
  4. List<Car> cars = ReadCars.read();
  5. for (Car car : cars) {
  6. grid.addRow(car.getId(), car.getName(), car.getPrice());
  7. }
  8. });

加载按钮从数据库加载数据并将其插入Grid。 数据库工作委托给ReadCars.read()方法。 使用addRow()方法将新行添加到网格中。

  1. Button clearButton = new Button("Clear data");
  2. clearButton.addClickListener(e -> {
  3. grid.getContainerDataSource().removeAllItems();
  4. });

清除按钮将从Grid中删除所有数据。 removeAllItems()方法可以完成这项工作。

  1. vbox.addComponents(grid);
  2. hbox.addComponents(loadButton, clearButton);

组件将添加到布局管理器。

Car.java

  1. package com.zetcode.bean;
  2. public class Car {
  3. private Long id;
  4. private String name;
  5. private int price;
  6. public Long getId() {
  7. return id;
  8. }
  9. public void setId(Long id) {
  10. this.id = id;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public int getPrice() {
  19. return price;
  20. }
  21. public void setPrice(int price) {
  22. this.price = price;
  23. }
  24. }

这是Car bean; 它包含idnameprice属性。

ReadCars.java

  1. package com.zetcode.service;
  2. import com.zetcode.bean.Car;
  3. import java.sql.SQLException;
  4. import java.util.List;
  5. import java.util.logging.Level;
  6. import java.util.logging.Logger;
  7. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  8. import org.springframework.jdbc.core.JdbcTemplate;
  9. import org.springframework.jdbc.datasource.SimpleDriverDataSource;
  10. public class ReadCars {
  11. public static List<Car> read() {
  12. String url = "jdbc:mysql://localhost:3306/testdb?useSSL=true";
  13. SimpleDriverDataSource ds = new SimpleDriverDataSource();
  14. try {
  15. ds.setDriver(new com.mysql.jdbc.Driver());
  16. } catch (SQLException ex) {
  17. Logger.getLogger(ReadCars.class.getName()).log(Level.SEVERE, null, ex);
  18. }
  19. ds.setUsername("testuser");
  20. ds.setPassword("test623");
  21. ds.setUrl(url);
  22. String sql = "SELECT * FROM Cars";
  23. JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);
  24. List<Car> cars = jdbcTemplate.query(sql, new BeanPropertyRowMapper(Car.class));
  25. return cars;
  26. }
  27. }

ReadCars包含连接到 MySQL 数据库并从Cars表中检索所有汽车的代码。 我们使用 Spring 的JdbcTemplate来完成这项工作。

  1. String url = "jdbc:mysql://localhost:3306/testdb?useSSL=true";

这是 MySQL 数据库的连接 URL。 数据库名称为testdb

  1. String sql = "SELECT * FROM Cars";

该 SQL 语句从Cars表中选择所有行。

  1. JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);
  2. List<Car> cars = jdbcTemplate.query(sql, new BeanPropertyRowMapper(Car.class));

BeanPropertyRowMapper的帮助下,该工具自动将结果集列映射到Car类的属性,我们从Cars表中检索所有行并将其映射到Car对象的列表。

  1. return cars;

汽车列表将返回给调用者。

Vaadin `Grid`教程 - 图1

图:Vaadin Grid

在本教程中,我们学习了 Vaadin Grid组件的基础知识。 您可能也对相关教程感兴趣: Vaadin TextArea教程Vaadin ComboBox教程Vaadin Slider教程Vaadin CheckBox教程Java 教程