下面的简单例子借鉴了Java EE 5 tutorial中的例子,目的是看一看JPA(Java Persistence
API)在WEB中的开发形式.例子中是在HTML中输入一个书籍ID,通过它来查询书籍的名字显示在页面上。
1.环境配置
1.1 JDK 5.0. 下载: http://java.sun.com/j2se/1.5.0/download.jsp
1.2 Java EE 5.0 App Server: 下载: https://glassfish.dev.java.net/public/downloadsindex.html
并且把install root设为$GLASSFISH_HOME.
启动App Server的命令是:
$GLASSFISH_HOME/bin/asadmin.bat
start-domain
Glassfish App Server捆绑了一个数据库叫Derby,启动的命令是:
$GLASSFISH_HOME/bin/asadmin.bat
start-database
2.编写服务端文件
2.1 在数据库中创建数据
CREATE TABLE WEB_BOOKSTORE_BOOKS
(bookId VARCHAR(8),
surname VARCHAR(24),
firstName VARCHAR(24),
title VARCHAR(96),
price FLOAT,
onSale SMALLINT,
calendar_year INT,
description VARCHAR(30),
inventory INT);
INSERT INTO WEB_BOOKSTORE_BOOKS VALUES('201', 'Duke', '',
'My Early Years: Growing up on *7',
30.75, 0, 1995, 'What a cool book.', 20);
INSERT INTO WEB_BOOKSTORE_BOOKS VALUES('202', 'Jeeves',
'',
'Web Servers for Fun and Profit', 40.75, 1,
2000, 'What a cool book.', 20);
INSERT INTO WEB_BOOKSTORE_BOOKS VALUES('203', 'Masterson',
'Webster',
'Web Components for Web Developers',
27.75, 0, 2000, 'What a cool book.', 20);
INSERT INTO WEB_BOOKSTORE_BOOKS VALUES('205', 'Novation',
'Kevin',
'From Oak to Java: The Revolution of a Language',
10.75, 1, 1998, 'What a cool book.', 20);
INSERT INTO WEB_BOOKSTORE_BOOKS VALUES('206', 'Gosling',
'James',
'Java Intermediate Bytecodes', 30.95, 1,
2000, 'What a cool book.', 20);
List 1. SQL文件(bookstore.sql)
打开Derby数据库的对话窗,
$GLASSFISH_HOME/javadb/frameworks/NetworkServer/bin/ij.bat
创建一个叫bookstoredb数据库,然后创建表格.
ij> connect
'jdbc:derby://localhost:1527/bookstoredb;create=true';
ij> run 'bookstore.sql';
2.2 Entity类
Entity类实际上是一个JavaBean,它表示了一个数据库中的表.下面的Book类对应了表"TABLE
WEB_BOOKSTORE_BOOKS".类中使用了以下3个annotation.
@Entity: 指定这个类为Entity.
@Table : 指定mapping的表.
@Id : 指定表中的主键.
package database;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "WEB_BOOKSTORE_BOOKS")
public class Book implements Serializable {
private String bookId;
private String description;
private String firstName;
private String surname;
private String title;
private boolean onSale;
private float price;
private int calendar_year;
private int inventory;
public Book() {
}
public Book(
String bookId,
String surname,
String firstName,
String title,
float price,
boolean onSale,
int calendar_year,
String description,
int inventory) {
this.bookId = bookId;
this.title = title;
this.firstName = firstName;
this.surname = surname;
this.price = price;
this.onSale = onSale;
this.calendar_year = calendar_year;
this.description = description;
this.inventory = inventory;
}
@Id
public String getBookId() {
return this.bookId;
}
public String getTitle() {
return this.title;
}
public String getFirstName() {
return this.firstName;
}
public String getSurname() {
return this.surname;
}
public float getPrice() {
return this.price;
}
public boolean getOnSale() {
return this.onSale;
}
public int getCalendar_year() {
return this.calendar_year;
}
public String getDescription() {
return this.description;
}
public int getInventory() {
return this.inventory;
}
public void setBookId(String id) {
this.bookId = id;
}
public void setTitle(String title) {
this.title = title;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setSurname(String surname) {
this.surname = surname;
}
public void setPrice(float price) {
this.price = price;
}
public void setOnSale(boolean onSale) {
this.onSale = onSale;
}
public void setCalendar_year(int calendar_year) {
this.calendar_year = calendar_year;
}
public void setDescription(String description) {
this.description = description;
}
public void setInventory(int inventory) {
this.inventory = inventory;
}
}
List
2. Book.java
2.3 数据库操作类
这个类提供了对数据库操作的方法,实际上是通过EntityManager类中的方法进行操作的.而EntityManager类是由EntityManagerFactory生成的.
package database;
import java.util.*;
import javax.persistence.*;
import database.Book;
import exception.BookNotFoundException;
public class BookDBAO {
private ArrayList books;
private EntityManager em;
public BookDBAO(EntityManagerFactory emf) throws Exception {
em = emf.createEntityManager();
}
public void remove() {
try {
em.close();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
public Book getBook(String bookId) throws BookNotFoundException {
Book requestedBook = em.find(Book.class, bookId);
if(requestedBook == null) {
throw new BookNotFoundException("Couldn't find book: " + bookId);
}
return requestedBook;
}
}
List
3.BookDBAO.java
2.4 BookNotFoundException类
BookDBAO.java中所使用的类.
package exception;
public class BookNotFoundException extends Exception {
public BookNotFoundException() {
}
public BookNotFoundException(String msg) {
super(msg);
}
}
List
4. BookNotFoundException.java
2.5 Servlet类
在这个类中由container注入一个EntityManagerFactory并且把它传递给BookDBAO类.注意EntityManagerFactory
的注入需要在由容器管理的实体中进行(比如Servlet).
package servlets;
import java.io.PrintWriter;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import database.Book;
import database.BookDBAO;
import exception.BookNotFoundException;
public class BookStoreServlet extends HttpServlet {
private BookDBAO bookDBAO;
@PersistenceUnit
private EntityManagerFactory emf;
public void init() throws ServletException {
try{
bookDBAO = new BookDBAO(emf);
}catch(Exception ex){
System.out.println("Couldn't create bookstore database bean: "
+ ex.getMessage());
}
if (bookDBAO == null) {
throw new UnavailableException("Couldn't get database.");
}
}
public void destroy() {
bookDBAO = null;
}
public void doGet(
HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//set content-type header before accessing the Writer
response.setContentType("text/html");
response.setBufferSize(8192);
PrintWriter out = response.getWriter();
String bookId = request.getParameter("bookid");
try {
Book bd = bookDBAO.getBook(bookId);
out.println(bookId+": "+ bd.getTitle());
}catch(BookNotFoundException bnf){
out.println("The book not found.");
}catch(Exception e){
e.printStackTrace();
}
out.close();
}
}
List
5. BookStoreServlet.java
2.6 web.xml
部署时的文件.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>BookStoreServlet</servlet-name>
<servlet-class>servlets.BookStoreServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BookStoreServlet</servlet-name>
<url-pattern>/bookstore</url-pattern>
</servlet-mapping>
</web-app>
List 6. web.xml
2.7 persistence.xml
用描述文件persistence.xml来定义persistence
unit.打包做成WAR文件,可以把它放在WEB-INF/classes/META-INF之下.在这使用了Glassfish预先定义好了的DataSource--jdbc/__default.
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name ="bookstore">
<jta-data-source>jdbc/__default</jta-data-source>
</persistence-unit>
</persistence>
List
7. persistence.xml
3.客户端的HTML文件
<html>
<head>
<title>JPA in Web example</title>
</head>
<body>
<form action="bookstore"
method="GET">
BookId: <input type="text"
name="bookid">
<br/>
Search: <input type="submit"
value="submit">
</form>
</body>
</html>
List
8. bookstore.html
4.编译,部署,运行.
$ javac -classpath .\;$GLASSFISH_HOME/lib/javaee.jar
servlets/BookStoreServlet.java
编译好文件,按照WEB格式打成WAR包,把这个包直接拷贝到$GLASSFISH_HOME/domains/domain1/autodeploy下,这样就可以测试了.
BookId:
Search:
输入206,会看到如下反馈.
206: Java Intermediate Bytecodes
通过调用EntityManager的一些其他方法,还可以进行对数据库的其他操作.
5.其他
数据库停止命令,
$GLASSFISH_HOME/bin/asadmin.bat
stop-database
服务器停止命令,
$GLASSFISH_HOME/bin/asadmin.bat stop-domain
分享到:
相关推荐
在这个例子中,`index` 是 Thymeleaf 视图模板的名称。Spring Boot 将自动查找位于 `src/main/resources/templates` 目录下的模板文件。 通过以上步骤,我们成功地构建了一个简单的 Spring Boot 应用程序,集成了 ...
### JSF Web应用示例详解 #### 一、概述 本文档主要介绍如何使用JavaServer Faces(简称JSF)框架创建一个简单的Web应用...此外,案例中还展示了如何结合JPA进行数据持久化操作,这对于构建完整的Web应用至关重要。
**JSF(JavaServer Faces...总之,“JSF in Action 中文版”为初学者提供了一个全面学习JSF的资源,通过阅读和实践书中提供的例子,开发者不仅可以掌握JSF的基础,还能探索其高级特性,从而在Web开发领域更加得心应手。
通过使用`@Name`注解来定义组件名,`@In`和`@Out`注解来注入和暴露依赖。 5. 创建JSF页面:Seam与JSF的集成使得在JSF页面上可以直接使用Seam组件。你可以在`.xhtml`页面中使用`<s:>`或`标签来引用Seam组件。 6. ...
- Spring高级主题,包括与数据持久化的集成(如使用Spring Data JPA),以及集成安全框架(如Spring Security)。 - Spring Boot的介绍,这是Spring大家族中的一个最新成员,它简化了Spring应用的配置和部署。 - ...
通过`jbia-src`中的例子,你可以看到如何创建和打包应用,以及如何将它们放入`deployments`目录以实现自动部署或手动部署。 JBoss还提供了模块化系统,允许你管理应用程序的依赖关系。理解如何组织和声明模块,以及...
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /> </plug-in> ``` 4. **Hibernate...
《Struts in Action》是Java Web开发领域的一本经典著作,专注于Apache Struts框架的实践应用。这本书由Mike Keith和Manning Publications合作出版,中文修正版则是由热心开发者“铁手”翻译,为国内读者提供了方便...
《Spring in Action》是一本备受推崇的Spring框架详解书籍,其深入浅出地介绍了Spring的核心概念、使用方法以及在实际开发中的...通过阅读和实践书中的例子,读者将能够熟练运用Spring框架,构建高效、稳定的Java应用。
1. **易于理解**:本书通过简洁明了的例子帮助读者快速掌握Spring的核心概念和技术细节。 2. **全面覆盖**:内容涵盖了Spring框架的主要功能,包括依赖注入、面向切面编程、数据访问等。 3. **实践导向**:作者强调...
书中将介绍如何使用Spring Data JPA、Spring JDBC Template和MyBatis与Spring的集成。 5. **Spring MVC**:Spring的Web MVC框架为构建Web应用提供了强大的支持。书中会讲解控制器、模型视图、视图解析器以及如何...
《JSF in Action》这本书是JavaServer Faces技术的权威指南,深入浅出地介绍了JSF这一基于MVC(Model-View-Controller)架构的Java Web开发框架。JSF(JavaServer Faces)是Oracle公司推出的标准,旨在简化企业级Web...
- **单元测试与集成测试**:书中强调了测试的重要性,并提供了使用JUnit和Mockito进行测试的具体例子。 - **Spring与其他框架的集成**:如与MyBatis、Hibernate等持久层框架的集成。 #### 社区评价 - **专业性**:...
根据提供的文件信息,我们可以推断出这是一本关于EJB 3.0的书籍,书名为《Manning EJB3.0 in action》。虽然标题和描述中的故事似乎与EJB 3.0无关,但从部分内容来看,这本书显然是专注于EJB 3.0的技术细节及其在...
根据所提供的文件信息,可以看出这是一本关于Spring框架的书籍,具体为《Spring in Action, Fourth Edition》的介绍。这本书由Craig Walls编写,出版日期为2016年8月,由Manning Publications出版。本书被赞誉为...
此外,Spring Data项目提供了对多种数据存储(如JPA、MongoDB等)的一致性访问接口,降低了学习成本。书中将介绍如何使用这些工具进行数据访问。 事务管理是确保数据一致性的关键。Spring支持编程式和声明式事务...
《Activiti in Action 源码》是一本深入解析Activiti工作流引擎的书籍,其源码涵盖了多种应用场景和技术整合,对于理解Activiti的工作原理、扩展性和实际应用有着极高的价值。以下将针对这些源码文件进行详细解读。 ...