CRUD是Create(创建)、Read(读取)、Update(更新)和Delete(删除)的缩写,它是普通应用程序的缩影。如果您掌握了某 框架的CRUD编写,那么意味可以使用该框架创建普通应用程序了,所以大家使用新框架开发OLTP(Online Transaction Processing)应用程序时,首先会研究一下如何编写CRUD。这类似于大家在学习新编程语言时喜欢编写“Hello World”。
本文旨在讲述Struts 2上的CRUD开发,所以为了例子的简单易懂,我不会花时间在数据库的操作上。取而代之的是一个模拟数据库的哈希表(Hash Map)。
具体实现
首先,让我们看看的“冒牌”的DAO(Data Access Object,数据访问对象),代码如下:
package
tutorial.dao;

import
java.util.Collection;
import
java.util.concurrent.ConcurrentHashMap;
import
java.util.concurrent.ConcurrentMap;

import
tutorial.model.Book;


public
class
BookDao
{
private static final BookDao instance;
private static final ConcurrentMap<String, Book> data;

static
{
instance = new BookDao();
data = new ConcurrentHashMap<String, Book>();
data.put("978-0735619678", new Book("978-0735619678", "Code Complete, Second Edition", 32.99));
data.put("978-0596007867", new Book("978-0596007867", "The Art of Project Management", 35.96));
data.put("978-0201633610", new Book("978-0201633610", "Design Patterns: Elements of Reusable Object-Oriented Software", 43.19));
data.put("978-0596527341", new Book("978-0596527341", "Information Architecture for the World Wide Web: Designing Large-Scale Web Sites", 25.19));
data.put("978-0735605350", new Book("978-0735605350", "Software Estimation: Demystifying the Black Art", 25.19));
}

private BookDao()
{}

public static BookDao getInstance()
{
return instance;
}

public Collection<Book> getBooks()
{
return data.values();
}

public Book getBook(String isbn)
{
return data.get(isbn);
}

public void storeBook(Book book)
{
data.put(book.getIsbn(), book);
}

public void removeBook(String isbn)
{
data.remove(isbn);
}

public void removeBooks(String[] isbns)
{

for(String isbn : isbns)
{
data.remove(isbn);
}
}
}
清单1 src/tutorial/dao/BookDao.java
以上代码相信不用解释大家也清楚,我使用ConcurrentMap数据结构存储Book对象,这主要是为了方便检索和保存Book对象;另外,我还将data变量设为静态唯一来模拟应用程序的数据库。
接下来是的数据模型Book类,代码如下:
package
tutorial.model;


public
class
Book
{
private String isbn;
private String title;
private double price;

public Book()
{
}

public Book(String isbn, String title, double price)
{
this.isbn = isbn;
this.title = title;
this.price = price;
}


public String getIsbn()
{
return isbn;
}


public void setIsbn(String isbn)
{
this.isbn = isbn;
}


public double getPrice()
{
return price;
}


public void setPrice(double price)
{
this.price = price;
}


public String getTitle()
{
return title;
}


public void setTitle(String title)
{
this.title = title;
}
}
清单2 src/tutorial/model/Book.java
Book类有三个属性isbn,、title和price分别代表书籍的编号、名称和价格,其中编号用于唯一标识书籍(相当数据库中的主键)。
然后,我们再来看看Action类的代码:
package
tutorial.action;

import
java.util.Collection;

import
tutorial.dao.BookDao;
import
tutorial.model.Book;

import
com.opensymphony.xwork2.ActionSupport;


public
class
BookAction
extends
ActionSupport
{
private static final long serialVersionUID = 872316812305356L;
private String isbn;
private String[] isbns;
private Book book;
private Collection<Book> books;
private BookDao dao = BookDao.getInstance();

public Book getBook()
{
return book;
}


public void setBook(Book book)
{
this.book = book;
}


public String getIsbn()
{
return isbn;
}


public void setIsbn(String isbn)
{
this.isbn = isbn;
}


public String[] getIsbns()
{
return isbns;
}


public void setIsbns(String[] isbns)
{
this.isbns = isbns;
}

public Collection<Book> getBooks()
{
return books;
}


public void setBooks(Collection<Book> books)
{
this.books = books;
}


public String load()
{
book = dao.getBook(isbn);
return SUCCESS;