null第12章 Hibernate与Struts 2的整合应用实例第12章 Hibernate与Struts 2的整合应用实例12.1 Hibernate的反向工程12.3 功能实现12.2 编写DAO接口及实现类12.1 Hibernate的反向工程12.1 Hibernate的反向工程首先,建立对数据库MBOOK的连接,选择MyEclipse右上角的 图标,选择“MyEclipse Database Explorer”视图,在左边的“DB Browser”的空白区域,右击选择“New”,出现如图12.1所示的界面,用于填写要建立的连接的信息。
图12.1 填写数据源的信息12.1 Hibernate的反向工程12.1 Hibernate的反向工程图12.1中各栏的填写内容及说明如下:
(1)Driver template:选择“Microsoft SQL Server 2005”,
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示应用的数据库为“SQL Server 2005”。
(2)Driver name:程序员自定义连接的名称,本例命名为“MBOOKCONN”。
(3)Connection URL:连接数据库的URL,localhost表示本机,若连接其他主机的数据库,要写该主机的IP地址,端口号为1433,连接的数据库的名为“MBOOK”。
(4)User name:连接数据库用户名,笔者所用数据库用户名为“sa”。读者可以根据自己的数据库连接的用户名来自定义。
(5)Password:连接数据库的密码,填写自己数据库连接的密码。
(6)Driver JARs:连接数据库需要的类库。单击“Add JARs”按钮,选择需要的类库即可。
12.1 Hibernate的反向工程12.1 Hibernate的反向工程填写完信息后,单击“Finish”按钮完成数据源的连接。这时“DB Browser”中会多出刚刚建立的数据源,如图12.2所示。
右击“MBOOKCONN”,选择“Open connection”打开连接,出现如图12.3所示的界面。
图12.2 DB Browser 图12.3 打开连接界面12.1 Hibernate的反向工程12.1 Hibernate的反向工程完成这些之后,可以创建Web项目,项目命名为“Struts2_Hibernate”。把Struts 2要用到的类库复制到项目的lib下,修改web.xml的工作在Struts 2中已经讲解,这里重复操作即可。下面着重讲解利用MyEclipse添加Hibernate的开发能力,利用该功能可以为项目的开发提供很大的方便。其实现步骤为:右击项目名“Struts2_Hibernate”,依次选择“MyEclipse”→“Add Hibernate Capabilities...”,出现如图12.4所示的界面。
图12.4 添加Hibernate开发所需类库12.1 Hibernate的反向工程12.1 Hibernate的反向工程选择应用的Hibernate版本“Hibernate 3.2”及Hibernate所需的类库,单击“Next”按钮,出现如图12.5所示的界面,创建hibernate.cfg.xml文件。
图12.5 创建hibernate.cfg.xml文件12.1 Hibernate的反向工程12.1 Hibernate的反向工程Configuration Folder中填写“src”,表示文件放在src目录下,填写完成后,单击“Next”按钮,出现如图12.6所示的界面,选择数据库的连接。
图12.6 选择数据库连接界面12.1 Hibernate的反向工程12.1 Hibernate的反向工程在“DB Driver”一栏选择刚刚创建的数据库的连接“MBOOKCONN”,下面的URL等栏会自动填充,单击“Next”按钮,出现如图12.7所示的界面,用于创建“Hibernate SessionFactory”类,该类用于获取Session及关闭Session。Java package栏的值是指把该类放在“org.util”包下。
图12.7 创建Hibernate SessionFactory类12.1 Hibernate的反向工程12.1 Hibernate的反向工程单击“Finish”按钮完成对Hibernate功能的添加。打开项目,可以看出Hibernate的类库及核心配置文件以及Hibernate SessionFactory类已经出现在项目中,如图12.8所示。
图12.8 添加Hibernate功能完成后项目目录12.1 Hibernate的反向工程12.1 Hibernate的反向工程接下来就可以利用反向工程生成数据库表对应的POJO类及映射文件了。打开“MyEclipse Database Explorer”视图,在刚刚建立的数据库连接中依次选择展开“MBOOK”→“dbo”→“TABLE”,这时MBOOK数据中的表就展现出来了,选中这些表,右击选择“Hibernate Reverse Engineering”,如图12.9所示,将会出现如图12.10所示的对话框。
映射文件和POJO将要放置的包名生成映射文件, *.hbm.xml生成对应的数据对象POJO
图12.9 Hibernate的反向工程 图12.10 生成POJO类及映射文件12.1 Hibernate的反向工程12.1 Hibernate的反向工程选择及填写完成后,单击“Next”按钮,选择主键生成策略,如图12.11所示。
图12.11 选择主键生成策略 12.1 Hibernate的反向工程12.1 Hibernate的反向工程本例中选择“assigned”,由程序员自己设置主键。选择后单击“Finish”完成操作,再打开项目目录,出现如图12.12所示的界面。
图12.12 项目目录12.1 Hibernate的反向工程12.1 Hibernate的反向工程下面简要列举这几个文件的代码,顺便做简要讲解。
Login.java代码为:
package org.vo;
public class Login implements java.io.Serializable {
private Integer id; //ID
private String name; //用户名
private String password; //密码
private Byte role; //角色,true为管理员,false为读者
public Login() {}
public Login(Integer id, String name, String password, Byte role) {
this.id = id;
this.name = name;
this.password = password;
this.role = role;
}
//省略上面属性的get和set
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
}
12.1 Hibernate的反向工程12.1 Hibernate的反向工程Login.hbm.xml文件代码。
后面粘贴映射文件时,将只粘贴“hibernate-mapping”部分,头部文件省略。
Student.java代码。
Student.hbm.xml代码。
Book.java的代码。
Book.hbm.xml文件代码。
Lend.java代码。
Lend.hbm.xml代码。
POJO类及映射文件完成后,必须在hibernate.cfg.xml文件中注册:
12.2 编写DAO接口及实现类12.2 编写DAO接口及实现类“登录”的DAO接口LoginDao.java代码为:
package org.dao;
import org.vo.Login;
public interface LoginDao {
//查询信息
public Login checkLogin(String name,String password);
}
LoginDao的实现类LoginDaoImpl.java代码。
12.2 编写DAO接口及实现类12.2 编写DAO接口及实现类“图书”的DAO接口BookDao.java代码为:
package org.dao;
import org.vo.Book;
public interface BookDao {
//保存图书信息
public void addBook(Book book);
//删除图书信息
public void deleteBook(String ISBN);
//修改图书信息
public void updateBook(Book book);
//查询图书信息
public Book selectBook(String ISBN);
}
BookDao的实现类BookDaoImpl.java代码。
12.2 编写DAO接口及实现类12.2 编写DAO接口及实现类“读者”的DAO接口StudentDao.java代码为:
package org.dao;
import org.vo.Student;
public interface StudentDao {
public Student selectStudent(String readerId); //查询读者信息
}
StudentDao接口的实现类StudentDaoImpl.java代码。
12.2 编写DAO接口及实现类12.2 编写DAO接口及实现类“借书”接口LendDao.java代码为:
package org.dao;
import java.util.List;
import org.vo.Book;
import org.vo.Lend;
import org.vo.Student;
public interface LendDao {
//分页查询指定借书证号的读者所借图书的信息
public List selectBook(String readerId,int pageNow,int pageSize);
//查询指定借书证号的读者所借图书的总数
public int selectBookSize(String readerId);
//借书
public void addLend(Lend lend,Book book,Student student);
//根据图书ID查询Lend信息
public Lend selectByBookId(String bookId);
//根据图书ISBN查询Lend信息
public Lend selectByBookISBN(String ISBN);
}
LendDao接口的实现类LendDaoImpl.java代码。
12.3 功能实现12.3 功能实现准备工作完成以后,就可以开始实现功能了。Struts 2框架的类库添加及web.xml的修改前面已经做好准备,这里还需要建立struts.xml文件的大致框架,以便后面的功能实现时往里面配置action:
...//这里添加action配置
12.3.1 “登录”功能的实现12.3.1 “登录”功能的实现首先,“登录”界面为主界面,如图12.13所示。图12.13 登录的主界面12.3.1 “登录”功能的实现12.3.1 “登录”功能的实现在head.jsp中登录功能的部分代码如下:
|
|
|
|
12.3.1 “登录”功能的实现12.3.1 “登录”功能的实现提交到了“login.action”,在struts.xml文件中action配置为:
/index.jsp
/index.jsp
Action类LoginAction.java实现。
12.3.2 “查询已借图书”功能的实现12.3.2 “查询已借图书”功能的实现要“查询已借图书”,首先要进入到“借书”功能的页面,如图12.14所示,界面实现代码见第7章的7.4.1节的“lend.jsp”。
图12.14 借书的主界面12.3.2 “查询已借图书”功能的实现12.3.2 “查询已借图书”功能的实现在输入借书证号后,单击“查询”按钮,查询出该读者的所有借书信息,如输入“081101”,出现如图12.15所示的界面。
图12.15 查询已借图书页面12.3.2 “查询已借图书”功能的实现12.3.2 “查询已借图书”功能的实现该功能的页面提交借书证号代码为:
12.3.2 “查询已借图书”功能的实现12.3.2 “查询已借图书”功能的实现提交到了“selectBook.action”,相应地在struts.xml中的配置为:
/lend.jsp
LendAction.java中实现的方法代码。
12.3.2 “查询已借图书”功能的实现12.3.2 “查询已借图书”功能的实现在第7章中,查询出来的结果在页面中遍历后,利用“lend.java”模型来输出,代码为:
12.3.2 “查询已借图书”功能的实现12.3.2 “查询已借图书”功能的实现只要把上面的代码修改为:
12.3.3 “借书”功能的实现12.3.3 “借书”功能的实现在某读者查询过已借的图书信息后,就可以继续借书了,输入正确的ISBN及图书ID后,单击“借书”按钮,就可以完成借书操作,如图12.16所示。
图12.16 借书成功页面12.3.3 “借书”功能的实现12.3.3 “借书”功能的实现借书功能的页面代码。
这里做了一个判断,前面也已经讲解过,若“readerId”没有值就让输入框不可编辑,这是因为如果没有“readerId”就不知道谁要借书了。当输入了借书证号查询过后,此时“readerId”就有值了,输入图书的ISBN及图书ID,就可以单击“借书”按钮,请求提交到“lendBook.action”,struts.xml中的相应配置为:
/lend.jsp
在LendAction.java中的方法实现。
12.3.4 “图书管理”功能的实现12.3.4 “图书管理”功能的实现图书管理的界面如图12.17所示,页面实现代码与第7章7.5.1中给出的“bookmanage.jsp”相同。
图12.17 图书管理界面12.3.4 “图书管理”功能的实现12.3.4 “图书管理”功能的实现该界面实现了图书的增、删、改、查功能,在逐一介绍之前,先回顾一下该表单的内容。
1.图书追加
图书追加,是向数据库中添加数据,页面的提交代码为:
在提交标签中定义了“method”属性,指定了该请求应用的Action类中的方法为“addBook”,故当4个按钮都提交给“book.action”时,在指定的Action类中就可以找到相应的方法进行处理。struts.xml中的配置为:
/bookmanage.jsp
/bookmanage.jsp
*
addBook,updateBook
BookActon..java中相应的处理方法的代码。
12.3.4 “图书管理”功能的实现12.3.4 “图书管理”功能的实现2.图书删除
图书删除也是提交给“book.action”,在提交标签中定义使用的方法:
直接在BookAction.java中编写方法即可:
public String deleteBook() throws Exception{
//判断要删除的ISBN是否存在,即是否存在该书籍
if(book.getISBN()==null||book.getISBN().equals("")){
this.setMessage("请输入ISBN号");
return SUCCESS;
}else if(bookDao.selectBook(book.getISBN())==null){
this.setMessage("您输入的ISBN号不存在");
return SUCCESS;
}else if(new LendDaoImpl().selectByBookISBN(book.getISBN())!=null){
this.setMessage("该图书已经被借出,故不能删除图书信息!");
return SUCCESS;
}
bookDao.deleteBook(book.getISBN());
this.setMessage("删除成功!");
return SUCCESS;
}
12.3.4 “图书管理”功能的实现12.3.4 “图书管理”功能的实现3.图书查询
同样,图书查询也是提交到“book.action”,提交标签中定义为:
对应的BookAction.java中的方法为:
public String selectBook() throws Exception{
Book b=bookDao.selectBook(book.getISBN());
if(b==null){
this.setMessage("不存在的ISBN号");
return SUCCESS;
}
Map request=(Map) ActionContext.getContext().get("request");
request.put("onebook", b);
return SUCCESS;
}
12.3.4 “图书管理”功能的实现12.3.4 “图书管理”功能的实现当然,由于查询中要读取照片,所以在BookAction中还要定义读取照片的“getImage”方法:
public String getImage() throws Exception{
HttpServletResponse response = ServletActionContext.getResponse();
String ISBN=book.getISBN();
Book b=bookDao.selectBook(ISBN);
byte[] photo = b.getPhoto();
response.setContentType("image/jpeg");
ServletOutputStream os = response.getOutputStream();
if ( photo != null && photo.length != 0 ){
for (int i = 0; i < photo.length; i++){
os.write(photo[i]);
}
os.flush();
}
return NONE;
}
12.3.4 “图书管理”功能的实现12.3.4 “图书管理”功能的实现4.图书修改
图书修改和图书添加差不多,区别在于图书修改一般要先根据ISBN查询出对应的图书信息,然后在其基础上进行修改,提交按钮的代码为:
对应的BookAction.java中的方法。
在图书添加及图书修改时,为了防止提交空数据,应用了验证框架对其进行验证,“BookAction-validation.xml”文件。