1、项目三 网上商城商品的显示与查询,3. 任务实施 (1)任务1 网上商城商品信息实体分析与设计 (2)任务2 完成网上商城商品信息的查询 (3)任务3 实现网上商城商品信息的分页显示,2. 相关知识 (1)Java Bean 基础 (2)Java Bean的使用 (3)Java Bean的设计 (4)数据库分页设计,1. 项目引入,课程目标,理解JavaBean的概念和特点,掌握编写、编译、调试、布置Bean的方法; 掌握表单与Bean的交互方法;程序片中使用JavaBean的方法; 掌握数据库分页技术。,能力目标,能熟练部署JavaBean,能编写JavaBean,并利用JavaBean实现
2、对网上商城中商品数据库的访问。 实现网上商城商品信息的分页显示。,项目引入,商品显示是商品展现的一种方式,客户登陆网站后首先看到的商品的分类,客户可以点击分类查询各种分类 商品的信息。商品检索是方便客户使用的一种功能,客户可以输入单个条件查询商品信息,也可以通过复合查询商品信息。本项目主要内容是利用Java Bean技术完成网上商城中商品的显示与查询。,2018/11/16,5,商品显示与检索业务流程分析,2018/11/16,6,商品显示与检索业务流程分析,任务3.1 商品信息实体分析与设计,【步骤】(1)分析后台管理相关实体,得到商品信息实体; (2)设计商品信息实体属性,详见表3-1;
3、(3)创建数据库,将上述实体转换成实际存储的表; (4)利用Java技术完成数据库的连接; (5)利用JavaBean技术完成商品信息实体类的建立。,任务3.1商品信息实体分析与设计,表3-1 goods表,3.1.1 任务相关知识点,(1)JSP+JavaBean开发模式 (2)JavaBean设计规范 (3)创建与布署JavaBean,3.1.1 相关知识JavaBean基础知识,2018/11/16,10,项目2中开发模式存在的问题分析及解决方法: Jsp页面由html和Java程序片组成,如果程序片和Html大量混在一起,就显得页面混杂,不易维护。 Jsp页面将数据的处理过程指派给一个
4、或几个beans来完成。一方面减少代码量,另一方面容易维护。 使用JSP+JavaBean开发模式,实现页面与数据处理真正地分离。 什么是JavaBeanJavaBean是Java程序设计中的一种组件技术。Sun公司把JavaBean定义为一个可重复使用的软件组件,类似于电脑CPU、硬盘等组件。从程序员编程的角度看,实际上JavaBean组件就是Java开发中的一个类,通过封装属性和方法成为具有某种功能和接口的类,简称Bean。,3.1.1 相关知识JavaBean基础知识,2018/11/16,11,JavaBean规范 编写JavaBean必须满足以下几点: JavaBean类必须有一个无
5、参构造方法,用于使用实例化JavaBean类时调用; 所有JavaBean必须放在一个包中; JavaBean必须声明成public class类型文件名称与类名称一致; 所有的属性必须封装即申明为private; 设置和取得属性可以通过setXxx、getXxx方法。即:set和get方法名称与属性名称之间必须对应,也就是:如果属性名称为xxx,那么set和get方法的名称必须为setXxx()和getXxx()。,3.2.1 相关知识在JSP中使用JavaBean,2018/11/16,12,Java命名规范: 包命名:全部字母小写:cn.mldn.lxh 类命名:单词的首字母大小:Sim
6、pleBean 属性名称:第一个单词的首字母小写,之后每个单词的首字母大写:studentName; 方法命名:与属性命名相同:public void sayHello(); 常量命名:全部单词大写:final String DBDEIVER=”NLDN”,3.2.1 相关知识在JSP中使用JavaBean,2018/11/16,13,举例:在项目2的基础上进行修改,创建项目user login及其UserBean.java;创建辅助类DBConn.java实现与用户数据库的连接。,LoginCl.jsp 验证用户,Login.jsp 用户登录界面,wel.jsp 欢迎界面,登录请求,不合法,
7、合法,数据库 (user表),Model1模式(jsp+javaBean),userBeanCljava (业务逻辑),userBean.java 表示user表,ConnDB.java 得到连接,界面(Veiw),模型(Model),操作数据库,调用,分页请求,分页请求,分页处理,3.1.1 相关知识JavaBean基础知识,2018/11/16,14,举例:UserBean定义格式如下: package com.lx.model; /必须创建包 public class UserBean private String userName; /私有的属性private String passW
8、ord;public UserBean() /构造函数公共且无参public String getUsername() /一组set、get方法return username;public void setUsername(String username) this.username = username;public String getPassword() return password;public void setPassword(String password) this.password = password; ,3.1.1 相关知识JavaBean基础知识,2018/11/16,
9、15,举例:辅助类DBConn.java : package com.lx.model; import java.sql.*; public class DBConn private Connection ct=null;public Connection getConn()tryClass.forName(“sun.jdbc.odbc.JdbcOdbcDriver“);ct=DriverManager.getConnection(“jdbc:odbc:student“,“sa“,“sa“);catch(Exception e)e.printStackTrace();return ct;,3.
10、1.1 相关知识JavaBean基础知识,2018/11/16,16,创建与布署JavaBean:1. 借助Java开发工具(如MyEclipse),按Bean的规范创建Bean;2. 为了让Tomcat6.0找到JavaBean类,类文件必须保存在特定的目录中:即当前Web服务目录中WEB-INFclasses子目录下。WEB-INF结构如下: userlogin /项目名即WEB服务目录|WEB-INF|classes/:此目录存储会用到的Java类(.class)|lib/:此目录存储Web程序会用到的第三方jar文件|web.xml:此文件为网站结构部署描述符,记载每个网站程序的设定
11、注意:Tomcat服务器,在默认情况下是不能读取修改后的JavaBean, 必须重新启动服务器 观察项目userlogin,并发布该项目,在发布目录中查看UserBean.class及DBConn.class类文件所在目录。,2018/11/16,17,3.1.2 任务实施,完成以下任务: 1. 仿照userlogin项目完成本项目ConnDB.java设计,实现 数据库的连接 2. 完成GoodsBean的设计。 3. 具体代码实现参见项目:goodsmanager,GoodsShowCl.jsp 处理控制,Index.jsp 商品浏览,GoodsShow.jsp 查询结果显示,分页请求,分
12、页显示,查询成功,数据库 (goods表),Model1模式(jsp+javaBean),goodsBeanCljava (业务逻辑),goodsBean.java 表示goods表,Conn DB.java 得到连接,界面(Veiw),模型(Model),操作数据库,调用,查询请求,任务小结,(1)JSP+JavaBean开发模式 (2)JavaBean设计规范 (3)创建与布署JavaBean,2018/11/16,18,课后习题,思考题(1) 纯JSP模式与JSP+JavaBean模式的区别? (2) 在创建JavaBean时,要注意些什么? (3) 如何布署JavaBean?,任务3.
13、2 商品信息的查询,本任务主要是在上一任务的基础上完成网上商城中商品信息的查询,如查找成功,则在查询结果显示页面,显示该商品的详细内容,不成功则返回到商品浏览主页面。,3.2.1 任务相关知识点,(1)在JSP中使用JavaBean对象 (2)JSP中获取JavaBean属性值 (3)JSP中设置JavaBean属性值,3.2.1 相关知识在JSP中使用JavaBean,2018/11/16,22,在JSP中使用JavaBean :1. 使用 导入命令:如Java程序中一样,通过创建JavaBean对象,调用其相关方法来使用Bean.具体实现参见userlogin项目中的loginCL.jsp
14、,3.2.1 相关知识在JSP中使用JavaBean,2018/11/16,23,在JSP中使用JavaBean对象 :2. 使用JSP的动作标签:在JSP中专门提供了三个动作标签来与JavaBean交互,分别是:、(1) 在JSP中使用JavaBean对象: / 对象所属的包.类名称路径或: ,3.2.1 相关知识在JSP中使用JavaBean,2018/11/16,24,在JSP中使用JavaBean对象:scope:指定JavaBean的作用范围,有4种取值类型: Page:JavaBean只能在当前页面中使用。JSP页面执行完毕后,该JavaBean将会被进行垃圾回收。 Request
15、 :除了当前网页之外,当使用或标签跳转到下一页时,亦可以存取到原来的网页产生的JavaBean。 Session:该bean的有效期是客户的会话期间,也就是说,如果客户在多个页面中相互连接,每个页面都含有一个useBean标签,这些useBean标签的id的值相同,并且scope的值都是session,那么该客户在这些页面得到的beans是相同的。如果客户改变了某个页面beans的属性,其它页面的这个beans的属性也将发生变化。 Application:只要服务器不重新启动开机,它就一直存在服务器内存中。在当前整个Web应用的范围内有效,但占有过量的内存。 应用举例: page:(pageJ
16、BDemo01.jsp 、pageJBDemo02.jsp ) Request:(requestJBDemo01.jsp 、requestJBDemo02.jsp) Session:(sessionJBDemo01.jsp、sessionJBDemo02.jsp),3.2.1 相关知识在JSP中使用JavaBean,2018/11/16,25,在JSP中使用JavaBean :(2)JavaBean属性的取得方法可以用动作标签取得JavaBean中的属性,并且以字符串的形式显示给用户。在使用之前,必须使用标签获得一个Bean。格式如下:或: 注意:name属性值与中的id属性值相同,用来指定要
17、获取的是哪个Beans的属性值;property取值是该beans的一个属性的名字。,3.2.1 相关知识在JSP中使用JavaBean,2018/11/16,26,当需要指定某个属性设置内容的时候,可以在property中指定参数:自动匹配:可以根据自己的需要,设置需要的属性 :可以根据自己的需要,任意选择传递的参数,其中property指定Bean中的属性名,param指定request中的参数名,如果Bean属性和request参数的名字不同,就必须指定。 :根据用户的需要,自己设置参数的值,如果输入的值是一个变量,则需要用表达式输出。注意:使用JavaBean的setProperty方
18、法,可以自动将传递过来的只有数字的字符串,变为整型,之后将内容赋值给具体的属性很智能,3.2.1 相关知识在JSP中使用JavaBean,2018/11/16,27,在JSP中使用JavaBean :(3)JavaBean属性的设置方法JSP提供了四种方法设定JavaBean的属性值。 :自动匹配 :可以根据自己的需要,设置需要的属性 :可以根据自己的需要,任意选择传递的参数,其中property指定Bean中的属性名,param指定request中的参数名,如果Bean属性和request参数的名字不同,就必须指定。:根据用户的需要,自己设置参数的值,如果输入的值是一个变量,则需要用表达式输
19、出。/注意:name属性值与中的id属性值相同。,(3)JavaBean属性的设置方法通过Http表单的参数来设置beans的所有属性的值:(反射机制) 要求:表单参数的名字必须与beans属性的名字相同,Jsp引擎会自动将字符串转换为beans属性的类型。例如 logincl1.jsp、login.html 注意:只有提交了和该beans相对应的表单后,该指令标签才被执行,2018/11/16,28,3.2.1 相关知识在JSP中使用JavaBean,3.2.1 相关知识在JSP中使用JavaBean,2018/11/16,29,分析属性自动匹配的原理: 为什么能够通过property=”*
20、”的方法,将内容设置到Bean中,其根本原因是使用Java的反射机制,根据传递参数的名称找到相应的方法(注意:此参数是指表单中请求的参数),比如:参数名称为name,则自动找到setName方法 原则:使用JavaBean自动设置内容时,一定要让参数名称与Bean中的属性名称一致,这样通过Java的命名规范,可以达到统一。,(3)JavaBean属性的设置方法 通过Http表单的参数来设置beans的相应属性的值:(反射机制) 要求:request参数的名字必须与beans属性的名字相同。例如: logincl2.jsp 、login.html 注:只有提交了和该beans相对应的表单后,该指
21、令标签才被执行。,2018/11/16,30,3.2.1 相关知识在JSP中使用JavaBean,(3)JavaBean属性的设置方法 将通过request的参数值来设定beans相应属性的值 要求:request参数的名字可以与beans属性的名字不相同。例如: logincl3.jsp、 login1.html 注:只有提交了和该beans相对应的表单后,该指令标签才被执行。,2018/11/16,31,3.2.1 相关知识在JSP中使用JavaBean,(3)JavaBean属性的设置方法 将beans的属性设置为一个表达式的值或字符串 Beans的属性的值设置为一个表达式的值: ” /
22、 Beans的属性的值设置为一个字符串:注:如果表达式的值设置为beans属性的值,表达式值的类型必须和beans属性的类型一致。如果将字符串设置为beans属性的值,这个字符串会自动转换为beans属性的类型。修改logincl3.jsp、 login1.html 结合以上案例,讨论JavaBean的作用域。(分别将scope的属性改为不同的值,看一下在login_success.jsp中能否取得JavaBean的属性值),2018/11/16,32,3.2.1 相关知识在JSP中使用JavaBean,2018/11/16,33,3.2.2 任务实施,GoodsShowCl.jsp 查询处理
23、控制,Index.jsp 商品浏览,GoodsShow.jsp 查询结果显示,分页请求,分页显示,查询成功,数据库 (goods表),Model1模式(jsp+javaBean),goodsBeanCljava (业务逻辑),goodsBean.java 表示goods表,Conn DB.java 得到连接,界面(Veiw),模型(Model),操作数据库,调用,查询请求,3.2.2 任务实施,完成以下任务: 仿照用户登录管理项目中用户登录验证的方法,完成网上商城中商品信息的查询: 1. GoodsShowCl.jsp设计,当用户根据商品ID号要查询某个具体的商品时, GoodsShowCl首
24、先通过GoodsBeanCL业务逻辑进行查询,如果存在该商品,则返回成功信息,并跳转到GoodsShow.jsp进行显示。否则给出提示信息:此商品不存在,同时返回查询页,等待下一步的操作。 2. GoodsShow.jsp的设计,该页用于显示某一具体的商品。 3. 完成GoodsBeanCL.java的设计,此处完成信息查询处理。 4. 具体代码实现参见项目:goodsmanager,2018/11/16,34,任务小结,(1)JSP中JavaBean有两种不同的使用方法。 (2)JavaBean对象有不同的作用域,理解各不同的作用域下的区别。,2018/11/16,35,课后习题,思考题(1
25、) JavaBean如何使用? (2) 如何取得JavaBean的属性值? (3) 如何设置JavaBean的属性值? (4) 理解JavaBean对象的作用范围。,任务3.3 商品信息的分页显示,本任务主要是在上一任务的基础上完成网上商城中商品信息的分页显示,当首次登录商城主页时,只显示第一页的内容,之后根据用户的选择,显示指定页的内容,在进行分页显示时,由GoodsBeanCL与数据库连接,获得该页要显示的内容,即结果集,并将每条记录的信息封装成一个GoodsBean对象,放入集合ArrayList中,最后由GoodsBeanCL返回ArrayList对象给商城主页,显示这一页上要显示的内
26、容。,3.3.1 任务相关知识点,(1)分页算法的描述 (2)集合类ArrayList及应用,3.3.1 相关知识分页显示处理,2018/11/16,39,1.分页算法: 分页:是由于记录太多,不能在一个页面中显示 我们需要定义四个变量,它们有各自的用处 int pageSize:每页显示多少条记录 int pageCount:一共有多少页 int pageNow:希望显示第几页 int rowCount:一共有多少条记录 说明: pageSize是指定的,pageNow是用户选择的 rowCount是从表中查询得到的 pageCount是计算出来的,该计算式为 if(rowCount%pag
27、eSize=0)pageCount=rowCount/pageSize; elsepageCount=rowCount/pageSize+1; ,3.3.1 相关知识分页显示处理,2018/11/16,40,1.分页算法:我们使用如下select语句获得某页要显示的记录集:select top pageSize 字段名列表 from 表名 where id not in ( select top pageSize*(pageNow-1) id from 表名)以我们前面的users表为例,显示第2页,该查询语句就是: select top 3 * from users where userId
28、 not in (select top 3 userId from users),3.3.1 相关知识分页显示处理,2018/11/16,41,2. ArrayList类:实现大小可变的数组列表。是一个集合类,相当于一个容器,可以加入一个个的对象。它是java.util包中的类。 常用的方法: (1) public ArrayList()-构造方法构造一个初始容量为 10 的空列表。 如 ArrayList al = new ArrayList(); (2) public int size() 返回此列表中的元素数。 如 int count=la.size();,3.3.1 相关知识分页显示处
29、理,2018/11/16,42,常用的方法: (3) public boolean add(E e) 将指定的元素添加到此列表的尾部。如:UserBean ub = new UserBean();ub.setUserId(1);ub.setUsername(“aa”);ub.setPasswd(“123”);ub.setGrade( 2);al.add(ub); / 将ub放到arrayList中 (4) public E get(int index) 返回此列表中指定位置上的元素。 如: UserBean ub =al.get(0); (5) public E remove(int inde
30、x) 移除此列表中指定位置上的元素。向左移动所有后续元素(将其索引减 1)。 如:al.remove(0);,3.3.1 相关知识分页显示处理,2018/11/16,43,为什么在UserBeanCl中我们返回ArrayList集合,而不是直接返回ResultSet? 1.如果返回ResultSet,那么我们在使用ResultSet时,是不能关闭与该ResultSet相互关联的数据库连接等资源,从而造成资源浪费。 2. 如果返回ResultSet,我们只能使用rs.getInt(?),rs.getString(?).这样的方法来得到结果,代码的可读性不好,维护不方便。,DB,rs,3.打包结果
31、集: 将该页要显示的所有记录进行打包:生成一个ArrayList对象,以用户登录处理项目为例,将该页要显示的用户放在ArrayList集合对象中。,3.3.1 相关知识分页显示处理,2018/11/16,44,根据前面的说明,我们可以利用集合比如:ArrayList作为中转, 这样,就可以尽快的关闭数据库连接。同时更能体现面向对 象编程,代码的可读性更好 1号线将rs中的每条记录,封装成一个UserBean对象ub 2号线将封装成的每一个UserBean对象ub放入到ArrrayList集合中,利于 管理。,DB,UsersBean ub,UsersBean ub,ArrayList al,1
32、,2,rs,2018/11/16,45,应用举例:在userlogin项目中,当用户成功登录后,进入欢迎页面,进行分页请求,由userBeanCL进行分页处理,并将结果返回给wel.jsp进行显示。具体代码参见user login项目。,3.3.1 相关知识分页显示处理,2018/11/16,46,3.3.2 任务实施,GoodsShowCl.jsp 处理控制,Index.jsp 商品浏览,GoodsShow.jsp 查询结果显示,分页请求,分页显示,查询成功,数据库 (goods表),Model1模式(jsp+javaBean),goodsBeanCljava (业务逻辑),goodsBea
33、n.java 表示goods表,Conn DB.java 得到连接,界面(Veiw),模型(Model),操作数据库,调用,查询请求,3.3.2 任务实施,完成以下任务: 仿照用户登录管理项目中分页处理的方法,完成网上商城中商品信息的分页显示: 1.完成 index.jsp页面设计,并实现分页显示功能。 2.完成GoodsBeanCLjava中分页处理的代码设计。 3. 具体代码实现参见项目:goodsmanager,2018/11/16,47,任务小结,了解分页显示的算法 掌握实现分页显示中所用的集合技术 通过实例真正掌握数据分页显示技术。,2018/11/16,48,课后习题,思考题 (1) 如何获得总的要显示的页数? (2) 如何获得某面要显示的内容? (3) 如何对要显示的内容进行封装?为什么要封装?,