ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:80.01KB ,
资源ID:20261766      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/20261766.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第 5 章 结合javabean实现CRUD.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第 5 章 结合javabean实现CRUD.docx

1、第 5 章 结合javabean实现CRUD第5章结合javabean实现CRUD注意这里介绍的是在jsp中使用自己写的javabean,不过这种写法也仅仅适用于小型应用,只打算学两下jsp玩玩的朋友可以到此为止了,完成了这章就不必继续下去了,此后难度会加大不少。如果你不满足以下任一条件,请继续阅读,否则请跳过此后的部分,进入下一章:第6章 贴近servlet。1. 了解如何在jsp中使用自定义的javabean。2. 了解一些jsp动作(action)。3. 使用jdbc操作数据库。5.1.概念和命名方式需要提及的两个名词概念:1. CRUD是Create(创建)、Read(读取)、Upda

2、te(更新)和Delete(删除)的缩写,一般应用有这四项也就足够了。我们这里的例子是对联系人信息进行CRUD操作。2. javabean是把一些操作集合在一起写成一个java类,想要进行什么操作直接调用这个类里的方法就行。咱们这里使用javabean的地方有两处,一个是链接数据库并进行CRUD操作,另一个把每条数据都写 成一个类。对于CRUD应用,有一些大家默认的命名来表示不同的操作。1. list.jsp。读取所有信息并显示到页面上,这个是CRUD中Read(读取)。2. create.jsp。进入添加联系信息的页面,等待用户输入信息。save.jsp。接收用户提交的信息,添加到数据库中。

3、这两步对应CRUD中的Create(创建)。3. edit.jsp。进入修改联系信息的页面,等待用户修改信息。update.jsp。接收用户提交的信息,修改数据库中对应的信息。这两步对应CRUD中的Update(更新)。4. remove.jsp。删除用户选择的信息。这步对应CRUD中的Delete(删除)。下面我们将按照用户浏览的顺序对这些页面进行介绍。5.2.Read(读取)启动服务器,访问http:/localhost:8080/05-01/就会看到联系信息列表。看一下05-01目录里边的7个jsp页面,其中6个页面都已经介绍了,只剩index.jsp。index.jsp是tomcat默

4、认的索引页面,在用户访问http:/localhost:8080/05-01/的时候会自动执行index.jsp,但我们更希望用户能直接进入list.jsp页面看到所有的联系方式,所以在index.jsp里使用forward跳转到list.jsp。 第一行是我们曾经讲过的设置中文编码。第二行叫做jsp action(jsp动作),它的写法和html标签很相像,有了它们我们可以节省很多java代码。比如,这个jsp动作就与下面的代码功能相同。 从长度来看,jsp动作明显占有绝对优势,在单独使用forward的时候,建议大家优先考虑的写法。现在来看list.jsp里的内容,我们是如何获得这些联系信

5、息,并把这些联系信息显示到页面上。为了便于操作,我们将所有对数据库的操作都封装到anni.ContactDao中,这就是所谓的javabean了。现在我们想要获得所有联系信息时,只要创建一个ContactDao的实例,然后调用contactDao.getAll()获得装满联系信息的List列表就好了。在创建ContactDao实例的时候,我们使用了另一个jsp动作:jsp:useBean,它就写在list.jsp的第二行。 看到这里,可能有朋友提问了,既然只是创建一个对象的实例,为什么不用new呢,那要比这样写的代码少许多,也更容易理解,为什么我们还要执意使用jsp:useBean?只是为了尝

6、试新技术吗?这里我提醒大家注意一下标签中的scope=application,application正是我们介绍过的四个作用域之一,既然有了这个属性就说明事情没有new这么简单了,实际上正因为scope的属性,这段jsp:usebean实际上等价于下面的代码。 它会先去scope定义的作用域application中取得contactDao对应的对象,这个contactDao正是标签中定义的id,转换的对象类型则是标签中class属性的值。好的,我们先从application中获得contactDao对应的对象,然后判断得到的是否为null,如果为null说明此变量还没有初始化,这时就要使用ne

