Struts2综合应用案例.ppt_第1页
Struts2综合应用案例.ppt_第2页
Struts2综合应用案例.ppt_第3页
Struts2综合应用案例.ppt_第4页
Struts2综合应用案例.ppt_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章 Struts 2综合应用案例,7.1 “图书管理系统”主界面设计,7.2 增加验证的“登录”功能,7.3 实现“借书”功能,7.4 实现“图书管理”功能,7.1 “图书管理系统”主界面设计,7.1.1 头部设计 1头部效果 (1)若以“管理员”身份登录,显示的页面头部效果,如图7.1所示。,(2)若以“学生”身份登录,显示的页面头部效果,如图7.2所示。,2页头部JSP (1)“管理员”身份登录的主页头head.jsp,代码为。 (2)“学生”身份登录的主页头head1.jsp,代码为。,7.1.2 整体设计,以“管理员”身份登录,转到主页admin.jsp的代码为。 同理,以“学生”身份登录,转到主页student.jsp的代码为: ,7.1.2 整体设计,设计好主页的整体呈现效果,如图7.3所示(以管理员的主页为例)。,7.2 增加验证的“登录”功能,先来修改原程序,主要是改变登录后需要跳转到的页面,原来是main.jsp(欢迎主页),现在为上面刚刚设计的主界面(见图7.3),且要能根据登录角色的不同控制跳转方向。 修改原LoginAction.java的代码为。 其中增加了验证功能,采用覆盖ActionSupport类的validate方法,判断如果用户未输入登录名和密码就把错误信息保存在“fielderror”中,并返回“INPUT”。这样,根据struts.xml中的action配置,就会返回登录页login.jsp,并根据“”输出其中保存的错误信息。,7.2 增加验证的“登录”功能,在struts.xml中修改配置,代码如下: /admin.jsp /student.jsp /error.jsp /login.jsp /此处以后还要添加更多action配置 ,7.2 增加验证的“登录”功能,最后,还要修改登录页面login.jsp的代码,在其中加入标签以便在页面上输出验证错误信息,代码为。 完成后,重新部署运行程序,于登录页上故意不输入任何内容而直接单击“登录”按钮,提交后系统显示验证错误提示信息,如图7.4所示。,7.3 实现“借书”功能,7.3.1 总体界面设计 当用“管理员”身份登录后,图片链接就可用了,单击“借书”链接,出现如图7.5所示界面。,7.3.1 总体界面设计,要实现这个界面,采用表格方式把页面分成3行2列,基本结构如下所示:,7.3.1 总体界面设计,总体页面lend.jsp,代码为。 刚进入页面时,借书功能是不可用的,但当输入了借书证号后,单击“查询”按钮,会在右边显示该读者所借书籍,同时“借书”按钮变亮,表示可以进行借书操作了,如图7.6所示。,7.3.1 总体界面设计,输入正确的ISBN及图书ID,单击“借书”按钮,就可借得此书,如图7.7所示。,7.3.2 查询已借图书,单击“借书”链接,从前述head.jsp中的代码: 可以看出,单击操作提交到lend.jsp,故出现了如图7.5所示的界面供用户操作。 总体界面lend.jsp分四部分(代码见前),第一部分: 第二部分就是页面左边的查询功能部分,由search.jsp实现,代码为。,7.3.2 查询已借图书,当输入正确的借书证号,单击“查询”按钮时,提交到“selectBook.action”,根据struts.xml配置下面的代码: /lend.jsp 处理的Action为LendAction中的selectAllLend方法,LendAction.java的该部分代码为。,7.3.2 查询已借图书,由于用到了模型传值,而且在后面的与数据库交互时把查询的数据记录都转化为该类中的属性,故模型代码Lend.java为: package org.model; import java.util.Date; public class Lend private String bookId; /图书ID private String readerId; /借书证号 private String bookName; /书名 private String publisher; /出版社 private float price; /价格 private String ISBN; /ISBN号 private Date lTime; /借书时间 /生成上述属性的get和set方法 ,7.3.2 查询已借图书,该方法是用来根据借书证号,查询学生信息,如果有该学生信息就查询该学生已借图书;如果没有就添加“不存在该学生”的信息到“message”,然后返回到页面,页面会输出该信息,告知用户输入了错误的借书证号。 StudentDao.java的代码实现为。 该Dao中的方法selectByReaderId的作用就是根据借书证号,查询学生信息;如果有就返回该学生,如果没有就返回null。当然,在应用Student类之前要先编写该类的代码,Student. java就是student表对应的模型: package org.model; import java.util.Date; public class Student private String readerId; /借书证号 private String name; /姓名 private String spec; /专业 private boolean sex; /性别 private Date born; /出生时间 private int num; /借书量 private int snum; /库存量 private byte photo; /照片 /省略上面属性的get和set方法 ,7.3.2 查询已借图书,判断完成后,如果输入了正确的借书证号,就会分页查询,先来看看在LendDao中的查询方法。 当在Action中调用这个查询方法后,就会得到对应借书证号在lend表中的“pageSize”条记录,返回查询结果的List集。接下来就是Pager.java,即分页功能。其实,分页功能的处理有很多种方法,不同的程序员写的方法可能不一样,但都能达到目的。本例的分页功能代码为。 Pager类中构造方法中要传入两个参数,一个是“pageNow”,另一个是“totalSize”,而“totalSize”是数据库中对应记录的总条数,故需要查询数据库,所以在创建Pager对象时: Pager page=new Pager(pageNow,lendDao.selectLendSize(lend.getReaderId();,7.3.2 查询已借图书,在LendDao中加入查询总记录的方法: public int selectLendSize(String readerId) try conn=DBConn.getConn(); PreparedStatement pstmt=conn.prepareStatement(“select count(*) from lend where readerId=?“); pstmt.setString(1, readerId); ResultSet rs=pstmt.executeQuery(); if(rs.next() int pageCount=rs.getInt(1); return pageCount; return 0; catch(Exception e) e.printStackTrace(); return 0; finally DBConn.CloseConn(); ,7.3.2 查询已借图书,在Action中调用方法查询完成后,把要保存的信息保存到request中,然后根据返回值在struts.xml中的配置返回到“lend.jsp”页面。此时由于request保存了该信息,就会在页面输出信息,输出代码就是要说的lend.jsp的第三部分,用lendbookinfo.jsp(其代码包含在右边表格的JSP文件lendbook.jsp中)实现。 上面内容是显示存储在request中的list,但在做这部分功能时每次只查询了“pageSize”条记录,故在页面中应用了分页。分页是前述总体界面中右边表格的一部分,前面讲过:右边表格分为3行1列,其中第3行是分页控制,代码位于lendbook.jsp中。,7.3.2 查询已借图书,当单击要显示的页面时,就把pageNow值传到了Action,Action就会根据pageNow的值查询要显示的list集,这样查询功能就基本完成了。在Action处理之前做了一些判断工作,如果输入的借书证号不合法或不存在就会直接返回并保存一些信息。在“lendbook.jsp”中也有相应的输出: ,7.3.3 “借书”功能,“lend.jsp”中还有最后一个功能就是借书,其实现依靠的是总体界面右边表格中第1行的“借书表单”,其实现代码位于lendbook.jsp中(前已用注释标出),具体如下。 输入了“借书证号”(即readerId),查询该学生已借图书后,“readerId”就被保存到了request中,这时该部分就变成可操作了,输入要借书籍的“ISBN”及“图书ID”,单击“借书”按钮,提交到“lendBook.action”,该请求在struts.xml中配置为: /lend.jsp ,7.3.3 “借书”功能,从“method = lendBook”可以看出,处理该功能的是LendAction中的lendBook方法,下面看该方法的实现。 本功能在判断是否有用户输入的“ISBN”时应用了BookDao的“selectBook”方法。 图书模型Book.java代码为: package org.model; public class Book private String ISBN; /ISBN号 private String bookName; /书名 private String author; /作译者 private String publisher; /出版社 private float price; /价格 private int cnum; /复本量 private int snum; /库存量 private String summary; /内容提要 private byte photo; /封面照片 /省略上面属性的get和set方法 ,7.3.3 “借书”功能,在判断图书ID时,因为同一本书不能被同时借两次或多次,故在已经借的书中不能包含刚刚输入的图书ID,判断方法为LendDao中的“selectByBookId”方法,代码实现。 如果返回“lend”,表示已经存在,将返回错误信息。通过判断都合法后,将应用LendDao中的“addLend”方法对其进行插入操作: public boolean addLend(Lend lend) try conn=DBConn.getConn(); PreparedStatement pstmt=conn.prepareStatement(“insert into lend values(?,?,?,?)“); pstmt.setString(1, lend.getBookId(); pstmt.setString(2, lend.getReaderId(); pstmt.setString(3, lend.getISBN(); pstmt.setDate(4, new Date(lend.getLTime().getTime(); pstmt.execute(); return true; catch(Exception e) e.printStackTrace(); return false; finally DBConn.CloseConn(); ,7.3.3 “借书”功能,由于该“ISBN”的图书被借出去一本,故该图书的库存量应该减少一本,所以在插入一条lend记录的同时要修改book的库存量(代码位于LendAction中的lendBook方法中): Book book=bookDao.selectBook(lend.getISBN(); /取得该ISBN的图书对象 book.setSnum(book.getSnum()-1); /设置库存量-1 bookDao.updateBook(book); 在BookDao中的updateBook方法为。,7.3.3 “借书”功能,同时,学生的借书量应该多出一本,故有这样的代码(位于LendAction中的lendBook方法中): StudentDao studentDao=new StudentDao(); Student stu=studentDao.selectByReaderId(lend.getReaderId(); stu.setNum(stu.getNum()+1); /设置学生的借书量+1 studentDao.updateStudent(stu); 所以,在StudentDao中要编写修改学生信息的方法: public void updateStudent(Student stu) try conn=DBConn.getConn(); PreparedStatement pstmt=conn.prepareStatement(“update student set num=? where readerId=?“); pstmt.setInt(1, stu.getNum(); pstmt.setString(2, stu.getReaderId(); pstmt.executeUpdate(); catch(Exception e) e.printStackTrace(); finally DBConn.CloseConn(); ,7.4 实现“图书管理”功能,7.4.1 总体界面设计 单击“图书管理”图片链接,跳转到“bookmanage.jsp”,出现如图7.8所示的页面。,7.4.1 总体界面设计,该页面的结构相对简单,包含左右两大块,基本结构如下所示:,总体页面bookmanage.jsp,代码所示。 左边部分“功能选择”(funcselect.jsp实现),代码为。,7.4.2 “图书追加”功能,追加图书必须有能填写图书详细信息的表单,提供给用户输入新书的信息,该表单由bookinfo.jsp实现,代码所示。 在页面右边部分的“图书信息”表单中填写要添加的图书信息,如图7.9所示。,7.4.2 “图书追加”功能,可以发现,“图书追加”提交按钮代码: 由于4个按钮均提交到“book.action”,故该提交代码中定义了“method=“addBook“”,表示提交后由Action类中的“addBook”方法来处理,struts.xml中关于action的配置为: /bookmanage.jsp /bookmanage.jsp * addBook,updateBook ,7.4.2 “图书追加”功能,通过该配置文件,系统会应用BookAction来处理请求,并根据提交的方法名来决定用哪个方法进行处理。 Book的模型在借书部分已经给出,这里不再列举。本例中把照片传入数据库中用二进制流保存,而在页面中,由于用到文件上传,故“form”中要加入属性“enctype=“multipart/ form-data“”,上传文件部分代码(位于bookinfo.jsp中)如下: 命名为“photo”,故在Action(BookAction)中有: private File photo; 接收传过来的值,后面“onchange”表示当选择好图片的路径时,把 “ width=“100“ height=“120“ 中“src”值设置为选中图片文件的路径。接着由程序代码处理传入的文件,把文件转化为字节数组,完成后调用BookDao的“addBook”方法进行插入操作。该方法的代码为。,7.4.2 “图书追加”功能,因为当添加记录时,需要对数据进行验证,本部分采用Struts 2的验证框架来处理,验证框架文件“BookAction-validation.xml”配置为。 struts.xml中的action配置为: /bookmanage.jsp /bookmanage.jsp * addBook,updateBook ,7.4.2 “图书追加”功能,加黑部分代码是配置该action应用的拦截器,我们知道,action默认使用的拦截器是“defaultStack”,本例为action配置该拦截器,但加入了两个参数: * 表示对所有方法都不验证,而 addBook,updateBook 表示验证“addBook”、“updateBook”两个方法,通过这样的设置,系统就会只验证“addBook”、“updateBook”两个方法,而不验证其他方法了。,7.4.3 “图书删除”功能,图书删除功能非常简单,输入“ISBN”后,单击“图书删除”按钮,就会根据BookAction中的“deleteBook”方法删除图书信息。“deleteBook”方法实现为: public String deleteBook() throws Exception if(new LendDao().selectByBookISBN(book.getISBN()!=null) this.setMessage(“该图书已经被借出,不能删除“); return SUCCESS; Book bo=bookDao.selectBook(book.getISBN(); if(bo=null) /首先判断是否存在该图书 this.setMessage(“要删除的图书不存在!“); return SUCCESS; else if(new LendDao().selectByBookISBN(book.getISBN()!=null) this.setMessage(“该图书已经被借出,故不能删除图书信息!“); return SUCCESS; bookDao.deleteBook(book.getISBN(); this.setMessage(“删除成功!“); return SUCCESS; ,7.4.3 “图书删除”功能,该功能用了3个方法,分别是BookDao中的“selectBook”、“deleteBook”及LendDao中的“selectByBookISBN”。“selectBook”方法前面已经给出,“deleteBook”方法实现为: public boolean deleteBook(String ISBN) try conn=DBConn.getConn(); PreparedStatement pstmt=conn.prepareStatement(“delete from book where ISBN=?“); pstmt.setString(1, ISBN); pstmt.execute(); return true; catch(Exception e) e.printStackTrace(); return false; finally DBConn.CloseConn(); ,7.4.3 “图书删除”功能,LendDao中的“selectByBookISBN”方法实现为: public Lend selectByBookISBN(String ISBN) try conn=DBConn.getConn(); PreparedStatement pstmt=conn.prepareStatement(“select * from lend where ISBN=?“); pstmt.setString(1, ISBN); ResultSet rs=pstmt.executeQuery(); if(rs.next() Lend lend=new Lend(); lend.setBookId(rs.getString(1); lend.setReaderId(rs.getString(2); lend.setISBN(rs.getString(3); lend.setLTime(rs.getDate(4); return lend; else return null; catch(Exception e) e.printStackTrace(); return null; finally DBConn.CloseConn(); ,7.4.4 “图书查询”功能,输入“ISBN”后,单击“图书查询”按钮,就会根据BookAction中的“selectBook”方法处理,查询该图书信息。“selectBook”方法实现为: public String selectBook() throws Exception Book onebook=bookDao

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论