382第15章网上书店实例在本章中我们使用JSP和JavaBean来构建一个网上书店。本章介绍的例子可以分成两大部分,第一部分是普通程序,用于客户在网上选购图书,第二部分是管理程序,用于在服务器端处理客户的定单。客户端程序由以下几个部分构成:default.jsp:会员登录界面(首页);checklogon.jsp:检测登录代码和密码是否一致,根据由JavaBean返回的结果显示不同的信息。BuyerBean:会员的合法性检验所用的Bean;booklist.jsp:给登录会员显示当前书店中可供选择的图书;addcart.jsp:将所选的图书加入购物车;shoppingcart.jsp:查看购物车的内容;本例的数据库采用Access(.MDB数据库),对数据库的访问采用便于理解的JDBC-ODBC方式,在使用本例前先在本地数据库建立一个ODBC数据源:bookstore。设置步骤如下:(1)在开始-设置-控制面版(Win98、NT4.0)中选取“数据源(ODBC)”;在Win2000Professional和Server中分别位于“开始-设置-控制面版-管理工具”和“开始-程序-管理工具”下。(2)启动“数据源(ODBC)”配置程序,界面如图15-1所示。图15-1ODBC数据源管理界面(3)在图15-1中“系统DSN”选项下单击“添加”按钮,来添加一个系统的数据源(DSN),则出现如图15-2所示数据源驱动程序选择界面:383图15-2数据源驱动程序选择界面(4)在图15-2中选择“MicrosoftAccessDriver(*.mdb)”单击“完成”加载Access数据库的驱动,则出现如图15-3所示数据库ODBC安装界面:图15-3数据库ODBC安装界面(5)在图15-3中单击“选择(S)…”按钮,启动一个类似资源管理器的界面来选择数据库,如图15-4所示,在图15-4所示的界面中选择bookstore.mdb。图15-4数据库选择界面38415.1会员登录做一个网上书店,在顾客开始购书之前,必须要记录用户的一些信息以便用户在不同的分类、不同的页面购书时,最后能够去收款台统一结帐,而且网上书店同时有许多人在选购图书,也要求对不同的顾客进行区分,我们可以要求顾客在购书之前进行注册成为会员,以后只用会员代码和密码即可登录。为了便于说明现在的电子商务网站,由JSP做页面表现,由JavaBean做应用逻辑的结构,在本例中将会员登录程序分成两大部分:一、JavaBean用于对数据库的操作,验证用户名和密码是否正确;二、JSP页面部分,用于供用户会员代码和密码以及显示验证结果。15.1.1会员登录JavaBean我们网上书店中的会员信息的库结构如图15-5所示:图15-5会员信息库其中memberID是主键,用于区分不同的会员,新会员注册时只能使用没有被使用的用户代码。在验证时我们只要使用验证用户的memberID和其pwd是否一致即可判断该用户是否合法,如果合法则其登录次数加1。下面是用户验证部分的JavaBean的代码清单15-1BuyerBean.Java/**BuyerBean.Java1.10.2001*Copyright©2000,2001bycuugllp.*本Bean中有两个set方法和两个get方法:*setMemberID()—对BuyerBean中的memberID属性进行赋值;*setPwd()—对BuyerBean中的pwd属性进行赋值;*getLogontimes()—取该会员登录的次数*getMenberName()获得该会员的真实姓名,用于显示欢迎信息。*main()方法用于将BEAN作为一个Application进行测试时使用,正式发布时可以删除。385**/packagecuug;importJava.sql.*;publicclassBuyerBean{privateStringmemberID=null;//会员IDprivateStringmemberName=null;//会员姓名privateStringpwd=null;//密码privateintlogontimes=-1;//登录的次数privatestaticStringstrDBDriver=“sun.jdbc.odbc.JdbcOdbcDriver”;//JDBC驱动privatestaticStringstrDBUrl=“jdbc:odbc:bookstore”;//数据源,privateConnectionconn=null;//连接privateResultSetrs=null;//结果集publicBuyerBean(){//加载JDBC-ODBC驱动try{Class.forName(strDBDriver);}//捕获异常catch(Java.lang.ClassNotFoundExceptione){System.err.println(“BuyerBean():”+e.getMessage());}}//获得登录次数,登录的会员的名字也在该方法调用时获得publicintgetLogontimes(){StringstrSql=null;try{conn=DriverManager.getConnection(strDBUrl);Statementstmt=conn.createStatement();strSql=“SelectlogonTimes,membernamefrombuyerInfowherememberID=‘”+memberID+“’andpwd=’”+pwd+“’”;rs=stmt.executeQuery(strSql);while(rs.next()){//登录的次数logontimes=rs.getInt(“logonTimes”);386//会员姓名memberName=rs.getString(“membername”);}rs.close();//如果是合法会员则将其登录次数加1if(logontimes!=-1){strSql=“UpdatebuyerInfosetlogonTimes=logonTimes+1wherememberID=‘”+memberID+“’”;stmt.executeUpdate(strSql);}stmt.close();conn.close();}//捕获异常catch(SQLExceptione){System.err.println(“BuyerBean.getLogontimes():”+e.getMessage());}returnlogontimes;}//设置memberID属性;publicvoidsetMemberID(StringID){this.memberID=ID;}//设置pwd属性publicvoidsetPwd(Stringpassword){this.pwd=password;}//获得该会员的真实姓名,必须在取该会员登录的次数之后才能被赋予正确的值publicStringgetMemberName(){returnmemberName;}//测试Bean中的各个方法是否能够正常工作publicstaticvoidmain(Stringargs[]){BuyerBeanbuyer=newBuyerBean();buyer.setMemberID(“abcd”);buyer.setPwd(“1234”);System.out.println(buyer.getLogontimes());387System.out.println(buyer.getMemberName());}}在BuyerBean中用了packagecuug;在发布到WEBSERVER时,可以用JAR(JDK中带的打包工具)把编译后的BuyerBean.class打包成JAR文件在服务器的环境变量classpath中给予指定,或者在服务器classpath环境变量指定的目录下建一个cuug文件夹,把BuyerBean.class放到cuug目录下。15.1.2会员登录htm与JSP会员登录要由两个部分来完成,第一个页面用于会员输入其ID和密码,当然首页还可以加一些广告等的其它信息,在本例中略过。清单15-2default.htmcontentType=”text/html;charset=gb2312”HTML!—Copyright©1999cuug,liu.HEADTITLECUUGONLINEBOOKSTORE–MEMBERLOGIN/TITLE/HEADBODYbgcolor=”white”H1align=”center”CUUG网上书店/H1H2align=”center”会员登录页/H2P /PP /PCENTERFORMMETHOD=POSTACTION=”checklogon.jsp”BRfontsize=5color=”green”请输入会员代号和密码:br会员代码:inputTYPE=”text”name=memberIDBR密 码:inputTYPE=”password”name=pwdBRbrINPUTTYPE=submitname=submitValue=”登录”/font388/FORM/CENTER/BODY/HTML在本例中提供了一个文本框供用户输入会员代号和登录密码,其运行结果如图15-6所示,当会员输入其代码和密码后调用checklogon.jsp来验证该网络用户是否是合法会员。图15-6会员登录页在checklogon.jsp中接收从default.htm中由用户所填的会员代码和密码,把它传给BuyerBean,由BuyerBean判断该用户的会员代码和密码的正确性,若正确显示欢迎信息;若不正确,则提供一个重新登录的链接。Checklogon.jsp的源代码如下:清单15-3checklogon.jsp!DOCTYPEHTMLPUBLIC“-//W3C//DTDHTML4.0Transitional//EN”%@pagelanguage=”Java”contentType=”text/html;charset=GB2312”%jsp:useBeanclass=”cuug.BuyerBean”id=”buyer”scope=”page”/jsp:useBeanHTMLHEADMETAname=”CHECKLOGON”TITLECUUGONLINEBOOKSTORE–MEMBERLOGIN/TITLE/HEADBODYBGCOLOR=”#FFFFFF”H1align=”center”CUUG网上书店/H1%StringmemberID=request.getParameter(“memberID”);389Stringpwd=request.getParameter(“pwd”);buyer.setMemberID(memberID);buyer.setPwd(pwd);%%intlogonTimes=buyer.getLogontimes();if(logonTimes0){session.putValue(memberID,memberID);%H2align=”center”%=buyer.getMemberName()%欢迎你第%=logonTimes+1%次来到CUUG网上书店/H2H2align=”center”Ahref=”booklist.jsp”进入书店/A/H2%}else{%H2align=”center”对不起,%=memberID%你的用户名和密码不一致/H2H