图书管理功能模块的具体功能如下:
1 查看图书信息列表:用于显示图书的基本信息。
2 图书详细信息:用于显示指定图书的详细信息。
3 添加图书信息:用于添加图书信息。
4 修改图书信息:用于修改图书信息。
5 删除图书信息:用于删除图书信息。
6 查询图书信息:用于根据不同条件查询图书信息。
图书档案管理功能模块文件架构如图1所示。
图书档案管理功能模块文件架构如图1所示。
在图书档案管理模块中涉及的数据表是图书信息表(tb_bookinfo)、书架设置表(tb_bookcase)、图书类型表(tb_booktype)和出版社信息表(tb_publishing),这4个数据表间通过相应的字段进行关联,如图2所示。
图书档案功能模块的Action实现类Book继承了Action类。在该类中,首先需要在该类的构造方法中实例化图书档案模块的BookDAO类(该类用于实现与数据库的交互)。Action
实现类的主要方法是perform(),该方法会被自动执行,它本身没有具体的事务,它是根据通过HttpServletRequest的getParameter()方法获取的action参数值执行相应方法的。
图书档案管理模块Action实现类的关键代码如下:
import org.apache.struts.action.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.actionForm.BookForm;
import org.apache.struts.action.Action;
import com.dao.BookDAO;
import java.util.Date;
public class Book extends Action {
private BookDAO bookDAO = null;
public Book() {
this.bookDAO = new BookDAO();
}
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
String action =request.getParameter("action");
if(action==null||"".equals(action)){
request.setAttribute("error","您的操作有误!");
return mapping.findForward("error");
}else if("bookAdd".equals(action)){
return bookAdd(mapping,form,request,response); //添加图书信息
}else if("bookQuery".equals(action)){
return bookQuery(mapping,form,request,response); //查询全部图书信息
}else if("bookModifyQuery".equals(action)){
return bookModifyQuery(mapping,form,request,response); //修改图书信息时应用的查询
}else if("bookModify".equals(action)){
return bookModify(mapping,form,request,response); //修改图书信息
}else if("bookDel".equals(action)){
return bookDel(mapping,form,request,response); //删除图书信息
}else if("bookDetail".equals(action)){
return bookDetail(mapping,form,request,response); //查询图书详细信息
}else if("bookifQuery".equals(action)){
return bookifQuery(mapping,form,request,response); //按不同条件查询图书信息
}
request.setAttribute("error","操作失败!");
return mapping.findForward("error");
}
… //此处省略了该类中其他方法
}
管理员登录后,选择“图书管理”/“图书档案管理”菜单项,进入到查看图书列表页面,在该页面中将显示全部图书信息列表,同时提供添加图书信息、删除图书信息、修改图书信息的超级链接。
查看图书信息列表页面的运行结果如图3所示。
打开保存实现半透明背景菜单的全部JavaScript代码的“JSmenu.JS”文件,可以找到如下所示的“图书档案管理”菜单项的超级链接代码:
<a href=book.do?action=bookQuery>图书档案管理</a>
从上面的URL地址中可以知道,查看图书信息列表模块涉及的action的参数值为“bookQuery”,当action=bookQuery时,会调用查看图书信息列表的方法bookQuery(),具体代码如下:
if("bookQuery".equals(action)){
return bookQuery(mapping,form,request,response);
}
在查看图书信息列表的方法bookQuery()中,首先调用BookDAO类中的query()方法查询全部图书信息,再将返回的查询结果保存到HttpServletRequest的对象book中。查看图书信息列表的方法bookQuery()的具体代码如下:
private ActionForward bookQuery(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response){
String str=null;
request.setAttribute("book",bookDAO.query(str));
return mapping.findForward("bookQuery");
}
从上述代码中可以知道,查看图书信息列表使用的BookDAO类的方法是query()。在query()方法中首先根据参数strif的值查询出符合条件的图书信息(此时的strif的值为null,所以查询全部图书信息),然后将查询结果保存到Collection容器类中并返回该容器类。query()方法的具体代码如下:
public Collection query(String strif){
BookForm bookForm=null;
Collection bookColl=new ArrayList();
String sql="";
if(strif!="all" && strif!=null && strif!=""){
sql="select * from (select b.*,c.name as bookcaseName,p.pubname as publishing,t.typename from tb_bookinfo b left join tb_bookcase c on b.bookcase=c.id join tb_publishing p on b.ISBN=p.ISBN join tb_booktype t on b.typeid=t.id where b.del=0) as book where book."+strif+"'";
}else{
sql="select b.*,c.name as bookcaseName,p.pubname as publishing,t.typename from tb_bookinfo b left join tb_bookcase c on b.bookcase=c.id join tb_publishing p on b.ISBN=p.ISBN join tb_booktype t on b.typeid= t.id where b.del=0";
}
ResultSet rs=conn.executeQuery(sql);
try {
while (rs.next()) {
bookForm=new BookForm();
bookForm.setBarcode(rs.getString(1));
bookForm.setBookName(rs.getString(2));
bookForm.setTypeId(rs.getInt(3));
bookForm.setAuthor(rs.getString(4));
bookForm.setTranslator(rs.getString(5));
bookForm.setIsbn(rs.getString(6));
bookForm.setPrice(Float.valueOf(rs.getString(7))); //此处必须进行类型转换
bookForm.setPage(rs.getInt(8));
bookForm.setBookcaseid(rs.getInt(9));
bookForm.setStorage(rs.getInt(10));
bookForm.setInTime(rs.getString(11));
bookForm.setOperator(rs.getString(12));
bookForm.setDel(rs.getInt(13));
bookForm.setId(Integer.valueOf(rs.getString(14)));
bookForm.setBookcaseName(rs.getString(15));
bookForm.setPublishing(rs.getString(16));
bookForm.setTypeName(rs.getString(17));
bookColl.add(bookForm);
}
} catch (SQLException ex) {
}
conn.close();
return bookColl;
}
在struts-config.xml文件中配置查看图书信息列表所涉及的<forward>元素,代码如下:
<forward name="bookQuery" path="/book.jsp" />
接下来的工作是将Action实现类中bookQuery()方法返回的查询结果显示在查看图书信息列表页book.jsp中。在book.jsp中,首先通过request.getAttribute()方法获取查询结果并将其保存在Connection容器类中,再通过循环将图书信息以列表形式显示在页面中。
管理员登录系统后,选择“图书管理”/“图书档案管理”菜单项,进入到查看图书列表页面,在该页面中单击“添加图书信息”超级链接,进入到添加图书信息页面。添加图书信息页面的运行结果如图4所示。
添加图书信息页面主要用于收集输入的图书信息,及通过自定义的JavaScript函数验证输入信息是否合法,该页面中所涉及的表单元素如表1所示。
在添加图书信息页面中输入合法的图书信息后,单击“保存”按钮,网页会访问一个URL,该URL是“book.do?action=bookAdd”。从该URL地址中可以知道添加图书信息模块涉及到的action的参数值为“bookAdd”,也就是当action= bookAdd时,会调用添加图书信息的方法bookAdd(),具体代码如下:
if("bookAdd".equals(action)){
return bookAdd(mapping,form,request,response);
}
在添加图书信息的方法bookAdd()中,首先需要将接收到的表单信息强制转换成ActionForm类型,并用获得指定属性的getXXX方法,重新设置该属性的setXXX方法,然后调用BookDAO类中的insert()方法,将添加的图书信息保存到数据表,并将返回值保存到变量ret中:如果返回值为1,表示信息添加成功,将页面重定向到添加信息成功页面;如果返回值为2,表示该图书信息已经添加,将错误提示信息“该图书信息已经添加!”保存到HttpServletRequest的对象error中,然后将页面重定向到错误提示信息页面;否则将错误提示信息“图书信息添加失败!”保存到HttpServletRequest的对象error中,并将页面重定向到错误提示页。添加图书信息的方法bookAdd()的具体代码如下:
private ActionForward bookAdd(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response){
BookForm bookForm = (BookForm) form;
…… //此处省略了用相关属性的getXXX方法重新设置该属性的setXXX方法的代码
Date date1=new Date();
java.sql.Date date=new java.sql.Date(date1.getTime());
bookForm.setInTime(date.toString());
bookForm.setOperator(bookForm.getOperator());
int a=bookDAO.insert(bookForm);
if(a==1){
return mapping.findForward("bookAdd");
}else if(a==2){
request.setAttribute("error","该图书信息已经添加!");
return mapping.findForward("error");
}else{
request.setAttribute("error","图书信息添加失败!");
return mapping.findForward("error");
}
}
从上述代码中可以知道,添加图书信息页使用的BookDAO类的方法是insert()。在insert()方法中,首先从数据表tb_bookinfo中查询输入的图书名称或条形码是否存在:如果存在,将标志变量设置为2;否则将输入的信息保存到图书信息表中,并将返回值赋给标志变量,最后返回标志变量。由于添加图书信息的insert()方法同添加管理员信息的insert()方法类似,所以此处只给出查询输入的图书名称或条形码是否存在和向图书信息表中插入数据的SQL语句。
查询输入的图书名称或条形码是否存在的SQL语句如下:
String sql1="SELECT * FROM tb_bookinfo WHERE barcode='"+bookForm.getBarcode()+"' or bookname='"+bookForm.getBookName()+"'";
向图书信息表中插入数据的SQL语句如下:
sql ="Insert into tb_bookinfo (barcode,bookname,typeid,author,translator,isbn,price,page,bookcase,storage,inTime,operator) values('"+bookForm.getBarcode()+"','"+bookForm.getBookName()+"',"+bookForm.getTypeId()+",'"+bookForm.getAuthor()+"','"+bookForm.getTranslator()+"','"+bookForm.getIsbn()+"',"+bookForm.getPrice()+","+bookForm.getPage()+","+bookForm.getBookcaseid()+","+bookForm.getStorage()+",'"+bookForm.getInTime()+"','"+bookForm.getOperator()+"')";
在struts-config.xml文件中配置添加图书信息所涉及的<forward>元素,代码如下:
<forward name="bookAdd" path="/book_ok.jsp?para=1" />
管理员登录系统后,选择“图书管理”/“图书档案管理”菜单项,进入到查看图书列表页面,在该页面中,单击想要修改的图书信息后面的“修改”超级链接,进入到“修改图书信息”页面。修改图书信息页面的运行结果如图5所示。
在修改图书信息页面中修改图书信息后,单击“保存”按钮,网页会访问一个URL,该URL是“book.do?action=bookModify”。从该URL地址中可以知道保存修改图书信息涉及的action的参数值为“bookModify”,也就是当action=bookModify时,会调用保存修改图书信息的方法bookModify(),具体代码如下:
if("bookModify".equals(action)){
return bookModify(mapping,form,request,response);
}
在保存修改图书信息的方法bookModify()中,首先需要将接收到的表单信息强制转换成ActionForm类型,并用获得指定属性的getXXX方法重新设置该属性的setXXX方法,然后调用BookDAO类中的update()方法,将修改的图书信息保存到数据表tb_bookinfo中,并将返回值保存到变量ret中,如果返回值为0,表示信息修改失败,将错误提示信息“修改图书信息失败!”保存到HttpServletRequest的对象error中,然后将页面重定向到错误提示信息页面,否则将页面重定向到设置信息成功页面。保存修改图书信息的方法bookModify()的具体代码如下:
private ActionForward bookModify(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response){
BookForm bookForm=(BookForm)form;
bookForm.setBarcode(bookForm.getBarcode());
…… //此处省略了用相关属性的getXXX方法重新设置该属性的setXXX方法的代码
int ret=bookDAO.update(bookForm);
if(ret==0){
request.setAttribute("error","修改图书信息失败!");
return mapping.findForward("error");
}else{
return mapping.findForward("bookModify");
}
}
从上述代码中可以知道,保存修改图书信息时使用的BookDAO类的方法是update()。在update()方法中将修改的图书信息保存到图书信息表tb_bookinfo中,并将返回值赋给标志变量,最后返回该标志变量。update()方法的具体代码如下:
public int update(BookForm bookForm){
String sql="Update tb_bookinfo set typeid="+bookForm.getTypeId()+",author='"+bookForm.getAuthor()+"',translator='"+bookForm.getTranslator()+"',isbn='"+bookForm.getIsbn()+"',price="+bookForm.getPrice()+",page="+bookForm.getPage()+",bookcase="+bookForm.getBookcaseid()+",storage="+bookForm.getStorage()+" where id="+bookForm.getId()+"";
int falg=conn.executeUpdate(sql);
conn.close();
return falg;
}
在struts-config.xml文件中配置修改图书信息页所涉及的<forward>元素,代码如下:
<forward name="bookModify" path="/book_ok.jsp?para=2" />
管理员登录系统后,选择“图书管理”/“图书档案管理”菜单项,进入到查看图书列表页面,在该页面中单击想要删除的图书信息后面的“删除”超级链接,进入到“删除图书信息”页面。
在“查看图书信息列表”页面中可以找到删除图书信息的超级链接代码,代码如下所示:
<a href="book.do?action=bookDel&ID=<%=ID%>">删除</a>
从上面的URL地址中可以知道,删除图书信息页所涉及的action的参数值为“bookDel”,当action=bookDel时,会调用删除图书信息的方法bookDel(),具体代码如下:
if("bookDel".equals(action)){
return bookDel(mapping,form,request,response);
}
在删除图书信息的方法bookDel()中,首先需要将接收到的表单信息强制转换成ActionForm类型,并用获得的id参数的值重新设置该ActionForm的setId方法,再调用BookDAO类中的delete()方法删除指定的图书信息,并根据执行结果将页面转到相应页面。删除图书信息的方法bookDel()的具体代码如下:
private ActionForward bookDel(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response){
BookForm bookForm=(BookForm)form;
bookForm.setId(Integer.valueOf(request.getParameter("ID")));
int ret=bookDAO.delete(bookForm);
if(ret==0){
request.setAttribute("error","删除图书信息失败!");
return mapping.findForward("error");
}else{
return mapping.findForward("bookDel");
}
}
从上述代码中可以知道,删除图书信息使用的BookDAO类的方法是delete()。由于在设计数据库时采用了数据规范化原则,将图书信息表、图书借阅信息表和图书归还信息表紧密地关联在一起,即图书借阅信息表和图书归还信息中只保存了图书的ID号,并没有保存更多的图书信息,为了保证数据的完整性,在删除图书信息时,并不是将其真正删除,而是设置了一个标记字段,该标记字段del只有两个值即0(表示没有删除)或1(表示已经删除)。在删除时,只要将该字段的值设置为1即可。删除图书信息的delete()方法的具体代码如下:
public int delete(BookForm bookForm){
String sql="UPDATE tb_bookinfo SET del=1 where id="+bookForm.getId()+"";
int falg=conn.executeUpdate(sql);
return falg;
}
在struts-config.xml文件中配置删除图书信息所涉及的<forward>元素,代码如下:
<forward name="bookDel" path="/book_ok.jsp?para=3" />