图书的mysql数据库创建脚本:
create table books ( id int not null auto_increment, title varchar(255) not null, description text, image_url varchar(255), price decimal(8, 2) not null, author varchar(255) not null, isbn varchar(255) not null, publisher varchar(255) not null, user_id int not null, primary key (id)) engine=innodb default charset=utf8;
图书实体类文件book.java主要代码:
public class book { private long id; private string title; private string description; private string image_url; private double price; private string author; private string isbn; private string publisher; private user user; ...}
在user类中添加集合变量books:
public class user { ... private set books = new hashset(); ...}
在user.hbm.xml中配置和图书的一对多关联:
图书的表映射文件book.hbm.xml代码:
bookservice.java中的代码相对简单,因为没什么复杂的业务逻辑,只是负责把action和dao这两层连接起来。
bookdao.java中的代码主要实现图书的读取,更新和删除:
package name.dohkoos.book.dao;import java.util.list;import org.hibernate.query;import org.hibernate.session;import org.hibernate.sessionfactory;import org.hibernate.transaction;import name.dohkoos.book.model.book;public class bookdao { private sessionfactory sessionfactory; public void setsessionfactory(sessionfactory sessionfactory) { this.sessionfactory = sessionfactory; } public list getbooklist() { session session = sessionfactory.opensession(); try { query query = session.createquery(from book b); list booklist = query.list(); return booklist; } finally { session.close(); } } public book getbook(long bookid) { session session = sessionfactory.opensession(); try { query query = session.createquery(from book b where b.id = :id); query.setlong(id, bookid); query.setmaxresults(1); return (book)query.uniqueresult(); } finally { session.close(); } } public void saveorupdatebook(book book) { session session = sessionfactory.opensession(); transaction ts = null; try { ts = session.begintransaction(); session.saveorupdate(book); ts.commit(); } finally { session.close(); } } public void deletebook(long bookid) { session session = sessionfactory.opensession(); transaction ts = null; try { ts = session.begintransaction(); book book = (book)session.get(book.class, bookid); session.delete(book); ts.commit(); } finally { session.close(); } }}
bookaction.java负责协调图书应用程序间的运转。接收访问请求,与模型进行交互,将合适的视图展示给用户:
package name.dohkoos.book.action;import java.util.list;import name.dohkoos.account.model.user;import name.dohkoos.book.model.book;import name.dohkoos.book.service.bookservice;import com.opensymphony.xwork2.actioncontext;import com.opensymphony.xwork2.actionsupport;public class bookaction extends actionsupport { private static final long serialversionuid = 2538923417705852774l; private long bookid; private book book; private list booklist; private bookservice bookservice; public string list() throws exception { booklist = bookservice.getbooklist(); return list; } public string show() throws exception { book = bookservice.getbook(bookid); return show; } public string input() throws exception { if (bookid != null) { book = bookservice.getbook(bookid); } return input; } public string saveorupdate() throws exception { user user = (user)actioncontext.getcontext().getsession().get(user); book.setuser(user); bookservice.saveorupdatebook(book); return success; } public string delete() throws exception { bookservice.deletebook(bookid); return success; } ...}
在applicationcontext.xml中添加book的相关配置,如下面代码所示:
... ... name/dohkoos/book/model/book.hbm.xml...
在struts 2配置文件struts.xml中include文件book.xml。以下是book.xml文件的内容:
/books/list.jsp/books/show.jsp/books/form.jsplistbook
视图文件show.jsp作为显示单本图书的信息,代码很简单,就不放出来了,只把list.jsp和form.jsp的代码列出来。
list.jsp用来显示所有的图书:
listing books
title description image url price author isbn publisher action
show edit destroy
add当用户新建或者更新图书时,视图form.jsp就上场了。因为被两个逻辑使用,显示的标题等信息也不相同,所以需要判断图书的id是否存在,如果不存在的话即是新建业务,否则就是更新操作。
editing bookadd book
show |back
最后还要完成图书模型的服务端校验。struts 2的校验文件有两种格式:actionname-validation.xml和actionname-alias-validation.xml。第一种会对该action中的每个方法进行校验,不符合只对saveorupdate校验的要求。在bookaction.java同目录下创建bookaction-saveorupdatebook-validation.xml文件:
true
当然,还要在book.java所在的位置创建book-validation.xml文件:
price is required ... price is required0.01 price should be at least 0.01
看着bookaction-saveorupdatebook-validation.xml这么长的文件名是不是有点无语:)没关系,bookaction-validation.xml配置文件还是可以用的,只要在bookaction.java中那些不需要进行校验的方法上添加@skipvalidation;也可以在action配置中启用validation.excludemethods参数:
list,show,input,delete ...
代码下载:https://github.com/dohkoos/jbookshelf
原文地址:实现图书的增删查改(crud), 感谢原作者分享。