在本教程中,我们使用 Stripes,MyBatis 和 Derby 创建一个 Java Web 应用。 我们使用 NetBeans 来构建应用。 Apache Tomcat 用作 JSP 和 servlet 容器。 可从作者的 Github 存储库中获得项目源。
Stripes 是一个开源的轻量级 Java Web 应用框架。 Stripes 的目标是使 Java 中基于 Servlet / JSP 的 Web 开发变得简单,直观和直接。 Stripes 是基于动作的 MVC(模型视图控制器)框架。 它运行在 JEE Web 容器中,使用最少的配置文件,并具有灵活和简单的参数绑定。
MyBatis 是 Java 持久性框架,使用 XML 描述符或注释将对象与存储过程或 SQL 语句耦合。 与 ORM 框架不同,MyBatis 不会将 Java 对象映射到数据库表,而是将 Java 方法映射到 SQL 语句。 MyBatis 允许使用所有数据库功能,例如存储过程,视图,任何复杂性和供应商专有功能的查询。
Derby 是用 Java 编写的关系数据库管理系统。 Oracle 以 Java DB 的名义分发相同的二进制文件。 Derby 的占用空间很小,约为 2MB。 Derby 使用的数据库格式是可移植的且与平台无关。
图书应用
我们在 NetBeans 中创建一个新的 Web 应用。 在应用中,我们将能够将新书添加到数据库中,通过它们的 ID 选择单个书,然后选择表中的所有书。 该项目需要 Stripes,MyBatis 和 JSTL 库。 前三个 JAR 是 MyBatis 库,后三个是 Stripes 的库。 我们必须从他们的项目页面中删除他们。 JSTL JAR 随 NebBeans 一起提供。
Figure: Project libraries
在“ NetBeans 服务”选项卡中,我们展开“数据库”节点,然后右键单击 Java DB 节点,然后选择“创建数据库”选项。 数据库名称将为books
,用户名和密码为app
和app
。
books.sql
我们创建一个与创建的数据库的新数据库连接,并执行此 SQL 代码。 我们有一个Books
表,其中包含几本书。
web.xml
在web.xml
部署描述符中,我们设置了 Stripes 框架。 index.jsp
文件是默认的主页文件。 在com.zetcode.action
中,有ActionBeans
。
resources
在resources
目录中,我们有三个文件。 通过右键单击项目文件并选择“属性”来创建resources
目录。 在源类别中,我们添加一个新的源包文件夹。
Figure: Resources
BookMapper.xml
和mybatis-config.xml
是 MyBatis 使用的 XML 文件。 StripesResources.properties
是 Stripes 框架的默认资源束文件。 它包含应用的错误消息和标签。 它位于 Stripes 下载文件的lib
子目录中。
表示层
表示层由六个 JSP 页面组成。 index.jsp
是应用的默认主页。 addBook.jsp
是用于向数据库添加新书的页面,findBook.jsp
是用于通过其 ID 查找书的页面。 将书籍成功插入数据库后,bookAdded.jsp
显示一条消息,showOneBook.jsp
显示选定的书籍,showAllBooks.jsp
显示数据库中的所有书籍。
index.jsp
index.jsp
包含指向两个 JSP 页面的 Stripes 链接,以添加一本新书并查找一本书,以及一个指向ActionBean
的链接以显示所有书。 <%@taglib prefix="stripes" uri="http://stripes.sourceforge.net/stripes.tld"%>
声明 Stripes 使用的标签,包括<stripes:link>
。
findBook.jsp
在findBook.jsp
中,我们有一个表格,可通过其 ID 查找图书。 该表单包含一个文本字段和一个 Submit 按钮。 插入值已验证; 如果用户添加了无效值,则应用将返回错误消息。
addBook.jsp
addBook.jsp
将一本新书添加到数据库中。 它包含一个带有四个文本字段的表单,用于书籍对象。 该 ID 由 Derby 数据库自动生成。
bookAdded.jsp
将新书添加到数据库后,应用返回bookAdded.jsp
,其中包含一条简单消息。
showAllBooks.jsp
showAllBooks.jsp
显示从数据库检索到的所有书籍。 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
指令声明了 JSTL 核心标记,包括<c:forEach>
和<c:out>
。 可以使用${actionBean}
表达式访问返回的数据,其中actionBean
是转发视图(即此 JSP 页面)的操作 bean。 在这种情况下,操作 bean 是SelectAllBooksActionBean
。
showOneBook.jsp
showOneBook.jsp
显示一本书,我们通过其 ID 找到了它。
Book
bean
Book
bean 是一个 Java 类,代表我们应用的域对象-一本书。
Book.java
Bean 具有必要的属性以及 getter 和 setter 方法。 请注意,还必须添加一个空的构造函数。
ActionBean
Stripes 的ActionBean
是一个对象,该对象接收在请求中提交的数据并处理用户的输入。 它既定义了表单的属性,又定义了表单的处理逻辑。 最后,它向用户返回一个视图。 在我们的应用中,我们有三个动作 bean:AddBookActionBean
,SelectAllBooksActionBean
和SelectOneBookActionBean
。 它们每个代表在应用中要执行的某些操作。
Figure: Action beans
我们将动作 bean 放入com.zetcode.action
包中。
AddBookActionBean.java
在我们填写表格以添加新书后,将调用AddBookActionBean
。 动作 Bean 自动将请求属性绑定到其自己的属性。
书籍成功保存到数据库后,AddBookActionBean
返回bookAdded.jsp
页面。
使用@Validate
注解,我们为 HTML 字段提供了验证服务。 这些字段不能为空,并且必须与正确的数据类型匹配。
Figure: Validation
如果发布年份具有非整数字符,则“提交”操作将失败。
@DefaultHandler
注释指定此操作 bean 的默认处理程序方法。 (可以定义多个处理程序。)处理程序创建Book
bean,调用BookService.saveBook()
并转发到适当的视图。
SelectOneBookActionBean.java
单击findBook.jsp
中的 Submit 按钮后,将调用SelectOneBookActionBean
。
默认处理程序调用BookService.getBook()
方法,然后转发到视图。
SelectAllBooksActionBean.java
SelectAllBooksActionBean
负责从数据库中选择所有书籍。
调用BookService.getAllBooks()
完成该工作。
服务
BookService
包含与数据库通信的方法。
BookService.java
DAO 模式用于使示例更易于移植。
getAllBooks()
方法创建MyBatisDAO
并调用其findAll()
方法。 它返回检索到的书的列表。
DAO
数据访问对象(DAO) 模式用于将底层数据访问 API 或操作与高层业务服务分开。
BookDAO.java
访问数据的方法在BookDAO
界面中定义。 当我们根据该接口进行编程时,代码的耦合较少。
MyBatisDAO.java
MyBatisDAO
是BookDAO
接口的具体实现。 如果基础数据源发生更改,我们可以轻松地切换到新的 DAO 实现。
saveBook()
方法将一本新书保存到数据库中。 创建一个SqlSessionFactory
来产生一个SqlSession
,这是使用 MyBatis 的主要 Java 接口。 工厂的创建委托给ServiceLocator
。 会话的insert()
方法使用给定的参数对象执行插入语句。 commit()
方法将更改提交到数据库。
为了选择一本书,我们将id
参数传递给会话的selectOne()
方法。
selectList()
方法返回书籍对象列表。
ServiceLocator.java
ServiceLocator
从提供的配置文件中构建SqlSessionFactory
。 该工厂随后用于生产SqlSession
,这是与 MyBatis 进行通信的主要接口。
mybatis-config.xml
在mybatis-config.xml
文件中,我们创建一本新书Book
类型,定义 Derby 的数据源,并指定映射器文件。
BookMapper.xml
在BookMapper.xml
中,我们有应用中使用的 SQL 命令。 它具有两个选择和一个插入命令。
注意,对于结果类型,我们不定义集合,而是定义集合项的类型。
Figure: Displaying all books
屏幕截图显示了从示例数据库中选择的所有书籍。
在本教程中,我们使用 Stripes,MyBatis 和 Derby 创建了一个 Web 应用。 我们使用了三层 DAO 软件模式。 NetBeans 用于构建应用。