7、w创建一个对象实例并放入application中。最后我们得到的就是这个contactDao实例。现在我们得到了一个contactDao实例,并把它放到application作用域中,供所有用户公用,通过使用jsp:useBean,我们下面就可以直接使用它获得需要的数据。% List list = contactDao.getAll(); for (int i = 0; i $contact.username $contact.sex $contact.email $contact.qq $contact.descn 修改 | 删除 首先我们调用contactDao.getAll()获得联系信

8、息的List列表,然后使用for循环将这些信息都输出到页面。下面的操作比较有趣,我们每获得一条信息就把它放入pageContext中。之所以这样做,是为了在下面使用el表达式显示信息。el表达式的一个特点就是必须放到作用域里才能调用,如果使用Contact contact = (Contact) list.get(i);而不放到pageContext中,后面的$contact.username就无法找到contact了。这里还要提及el表达式的进一步用法,$contact.username实际上得到的是contact.getUsername()返回的结果。这里有一个默认的转换规则,假设有一个g

9、etUsername()方法,我们先要去掉开头的get,然后将get后的那个字母小写,得到的username就是与el表达式中对应的部分。有趣的是$contact.username仅仅与getUsername()方法对应,无论contact有没有String username这个变量。如果我们想使用$contact.nameAndSex,只要写一个public String getNameAndSex()方法返回我们想要的数据即可,不需要添加String nameAndSex;变量。另一个放到pageContext中的row就很直观了,我们根据行数的奇偶来决定当前行使用的css样式,这样就可以

10、显示出斑马线的效果了,这项功能并非必要,只是为了娱乐。5.3.Create(创建)选择list.jsp中的“添加联系信息”,即进入create.jsp添加信息页面。create.jsp中没有包含java,它提供给用户一个输入信息的表单,用户填写过信息后就能点击提交按钮,将数据提交给save.jsp处理。save.jsp中与create.jsp相反,里边只有处理数据的java代码,没有显示的内容。 jsp:useBean的用处我们已经了解了,先从application中取出contactDao,再创建一个contact。在创建contact的时候没有指定scope,默认情况下只会使用new创建这

11、个局部变量,不会对任何作用域产生影响。jsp:setProperty是新事物了,它的作用就是为某个javabean设置数据。之前我们已经使用jsp:useBean创建了一个contact实例,现在我们通过name=contact设置这个实例的数据,property可以指定一个属性,比如property=username,也可以使用星号(*)批量设置所有可以找到的属性,这个jsp动作实际上与下面的代码等价。contact.setUsername(request.getParameter(username);contact.setSex(request.getParameter(sex);cont

12、act.setEmail(request.getParameter(email);contact.setQq(request.getParameter(qq);contact.setDescn(request.getParameter(descn); 这些数据都是由create.jsp提交过来的,只要它们的名称与contact中的方法对应(这次是set开头的方法了),jsp:setProperty就可以自动为它们进行赋值,转换的规则与get的方法名是类似的。通过这一系列的jsp动作,我们得到的contact中已经设置好了用户刚刚填写的数据,现在只要进行保存就好了。contactDao.save

13、(contact);response.sendRedirect(list.jsp); contactDao.save()也已经封装好了,直接调用便完成添加功能。操作完成后记得要调用sendRedirect,将页面重定向到list.jsp,查看添加后的结果。5.4.Update(更新)点击列表右侧的“修改”,对这一行显示的联系信息进行修改。虽然页面的布局与create.jsp基本相同,但为了预先显示需要修改的数据,我们需要根据请求中的id值,去数据库中查找对应的联系信息,再显示到jsp中。点击“修改”的时候,id便附加到url后了。修改 edit.jsp中获得id的值,根据id从contactD

14、ao获得对应的联系信息contact,再将contact放到pageContext供后面的el表达式使用。 在html中显示信息的时候,直接使用el表达式,如果属性值不存在,el也会自动输出空字符串,这对我们来说都是非常便捷的。 edit.jsp中还有一点儿隐藏的玄机,表单中定义了一个名叫id的隐藏属性,这样服务器才能知道我们需要修改那一条数据。 既然是隐藏的,我们便不能在页面上看到它,但在提交的时候它还会与其他数据一起发送到服务器。修改信息之后,点击提交发送请求。update.jsp中与save.jsp相似,唯一不同的是这次我们调用的是contactDao.update()而不是contac

15、tDao.save()。contactDao.update(contact); update()会根据id的值修改数据库中对应的数据,而不是添加一条新数据,这从跳转后的list.jsp可以看出来。5.5.Delete(删除)点击列表右侧的“删除”,就会删除这条数据。remove.jsp与修改数据时一样,都需要传递一个id来指定要操作哪一条记录。删除 remove.jsp依然没有任何显示,仅仅使用java操作。 因为只需要id和contactDao,remove.jsp的代码十分单纯,首先从request中获得id,然后删除id对应的记录,最后页面重定向到list.jsp。删除便成功了。5.6.

16、用jdbc操作数据库虽然有人说JDBC是Java Database Bridge Connection(java数据库桥接)的缩写,但sun公司一直没有承认这种解释。不过jdbc确实是一种桥接方式,所有服务器厂商都为jdbc提供对应自己数据库的驱动,我们只要学会使用jdbc中的类和方法,就可以通过它操作任何一款数据库了。这次我们使用的是一个名叫hsqldb的嵌入型数据库,它是使用java编写的,把hsqldb-1.8.0.7.jar放到WEB-INF/lib/目录下就可以使用了。现在看我们是如何连接数据库的,hsqldb-1.8.0.7.jar中已经为我们提供了jdbc驱动,为了方便调用我们将

17、jdbc的配置封装在anni.DbUtils中。1. Class.forName(org.hsqldb.jdbcDriver);加载jdbc驱动。Class.forName()是惯用写法,可以强制加载指定的类,org.hsqldb.jdbcDriver是hsqldb驱动的名称,只需要记忆即可。2. 与数据库建立连接。3. DriverManager.getConnection(jdbc:hsqldb:res:/hsqldb/contact, sa, ); 三个参数分别是连接数据库使用的url,登录用户名和密码。url以jdbc:hsqldb:开头,表明它将使用hsqldb的驱动,后面的res:

18、/hsqldb/contact是hsqldb的一种连接方式,它将去classpath下的hsqldb目录中读取名为contact的数据库文件作为初始配置,在这里classpath就是指的WEB-INF/classes/,你可以在WEB-INF/classes/hsqldb/下看到两个数据库文件,contact.properties和contact.script。4. 数据库连接十分消耗系统资源,一定要记得在使用完成后关闭,一旦忘记关闭,资源很快就会耗尽,你会得到一连串无法连接数据库的错误。anni.DbUtils中我们提供了一个close()方法来关闭连接。完整的anni.DbUtils代码在

19、WEB-INF/src/DbUtils.java。数据库contact的表结构写在WEB-INF/sql/import.sql中。create table contact ( id bigint, username varchar(100), sex varchar(100), email varchar(100), qq varchar(100), descn varchar(200); 与之对应的anni.Contact的结构大致如下。package anni;public class Contact private Long id; private String username; pr

20、ivate String sex; private String email; private String qq; private String descn; / getter and setter javabean中的属性与数据库中的字段一一对应,习惯上将属性定义为private,并配上对应的getter与setter方法,这样就构成了一个典型的javabean。anni.Contact的源代码在WEB-INF/src/Contact.java。anni.ContactDao是完成CRUD操作的主体,在这里集合了anni.Contact和anni.DbUtils为jsp提供调用的方法。1.

21、 Read(读取)。2. /*3. * 获得所有联系簿.4. *5. * return contact列表6. */7. public List getAll() throws Exception 8. Connection conn = null;9. Statement state = null;10. ResultSet rs = null;11. 12. List list = new ArrayList();13. try 14. conn = DbUtils.getConn();15. state = conn.createStatement();16. rs = state.ex

22、ecuteQuery(select * from contact);17. 18. while (rs.next() 19. Contact contact = new Contact();20. contact.setId(rs.getLong(id);21. contact.setUsername(rs.getString(username);22. contact.setSex(rs.getString(sex);23. contact.setEmail(rs.getString(email);24. contact.setQq(rs.getString(qq);25. contact.

23、setDescn(rs.getString(descn);26. 27. list.add(contact);28. 29. finally 30. DbUtils.close(rs, state, conn);31. 32. return list;33. 第一步,使用DbUtils.getConn()建立与数据库的连接Connection。第二步,从Connection创建一个Statement。第三步,使用Statement执行sql查询语句,返回查询结果集ResultSet。第四步,将ResultSet中的数据转换成Contact队列。第五步,关闭数据库的连接,并返回Contact队列

24、作为结果。Connection - Statement - ResultSet - close()是一个查询功能的基本结构。这里使用的sql语句会获得数据库中所有的联系信息,所以我们循环读取ResultSet最后得到一个Contact队列。另一个方法public Contact get(Long id)中会根据指定的主键获得一条对应记录,虽然依然返回ResultSet,但这次ResultSet中只包含一条数据,所以最终只会获得一个Contact对象。34. Create(创建)35. /*36. * 向数据库插入一条数据.37. *38. * param contact 联系信息39. */4

25、0. public void save(Contact contact) throws Exception 41. Connection conn = null;42. PreparedStatement state = null;43. 44. try 45. conn = DbUtils.getConn();46. state = conn.prepareStatement(insert into contact(username,sex,email,qq,descn) values(?,?,?,?,?);47. state.setString(1, contact.getUsername();48. state.setString(2, contact.getSex();49. state.setString(3, contact.getEmail();50. state.setString(4, contact.getQq();51

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1