原文:http://zetcode.com/java/sqlquerytag/
在本教程中,我们将学习如何使用 JSTL 的 SQL 查询标记。
JSTL
JavaServer Pages 标准标记库(JSTL) 是有用的 JSP 标记的集合,这些标记提供了许多 JSP 文件所共有的核心功能。 <sql:query>标记执行 SQL SELECT语句,并将结果保存在范围变量中。
通常,不建议从 JSP 页面访问数据库。 但是,对于简单的应用和测试,它可能会很有用。 在我们的应用中,我们将使用 JSTL 的 SQL 查询标记从 MySQL 数据库检索数据。 该项目是使用 Maven 构建的。 我们将应用部署在 Tomcat 上。
创建一个 MySQL 数据库
首先,我们在 MySQL 中创建testdb数据库和Cars表。
cars_mysql.sql
DROP TABLE IF EXISTS Cars;CREATE TABLE Cars(Id INT PRIMARY KEY AUTO_INCREMENT,Name TEXT, Price INT) ENGINE=InnoDB;INSERT INTO Cars(Name, Price) VALUES('Audi', 52642);INSERT INTO Cars(Name, Price) VALUES('Mercedes', 57127);INSERT INTO Cars(Name, Price) VALUES('Skoda', 9000);INSERT INTO Cars(Name, Price) VALUES('Volvo', 29000);INSERT INTO Cars(Name, Price) VALUES('Bentley', 350000);INSERT INTO Cars(Name, Price) VALUES('Citroen', 21000);INSERT INTO Cars(Name, Price) VALUES('Hummer', 41400);INSERT INTO Cars(Name, Price) VALUES('Volkswagen', 21600);
这是在 MySQL 中创建Cars表的 SQL。
要创建数据库和表,我们使用mysql监视工具。
$ sudo service mysql start
MySQL 用sudo service mysql start命令启动。
$ mysql -u testuser -p
我们使用mysql监视器连接到数据库。
mysql> CREATE DATABASE testdb;Query OK, 1 row affected (0.02 sec)
CREATE DATABASE语句创建一个名为testdb的新数据库。
mysql> USE testdb;mysql> SOURCE cars_mysql.sql
使用source命令,加载并执行cars_mysql.sql文件。
mysql> SELECT * FROM Cars;+----+------------+--------+| Id | Name | Price |+----+------------+--------+| 1 | Audi | 52642 || 2 | Mercedes | 57127 || 3 | Skoda | 9000 || 4 | Volvo | 29000 || 5 | Bentley | 350000 || 6 | Citroen | 21000 || 7 | Hummer | 41400 || 8 | Volkswagen | 21600 |+----+------------+--------+8 rows in set (0.00 sec)
我们验证数据。 请参阅 MySQL 教程,以了解有关 MySQL 的更多信息。
使用 Maven 启动项目
Apache Maven 是一个软件项目管理和理解工具。
$ mvn archetype:generate -DgroupId=com.zetcode -DartifactId=SqlQueryTag-DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
使用maven-archetype-webapp,我们创建了 Web 应用的框架。
$ cd SqlQueryTag/$ tree.├── pom.xml└── src└── main├── resources└── webapp├── index.jsp└── WEB-INF└── web.xml5 directories, 3 files
Maven 创建了这个项目结构。
$ mkdir src/main/webapp/META-INF$ touch src/main/webapp/META-INF/context.xml
我们创建一个META-INF目录和context.xml文件。
应用
应用连接到先前创建的Cars表,并检索其所有行。 要连接到数据库表,我们使用<sql:query>标签。
Maven 项目对象模型(POM)文件是保存在名为pom.xml的文件中的 Maven 项目的 XML 表示。
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zetcode</groupId><artifactId>SqlQueryTag</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>SqlQueryTag Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.39</version></dependency></dependencies><build><finalName>SqlQueryTag</finalName></build></project>
在pom.xml文件中,我们声明 MySQL 驱动程序和 JSTL 库的依赖关系。
context.xml
<?xml version="1.0" encoding="UTF-8"?><Context path="/SqlQueryTag" ><Resource name="jdbc/testdb"auth="Container"type="javax.sql.DataSource"username="testuser"password="test623"driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/testdb"maxActive="10"maxIdle="4"/></Context>
context.xml文件是 Web 应用的 Tomcat 配置文件。 在context.xml文件中,我们定义了一个数据源。 请参阅 Java 教程中的数据源以了解有关数据源的更多信息。
web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><session-config><session-timeout>30</session-timeout></session-config></web-app>
我们提供了一个标准的部署描述符。 请注意,Maven 可能会创建与您的 JSTL JAR 不兼容的部署描述符。
index.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><%@page contentType="text/html" pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Cars</title></head><sql:query var="carsList" dataSource="jdbc/testdb">SELECT * FROM Cars</sql:query><body><div align="center"><table border="1" cellpadding="2"><h2>List of cars</h2><tr><th>Id</th><th>Name</th><th>Price</th></tr><c:forEach var="car" items="${carsList.rows}"><tr><td><c:out value="${car.Id}" /></td><td><c:out value="${car.Name}" /></td><td><c:out value="${car.Price}" /></td></tr></c:forEach></table></div></body></html>
在index.jsp文件中,我们连接到数据库,从Cars表中检索数据,并将其显示在 HTML 表中。
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
我们需要声明 JSTL 核心和 sql 模块。
<sql:query var="carsList" dataSource="jdbc/testdb">SELECT * FROM Cars</sql:query>
使用<sql:query>标记,执行SELECT * FROM Cars语句。 数据存储在carsList变量中。 数据源由dataSource参数指定。
<c:forEach var="car" items="${carsList.rows}"><tr><td><c:out value="${car.Id}" /></td><td><c:out value="${car.Name}" /></td><td><c:out value="${car.Price}" /></td></tr></c:forEach>
<c:forEach>变量通过carsList变量,<c:out>输出当前值。
构建和部署
现在,我们将构建和部署该应用。
$ mvn package
我们建立项目。
$ mysql start/running, process 6030$ $TOMCAT_HOME/bin/startup.sh
我们启动 MySQL 和 Tomcat。
$ cp target/SqlQueryTag.war $TOMCAT_HOME/webapps
我们部署应用。

图:展示汽车
我们在浏览器中导航到该应用,然后从数据库中获取数据。
这是 SQL 查询标记教程。 我们已经使用 JSTL,JSP,MySQL,Tomcat 和 Maven 构建了一个 Web 应用。 您可能还需要检查 JSTL forEach 标签,验证过滤器教程, JDBI 教程, MySQL 教程或 Apache Derby 教程。
