jsp项目报告范例

  • 588.47 KB
  • 75页

jsp项目报告范例

  • 75页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'JSP项目报告会员服务系统的设计与实现完成人:(专业年级学号姓名)时间: 目录1使用JSP实现会员服务系统1.1系统需求概述2 1使用JSP实现会员服务系统本章笔者将使用JSP及其相关技术实现一个网上会员服务系统。现今基于互联网的电子商务日趋流行,某音阶俱乐部一直从事各类音像产品的交易,拥有一批音像会员,传统的交易方式是等待会员上门进行服务,现希望实现网络信息化服务,即会员可以通过互联网进行各类音像产品的交易,读者可以使用JSP及其相关技术来实现这一目的。首先要做的,是明确系统需求,即用户期望实现什么功能、达到什么目的。1.1系统需求概述音阶俱乐部期望提供基于互联网的音像产品交易服务,会员可以互联网上浏览各类音像产品的信息,如果对某个产品感兴趣,则可以订购该产品,系统能够在线自动生成相应的订单,会员提交订单后,可以查询自己的订单。音阶俱乐部的员工会根据订单情况给会员发货,完成交易服务。普通用户需要在会员服务系统中注册后方可成为音阶俱乐部的会员,因此系统必须为所有用户提供会员注册和系统登录的功能。会员服务系统还需要针对音阶俱乐部的员工提供管理和维护各类音像产品和会员信息的接口。通过以上需求分析,读者可以总结出系统涉及的用户类型,主要包括以下两类:Ø音阶俱乐部会员Ø音阶俱乐部员工其中,需要为俱乐部会员实现的功能主要有:Ø会员注册与系统登陆Ø音像产品浏览Ø订购各类产品,包括添加、删除、修改订单Ø提交订单Ø从系统中注销Ø修改个人注册信息Ø查询个人订单俱乐部员工可以实现的功能主要有:Ø系统登陆与注销Ø处理会员订单Ø管理和维护各类产品信息,包括添加、修改、删除、查询各类产品信息Ø管理和维护会员信息同时,通过需求分析,读者可以知道系统所涉及的各类业务实体,包括:Ø会员Ø员工Ø产品Ø订单系统所要实现的功能就是围绕这个几个实体进行各类操作,下面笔者简要说明一下这几个实体。 1.2业务实体说明会员服务系统中的业务实体主要包括会员(Member)、员工(Staff)、产品(Product)和订单(Order),下面详细介绍一下这些业务实体:Ø会员(Member):代表一个音阶俱乐部用户实体,主要属性包括会员号、会员姓名、性别、所在城市、家庭住址、邮编、联系电话、Email、会员帐号以及密码等。Ø员工(Staff):代表一个音阶俱乐部员工实体,主要属性包括员工姓名、员工帐号、密码等。Ø产品(Product):代表一个产品实体,在会员服务系统中,产品主要是各种音像产品,其主要属性包括产品类型、产品名称、产品单价、促销价、产品产地、导演、主演、发行日期、产品说明等。Ø订单(Order):代表一个订单实体,主要属性包括订单编号、订单产品ID、订单所属会员ID、订单日期、单价、订货数量、发货日期、发货地址等。其中一个会员可以进行多次订单交易,而一个订单也可以包含多个产品。员工则可以对会员、订单和产品进行各项维护工作。会员、订单和产品实体之间的业务实体关系如图10-1所示:图10-1会员服务系统业务实体关系图2系统构架设计主要功能明确之后,开始对会员服务系统进行必要的系统设计。整个系统采用多层的构架模式,从上到下依次为视图层、业务层、DAO层和数据库层。如图10-2所示:图10-2会员服务系统的构架视图层负责向用户展现数据,在会员服务系统中视图层主要有JSP页面构成。设计JSP页面的原则是尽量减少JSP页面中的JSP代码量,把具体的业务逻辑放在业务层实现,JSP页面只负责显示业务层实现的结果。对于一些公用的视图资源(如JSP页面中的图片、公用文字等),应当使用“<%@include%>”的形式包含,提高代码的可重用性。 业务层负责具体业务逻辑的实现,在会员服务系统中通过编写专门的业务类来实现。各业务类从同一个抽象业务基类继承,例如分别负责处理会员、员工、订单和产品相关业务逻辑的业务类MemberBiz、StaffBiz、OrderBiz和ProductBiz都继承自抽象业务基类BaseBiz.,如图10-3所示:图10-3业务类的继承关系所有业务类都从一个抽象的业务基类继承,这种做法使得业务类更加规范、可扩展性更强。例如BaseBiz中定义一些抽象的变量和方法,其子类必须实现这些变量和方法,BaseBiz类中已经实现的一些公用的方法,其子类会自动继承。模型层包含了系统中所涉及的业务实体、业务规则以及对数据库层的访问方法,模型层主要由各业务实体类和DAO类构成。在会员服务系统中,业务实体主要包含会员、员工、订单和产品,每个实体都有一个相应的实体类,这些实体类本质上是JavaBean,其中封装了实体的各项属性。实体类的作用是依据面向对象的原则描述一个业务实体,DAO模式的实现必须依赖这些实体对象。和业务类类似,各实体类也由同一个抽象实体基类BaseEntity继承而来,图10-4描述了这种继承关系:图10-4实体类的继承关系DAO类负责实现各实体类的业务规则以及对数据库的访问(例如实现在数据库中添加一个会员实体对象),因而也可以称之为“实体的DAO实现类”。DAO类也是由一个抽象的基类继承而来,所有的DAO类必须实现基类所定义的抽象方法,所有的DAO类都自动继承基类已经实现的方法,如图10-5所示: 图10-5DAO类的继承关系本质上DAO是实现数据持久化的一种设计模式,使用DAO模式访问数据库,使得数据库层和业务层相互隔离开来,这样业务层就无须关心具体的数据库产品形式和数据库操方式。一旦数据库发生变化,只需创建新的DAO实现类,而无需更改业务类,这就是DAO模式的优点。数据库层实现了业务数据的物理存储,会员服务系统采用的是MSSQLServer数据库。图10-2中的各层次之间的依赖关系是自上向下,即上层依赖下层实现,而下层则可以基本独立于上层进行实现。例如视图层的数据显示需要依赖于业务层所提供的相关功能,但业务层所提供的功能本身并不关注视图层的特点,即便视图层完全改变(例如由BS浏览器模式改为CS客户端应用程序),业务层仍然可以沿用。采用分层模式,各层次的责任和界限非常清晰,因而有利于日后系统的扩展与维护。层与层之间的耦合度很小,因而各层都更灵活、具有更高的可复用性。但多层模式也有明显的缺点,即提高了软件的设计复杂度,同时也降低了软件的运行效率。但是随着计算机硬件技术急速发展和计算机软件规模的不断扩大,多层模式的益处已经远远大于其弊端了,事实证明,越复杂的应用系统,越是有必要采用多层模式。多层模式已经代替传统的二层、三层模式,逐渐成为软件开发的主流。3数据库设计每个实体在数据库中都有对应的表,图10-6显示了会员服务系统中的数据库表的关系模型。其中,会员(Member)和订单(Order)、订单(Order)和产品(Product)都是一对多的关系,订单(Order)中包含了Order_Product_ID和Order_Member_ID字段,分别用于和会员(Member)表中的ID和产品(Product)表中的ID相关联。员工(Staff)表和其他表没有直接的联系。各表中的ID都设置为int自增长型字段,用作各表的主键。ID字段本身不具有任何业务上的含义,因此不会随着具体业务的变化而改变,适于作为主键。 图10-6会员服务系统数据库表的关系模型会员服务系统采用的是MSSQLServer数据库,开发人员可以根据图10-6所示模型直接在SQLServer管理工具中创建各表。4各功能模块的实现系统构架设计和数据库设计完成之后,就可以开始立足实现系统各项功能模块。系统是依据多层构架模式实现的,为了更好的体现这一构架,笔者在实现时也尽量按层次进行实现。按顺序首先是实现数据库层,即在数据库中创建各物理表。其次是实现模型层,主要工作是编写各实体类和DAO类。模型层实现后是编写相应业务类,实现业务层。最后是编写视图层的JSP页面。但在这些工作开展之前,还需要先完成两项必要的任务,即:Ø系统运行环境的配置会员服务系统采用Tomcat5.5作为Web服务器,因此需要对Tomcat进行正确的安装和配置,主要包括数据库连接池的配置、虚拟目录的创建等。Ø实用类的编写除了各业务类、DAO类和实体类外,还需要编写一些实用工具类,主要包括数据库工具类、日期处理类和字符串处理类。JSP页面、业务类、DAO类和实体类都需要访问这些工具类所包含的方法。 4.1系统运行环境配置首先是正确安装Tomcat5.5,本书第二章已经对此作了专门介绍,此处不再赘述。有关Tomcat5.5数据库连接池的配置,由于同样是采用MSSQLServer数据库,因而配置方法几乎完全一致。读者可以参照本书7.5节有关数据库连接池配置的介绍。需要注意的是,如果数据库类型不相同,则数据库连接池的配置方式会略有不同。测试数据库连接池无误后,就可以在Tomcat安装目录的webapps目录下创建一个Member虚拟目录,会员服务系统的所有程序和资源都位于该目录下:图10-7显示了未来的会员服务系统的目录结构:图10-7会员服务系统的目录结构其中各类JSP页面分别位于member、order、product、staff目录以及Member根目录下,css目录和images目录包含的是系统需要的样式表和图片,WEB-INF目录的classes子目录中包含了各Java类文件,例如biz子目录中包含了各业务类,model子目录中包含了业务实体类和相应的DAO类。tools目录的base子目录中包含了一些抽象的基类,database和util子目录中包含了基本的实用类。4.2编写实用类实用类位于tools目录的database和util子目录中,database子目录中包含了DataBaseTool.class文件,该Java类文件负责处理数据库相关的各类操作,其源文件(DataBaseTool.java)如下所示:DataBaseTool.java/***DataBaseTool.java*该类是数据库工具类,负责获取、关闭各项数据库资源 */packagemember.tools.database;importjava.sql.*;importjavax.naming.Context;importjavax.naming.InitialContext;importjavax.sql.DataSource;publicclassDataBaseTool{privatestaticConnectioncon=null;//该类的构造函数,因为该类对外提供方法都是静态的,所以不需要实例化,//因此该构造方法为privateprivateDataBaseTool(){}//通过数据库连接池获得数据库连接publicstaticConnectiongetConnection()throwsSQLException{try{ContextinitCtx=newInitialContext();ContextenvCtx=(Context)initCtx.lookup("java:comp/env");DataSourceds=(DataSource)envCtx.lookup("jdbc/Member");con=ds.getConnection();}catch(Exceptione){thrownewSQLException("从连接池中获取数据库连接发生异常:"+e.getMessage());}returncon;}//关闭数据库资源publicstaticvoidclose(ResultSetrs,Statementst,Connectioncon){close(rs);close(st,con);}//关闭数据库资源publicstaticvoidclose(Statementst,Connectioncon){close(st);close(con);}//关闭数据库连接,由于采用连接池方式,数据库连接不会被实际关闭publicstaticvoidclose(Connectioncon){ try{if(con!=null)con.close();}catch(Exceptione){}}//关闭数据库资源publicstaticvoidclose(ResultSetrs){try{if(rs!=null)rs.close();}catch(Exceptione){}}//关闭数据库资源publicstaticvoidclose(Statementst){try{if(st!=null)st.close();}catch(Exceptione){}}//获得数据库服务器日期(适用于SQLServer数据库)publicstaticDategetCurrentDateFromSQLServer(Connectioncon)throwsSQLException{StringstrSQL="selectgetDate()";Statementst=con.createStatement();ResultSetrs=st.executeQuery(strSQL);rs.next();DatedtRtn=rs.getDate(1);close(rs,st,null);returndtRtn;}}util子目录中包含了用以处理日期的BaseCalendar.class类文件和用于处理字符串BaseUtil.class类文件。源Java文件代码分别如下所示:BaseCalendar.java /***BaseCalendar.java*该类是用于处理日期的工具类*/packagemember.tools.util;importjava.text.DateFormat;importjava.util.*;publicclassBaseCalendar{privateCalendarcalendar=null;//构造函数,获取当前日期publicBaseCalendar(){calendar=Calendar.getInstance();DatetrialTime=newDate();calendar.setTime(trialTime);}//构造函数,根据日期参数获取时间publicBaseCalendar(java.util.Datedate){calendar=Calendar.getInstance();calendar.setTime(date);}publicCalendargetCalendar(){returncalendar;}publicStringchangeIntToString(intnumber){String[]str=newString[]{"01","02","03","04","05","06","07","08","09",};if(number<10&&number>0)returnstr[number-1];elsereturnString.valueOf(number);}publicintgetYear(){returncalendar.get(Calendar.YEAR);}publicStringgetMonth(){returnchangeIntToString(getMonthInt());}publicStringgetNextMonth(){ if(getMonthInt()<12)returngetYear()+"-"+changeIntToString(getMonthInt()+1);elsereturn(getYear()+1)+"-01";}publicStringgetDay(){intx=getDayOfWeek();String[]days=newString[]{"日","一","二","三","四","五","六"};if(x>7)return"Unknown";returndays[x-1];}publicintgetMonthInt(){return1+calendar.get(Calendar.MONTH);}publicStringgetDate(){returngetYear()+"-"+getMonth()+"-"+getDayOfMonth();}publicStringgetTime(){returngetHour()+":"+getMinute()+":"+getSecond();}publicStringgetDateAndTime(){returngetDate()+""+getTime();}publicStringgetDayOfMonth(){returnchangeIntToString(calendar.get(Calendar.DAY_OF_MONTH));}publicintgetDayOfYear(){returncalendar.get(Calendar.DAY_OF_YEAR);}publicintgetWeekOfYear(){returncalendar.get(Calendar.WEEK_OF_YEAR);}publicintgetWeekOfMonth(){returncalendar.get(Calendar.WEEK_OF_MONTH);}publicintgetDayOfWeek(){returncalendar.get(Calendar.DAY_OF_WEEK)-1;}publicStringgetHour(){returnchangeIntToString(calendar.get(Calendar.HOUR_OF_DAY));}publicStringgetMinute(){ returnchangeIntToString(calendar.get(Calendar.MINUTE));}publicStringgetSecond(){returnchangeIntToString(calendar.get(Calendar.SECOND));}publicintgetAMPM(){returncalendar.get(Calendar.AM_PM);}//日期加减运算publicStringaddDate(Datedate,intday){calendar.setTimeInMillis(calendar.getTimeInMillis()+((long)day)*24*3600*1000);returngetDate();}}BaseUtil.java/**BaseUtil.java*该类用于对字符串等进行必要处理*/packagemember.tools.util;importjava.sql.Date;publicclassBaseUtil{//过滤日期publicstaticDateavoidNullDate(Datestr){if(str==null){returnDate.valueOf("1980-1-1");}else{returnstr;}}//判断字符是否为空publicstaticbooleanisNull(Strings){if((s==null)||(s.trim().length()==0)||(s.equals("null"))){returntrue;}else{returnfalse;} }//过滤字符串空值publicStringavoidNullString(Strings){if((s==null)||(s.trim().length()==0)||(s.equals("null"))){return"";}else{returns;}}}4.2编写抽象基类实用类编写完成后,开始实现会员服务系统各层的基类文件,包括实体基类文件BaseEntity.java、DAO实现基类文件BaseDao.java和实体业务类文件BaseBiz.java。这些类文件需要调用实用类中的有关方法,详细的文件及其源代码如下所示:BaseEntity.java/**BaseEntity.java*该类是实体模型的基类,各实体模型类都从该类继承*该类及其子类本质上属于JavaBean,因而实现了Serializable接口*/packagemember.tools.base;importjava.io.Serializable;importjava.lang.reflect.AccessibleObject;importjava.lang.reflect.Field;publicabstractclassBaseEntityimplementsSerializable{//该方法采用反射机制把对象各项属性打印出来,程序调试时非常有用publicStringtoString(){StringBufferbuffer=newStringBuffer();Classc=getClass();buffer.append(c.getName());buffer.append("[");Fieldfields[]=c.getDeclaredFields();try{AccessibleObject.setAccessible(fields,true);for(inti=0;i0){members=newMemberEntity[result.size()];result.toArray(members);}returnmembers;} //更新一条会员记录publicvoidupdate(Connectioncon,MemberEntitymember)throwsSQLException{PreparedStatementps=null;StringBufferbuffer=newStringBuffer();try{//构造更新sql语句buffer.append("UPDATEMemberSET");buffer.append("Comment=?,");buffer.append("Member_Account=?,");buffer.append("Member_Address=?,");buffer.append("Member_City=?,");buffer.append("Member_Credit=?,");buffer.append("Member_Email=?,");buffer.append("Member_Name=?,");buffer.append("Member_Number=?,");buffer.append("Member_Password=?,");buffer.append("Member_Sex=?,");buffer.append("Member_Status=?,");buffer.append("Member_Tel=?,");buffer.append("Member_ZipCode=?");buffer.append("WHEREID=?");ps=con.prepareStatement(buffer.toString());//设置参数intindex=1;ps.setString(index++,member.getComment());ps.setString(index++,member.getMember_Account());ps.setString(index++,member.getMember_Address());ps.setString(index++,member.getMember_City());ps.setString(index++,member.getMember_Credit());ps.setString(index++,member.getMember_Email());ps.setString(index++,member.getMember_Name());ps.setString(index++,member.getMember_Number());ps.setString(index++,member.getMember_Password());ps.setString(index++,member.getMember_Sex());ps.setString(index++,member.getMember_Status());ps.setString(index++,member.getMember_Tel());ps.setString(index++,member.getMember_ZipCode());ps.setInt(index++,member.getID());//执行ps.executeUpdate();}catch(Exceptione){ thrownewSQLException("更新表(Member)时发生异常:"+e.getMessage());}finally{DataBaseTool.close(ps);}}}ProductDao.java/***ProductDao.java*产品实体对应的DAO类*/packagemember.product.model;importjava.sql.*;importjava.util.*;importmember.tools.database.*;importmember.tools.base.*;publicclassProductDaoextendsBaseDao{//向产品表中插入一条记录publicvoidinsert(Connectioncon,ProductEntityproduct)throwsSQLException{PreparedStatementps=null;StringBufferbuffer=newStringBuffer();try{//构造添加sql语句buffer.append("INSERTINTOProduct(Product_Type,Product_Name,");buffer.append("Product_UnitPrice,Product_PromotionPrice,Product_Language,Product_Director,");buffer.append("Product_Actor,Product_Instruction,Product_Date,Product_Status,Product_Number)");buffer.append("VALUES(?,?,?,?,?,?,?,?,?,?,?)");ps=con.prepareStatement(buffer.toString());//设置sql语句的参数intindex=1;ps.setString(index++,product.getProduct_Type());ps.setString(index++,product.getProduct_Name());ps.setFloat(index++,product.getProduct_UnitPrice());ps.setFloat(index++,product.getProduct_PromotionPrice());ps.setString(index++,product.getProduct_Language());ps.setString(index++,product.getProduct_Director());ps.setString(index++,product.getProduct_Actor());ps.setString(index++,product.getProduct_Instruction()); ps.setDate(index++,product.getProduct_Date());ps.setString(index++,product.getProduct_Status());ps.setString(index++,product.getProduct_Number());//执行sql语句ps.executeUpdate();}catch(Exceptione){thrownewSQLException("向表(Product)中插入数据发生异常:"+e.getMessage());}finally{DataBaseTool.close(ps);}}//实现父类定义的抽象方法,把结果集封装成实体对象数组publicBaseEntity[]pack(ResultSetrs)throwsSQLException{ArrayListresult=newArrayList();ProductEntity[]products=null;while(rs.next()){ProductEntityproduct=newProductEntity();product.setID(rs.getInt("ID"));product.setProduct_Actor(rs.getString("Product_Actor"));product.setProduct_Date(rs.getDate("Product_Date"));product.setProduct_Director(rs.getString("Product_Director"));product.setProduct_Instruction(rs.getString("Product_Instruction"));product.setProduct_Language(rs.getString("Product_Language"));product.setProduct_Name(rs.getString("Product_Name"));product.setProduct_PromotionPrice(rs.getFloat("Product_PromotionPrice"));product.setProduct_Status(rs.getString("Product_Status"));product.setProduct_Type(rs.getString("Product_Type"));product.setProduct_UnitPrice(rs.getFloat("Product_UnitPrice"));product.setProduct_Number(rs.getString("Product_Number"));result.add(product);}if(result.size()>0){products=newProductEntity[result.size()];result.toArray(products);}returnproducts;}//更新一条产品记录publicvoidupdate(Connectioncon,ProductEntityproduct)throwsSQLException{ PreparedStatementps=null;StringBufferbuffer=newStringBuffer();try{//构造更新sql语句buffer.append("UPDATEProductSET");buffer.append("Product_Type=?,");buffer.append("Product_Name=?,");buffer.append("Product_UnitPrice=?,");buffer.append("Product_PromotionPrice=?,");buffer.append("Product_Language=?,");buffer.append("Product_Director=?,");buffer.append("Product_Actor=?,");buffer.append("Product_Instruction=?,");buffer.append("Product_Date=?,");buffer.append("Product_Status=?,");buffer.append("Product_Number=?");buffer.append("WHEREID=?");ps=con.prepareStatement(buffer.toString());//设置参数intindex=1;ps.setString(index++,product.getProduct_Type());ps.setString(index++,product.getProduct_Name());ps.setFloat(index++,product.getProduct_UnitPrice());ps.setFloat(index++,product.getProduct_PromotionPrice());ps.setString(index++,product.getProduct_Language());ps.setString(index++,product.getProduct_Director());ps.setString(index++,product.getProduct_Actor());ps.setString(index++,product.getProduct_Instruction());ps.setDate(index++,product.getProduct_Date());ps.setString(index++,product.getProduct_Status());ps.setString(index++,product.getProduct_Number());ps.setInt(index++,product.getID());//执行ps.executeUpdate();}catch(Exceptione){thrownewSQLException("更新表(Product)时发生异常:"+e.getMessage());}finally{DataBaseTool.close(ps);}}} OrderDao.java/***OrderDao.java*订单实体对应的DAO类*/packagemember.order.model;importjava.sql.*;importjava.util.*;importmember.tools.database.*;importmember.tools.base.*;publicclassOrderDaoextendsBaseDao{//向订单表中插入一条订单记录publicvoidinsert(Connectioncon,OrderEntityorder)throwsSQLException{PreparedStatementps=null;StringBufferbuffer=newStringBuffer();try{//构造添加sql语句buffer.append("INSERTINTO[Order](Order_Number,Order_Date,");buffer.append("Order_Product_ID,Order_Member_ID,Order_ShipDate,Order_ShipAddress,");buffer.append("Order_City,Order_Zipcode,Order_Amount,Order_UnitPrice,");buffer.append("Order_Status,Order_Instruction)");buffer.append("VALUES(?,?,?,?,?,?,?,?,?,?,?,?)");ps=con.prepareStatement(buffer.toString());//设置sql语句的参数intindex=1;ps.setString(index++,order.getOrder_Number());ps.setDate(index++,order.getOrder_Date());ps.setInt(index++,order.getOrder_Product_ID());ps.setInt(index++,order.getOrder_Member_ID());ps.setDate(index++,order.getOrder_ShipDate());ps.setString(index++,order.getOrder_ShipAddress());ps.setString(index++,order.getOrder_City());ps.setString(index++,order.getOrder_Zipcode());ps.setInt(index++,order.getOrder_Amount());ps.setFloat(index++,order.getOrder_UnitPrice());ps.setString(index++,order.getOrder_Status());ps.setString(index++,order.getOrder_Instruction());//执行sql语句ps.executeUpdate();} catch(Exceptione){thrownewSQLException("向表(Order)中插入数据发生异常:"+buffer.toString());}finally{DataBaseTool.close(ps);}}//实现父类定义的抽象方法,把结果集封装成实体对象数组publicBaseEntity[]pack(ResultSetrs)throwsSQLException{ArrayListresult=newArrayList();OrderEntity[]orders=null;while(rs.next()){OrderEntityorder=newOrderEntity();order.setID(rs.getInt("ID"));order.setOrder_Number(rs.getString("Order_Number"));order.setOrder_Date(rs.getDate("Order_Date"));order.setOrder_Product_ID(rs.getInt("Order_Product_ID"));order.setOrder_Member_ID(rs.getInt("Order_Member_ID"));order.setOrder_ShipDate(rs.getDate("Order_ShipDate"));order.setOrder_ShipAddress(rs.getString("Order_ShipAddress"));order.setOrder_City(rs.getString("Order_City"));order.setOrder_Zipcode(rs.getString("Order_Zipcode"));order.setOrder_Amount(rs.getInt("Order_Amount"));order.setOrder_UnitPrice(rs.getFloat("Order_UnitPrice"));order.setOrder_Status(rs.getString("Order_Status"));order.setOrder_Instruction(rs.getString("Order_Instruction"));result.add(order);}if(result.size()>0){orders=newOrderEntity[result.size()];result.toArray(orders);}returnorders;}//更新一条订单记录publicvoidupdate(Connectioncon,OrderEntityorder)throwsSQLException{PreparedStatementps=null;StringBufferbuffer=newStringBuffer();try{//构造更新sql语句buffer.append("UPDATE[Order]SET"); buffer.append("Order_Number=?,");buffer.append("Order_Date=?,");buffer.append("Order_Product_ID=?,");buffer.append("Order_Member_ID=?,");buffer.append("Order_ShipDate=?,");buffer.append("Order_ShipAddress=?,");buffer.append("Order_City=?,");buffer.append("Order_Zipcode=?,");buffer.append("Order_Amount=?,");buffer.append("Order_UnitPrice=?,");buffer.append("Order_Status=?,");buffer.append("Order_Instruction=?");buffer.append("WHEREID=?");ps=con.prepareStatement(buffer.toString());//设置参数intindex=1;ps.setString(index++,order.getOrder_Number());ps.setDate(index++,order.getOrder_Date());ps.setInt(index++,order.getOrder_Product_ID());ps.setInt(index++,order.getOrder_Member_ID());ps.setDate(index++,order.getOrder_ShipDate());ps.setString(index++,order.getOrder_ShipAddress());ps.setString(index++,order.getOrder_City());ps.setString(index++,order.getOrder_Zipcode());ps.setInt(index++,order.getOrder_Amount());ps.setFloat(index++,order.getOrder_UnitPrice());ps.setString(index++,order.getOrder_Status());ps.setString(index++,order.getOrder_Instruction());ps.setInt(index++,order.getID());//执行ps.executeUpdate();}catch(Exceptione){thrownewSQLException("更新表(Order)时发生异常:"+e.getMessage());}finally{DataBaseTool.close(ps);}}}StaffDao.java/***StaffDao.java *员工实体对应的DAO类*/packagemember.staff.model;importjava.sql.*;importjava.util.*;importmember.tools.database.*;importmember.tools.base.*;publicclassStaffDaoextendsBaseDao{//实现父类定义的抽象方法,把结果集封装成实体对象数组publicBaseEntity[]pack(ResultSetrs)throwsSQLException{ArrayListresult=newArrayList();StaffEntity[]staffs=null;while(rs.next()){StaffEntitystaff=newStaffEntity();staff.setID(rs.getInt("ID"));staff.setStaff_Name(rs.getString("Staff_Name"));staff.setStaff_Account(rs.getString("Staff_Account"));staff.setStaff_Password(rs.getString("Staff_Password"));result.add(staff);}if(result.size()>0){staffs=newStaffEntity[result.size()];result.toArray(staffs);}returnstaffs;}//向数据库中的员工表中插入一条员工记录publicvoidinsert(Connectioncon,StaffEntitystaff)throwsSQLException{PreparedStatementps=null;StringBufferbuffer=newStringBuffer();try{//构造添加sql语句buffer.append("INSERTINTOStaff(Staff_Name,Staff_Account,Staff_Password");buffer.append("VALUES(?,?,?)");ps=con.prepareStatement(buffer.toString());//设置sql语句的参数intindex=1;ps.setString(index++,staff.getStaff_Name());ps.setString(index++,staff.getStaff_Account());ps.setString(index++,staff.getStaff_Password()); //执行sql语句ps.executeUpdate();}catch(Exceptione){thrownewSQLException("向表(Staff)中插入数据发生异常:"+e.getMessage());}finally{DataBaseTool.close(ps);}}//更新一条员工记录publicvoidupdate(Connectioncon,StaffEntitystaff)throwsSQLException{PreparedStatementps=null;StringBufferbuffer=newStringBuffer();try{//构造更新sql语句buffer.append("UPDATEStaffSET");buffer.append("Staff_Account=?,");buffer.append("Staff_Password=?,");buffer.append("Staff_Name=?");buffer.append("WHEREID=?");ps=con.prepareStatement(buffer.toString());//设置参数intindex=1;ps.setString(index++,staff.getStaff_Account());ps.setString(index++,staff.getStaff_Password());ps.setString(index++,staff.getStaff_Name());ps.setInt(index++,staff.getID());//执行ps.executeUpdate();}catch(Exceptione){thrownewSQLException("更新表(Staff)时发生异常:"+e.getMessage());}finally{DataBaseTool.close(ps);}}} 4.4业务层的实现业务层实现了对各类业务的处理,业务层处理的对象是各业务实体,而不是数据库中的各字段,需要涉及到数据库的操作,一律在DAO实现类中完成。业务层只是对DAO类中相应方法的进一步封装,参考以下业务类实例:MemberBiz.java/***MemberBiz.java*会员相关的业务类,该类继承自业务基类BaseBiz*/packagemember.member.biz;importmember.tools.base.*;importmember.member.model.*;importmember.tools.database.*;importjava.sql.Connection;publicclassMemberBizextendsBaseBiz{MemberDaomemberDao=newMemberDao();//创建MemberDao对象//构造函数publicMemberBiz(){this.baseDao=newMemberDao();//覆盖基类定义的抽象变量baseDao}//注册一个新会员publicvoidregisterMember(MemberEntitymember)throwsException{Connectioncon=DataBaseTool.getConnection();try{//调用DAO层的insert方法memberDao.insert(con,member);}catch(Exceptione){throwe;}finally{DataBaseTool.close(con);}}//修改会员信息publicvoidupdateMember(MemberEntitymember)throwsException{Connectioncon=DataBaseTool.getConnection();try{ //调用DAO层的update方法memberDao.update(con,member);}catch(Exceptione){throwe;}finally{DataBaseTool.close(con);}}}ProductBiz.java/***ProductBiz.java*产品相关的业务类,该类继承自业务基类BaseBiz*/packagemember.product.biz;importmember.tools.base.*;importmember.product.model.*;importmember.tools.database.*;importjava.sql.Connection;publicclassProductBizextendsBaseBiz{ProductDaoproductDao=newProductDao();//创建ProductDao对象//构造函数publicProductBiz(){this.baseDao=productDao;//覆盖基类定义的抽象变量baseDao}//添加一个产品publicvoidaddProduct(ProductEntityproduct)throwsException{Connectioncon=DataBaseTool.getConnection();try{//调用DAO层的insert方法productDao.insert(con,product);}catch(Exceptione){throwe;}finally{DataBaseTool.close(con);}} //更新一个产品publicvoidupdateProduct(ProductEntityproduct)throwsException{Connectioncon=DataBaseTool.getConnection();try{//调用DAO层的update方法productDao.update(con,product);}catch(Exceptione){throwe;}finally{DataBaseTool.close(con);}}}OrderBiz.java/***OrderBiz.java*订单相关的业务类,该类继承自业务基类BaseBiz*/packagemember.order.biz;importmember.tools.base.*;importmember.order.model.*;importmember.tools.database.*;importjava.sql.Connection;publicclassOrderBizextendsBaseBiz{OrderDaoorderDao=newOrderDao();//创建MemberDao对象publicOrderBiz(){this.baseDao=orderDao;//覆盖基类定义的抽象变量baseDao}//新增订单publicvoidaddOrder(OrderEntityorder)throwsException{//从数据库连接池中获取数据库连接对象Connectioncon=DataBaseTool.getConnection();try{orderDao.insert(con,order);}catch(Exceptione){throwe; }finally{DataBaseTool.close(con);}}//更新订单publicvoidupdateOrder(OrderEntityorder)throwsException{Connectioncon=DataBaseTool.getConnection();try{orderDao.update(con,order);}catch(Exceptione){throwe;}finally{DataBaseTool.close(con);}}//同时更新多个订单publicvoidupdateOrders(OrderEntity[]orders)throwsException{Connectioncon=DataBaseTool.getConnection();try{if(orders!=null){//开始一个事务beginTransaction(con);for(inti=0;i<%@pagecontentType="text/html;charset=GBK"%><%@pageimport="member.member.biz.*"%><%@pageimport="member.member.model.*"%><%//设定字符编码为GBKresponse.setContentType("text/html;charset=gbk");request.setCharacterEncoding("gbk");%><%//定义错误信息StringerrMessage="";//action用来判断表单是否被提交Stringaction=request.getParameter("action");//如果表单被提交if(action!=null)if(action.equals("submit")){//获取会员帐号Stringaccount=request.getParameter("Member_Account");//获取会员密码Stringpassword=request.getParameter("Member_Password");//构造sql语句Stringsql="select*fromMemberwhereMember_Account=""+account+""";//创建会员业务类MemberBizmemberBiz=newMemberBiz(); //定义会员对象数组MemberEntity[]members=null;try{//调用会员业务类的findByQueryString()方法进行数据库查询members=(MemberEntity[])memberBiz.findByQueryString(sql);}catch(Exceptione){errMessage=e.getMessage();}if(members==null)errMessage="会员不存在!";else{//判断密码是否准确if(members[0].getMember_Password().equals(password)){//把当前会员对象保存在session的Member属性中session.setAttribute("Member",members[0]);//页面重定位response.sendRedirect("order/productlist.jsp");}elseerrMessage="密码错误!";}}%>会员服务系统--会员登录
会员登录帐号:密码:
<%=errMessage%>
functionopenWindow(url){window.open(url,"","");}login.jsp运行的效果如图10-8所示:图10-8login.jsp运行效果如果普通用户期望成为会员,可以在login.jsp页面中点击“注册”按钮,则弹出图10-9所示的会员注册界面,该界面同时提供了会员信息修改功能。由member.jsp负责实现,该文件源代码如下所示: 图10-9member.jsp运行效果member.jsp<%@pagecontentType="text/html;charset=GBK"%><%@pageimport="member.member.biz.*"%><%@pageimport="member.member.model.*"%><%response.setContentType("text/html;charset=gbk");request.setCharacterEncoding("gbk");%><%!//该函数用于从当前表单中获取各项数据,并将其封装成ProductEntity对象publicMemberEntitygetMember(HttpServletRequestrequest){MemberEntitymember=newMemberEntity();member.setID((newInteger(request.getParameter("ID"))).intValue());member.setMember_Name(request.getParameter("Member_Name"));member.setMember_Sex(request.getParameter("Member_Sex"));member.setMember_City(request.getParameter("Member_City"));member.setMember_Address(request.getParameter("Member_Address"));member.setMember_ZipCode(request.getParameter("Member_ZipCode"));member.setMember_Tel(request.getParameter("Member_Tel"));member.setMember_Email(request.getParameter("Member_Email"));member.setMember_Credit(request.getParameter("Member_Credit"));member.setMember_Account(request.getParameter("Member_Account"));member.setMember_Password(request.getParameter("Member_Password"));member.setComment(request.getParameter("Comment"));returnmember;}%><%//type参数用以标识操作类型,register表示注册新会员,edit表示显示会员详细信息Stringtype=request.getParameter("type"); //action参数用以判断表单是否提交Stringaction=request.getParameter("action");//id参数用以标识会员IDintid=(newInteger(request.getParameter("ID"))).intValue();//errMessage表示错误提示信息StringerrMessage="";//创建会员对象MemberEntitymember=newMemberEntity();//如果表单被提交,则保存当前会员信息if(action!=null){MemberBizmemberBiz=newMemberBiz();member=getMember(request);try{//如果id为0,表示新注册会员if(id==0)memberBiz.registerMember(member);//如果是修改会员信息elsememberBiz.updateMember(member);//执行重定位response.sendRedirect("memberlist.jsp");}catch(Exceptione){errMessage=e.getMessage();}}//如果是显示会员详细信息else{if(type.equals("edit")){MemberBizmemberBiz=newMemberBiz();try{//调用业务类的findById方法,根据id和表名查找会员member=(MemberEntity)memberBiz.findById("Member",id);}catch(Exceptione){errMessage=e.getMessage();}}}%>会员详细信息 <%@includefile="../top.jsp"%>">会员详细信息会员姓名:>*性别:>男>女所在城市:>家庭住址:>*邮政编码:>联系电话:>Email:>会员信誉:>优秀>合格>不合格登录帐号:>*登录密码:>*备注:<%=member.getComment()%> >
<%=errMessage%>
functionsaveMember(){if(validate())document.forms[0].submit();}//validate函数用于验证表单中字段的合法性functionvalidate(){vardoc=document.forms[0];if(doc.Member_Name.value==""){alert("会员姓名不能为空");returnfalse;}if(doc.Member_Address.value==""){alert("会员住址不能为空");returnfalse;}if(doc.Member_Account.value==""){alert("会员帐号不能为空");returnfalse;}if(doc.Member_Password.value==""){alert("密码不能为空");returnfalse;}returntrue;}注意member.jsp中使用<%@include%>指令包含了top.jsp。top.jsp是一个包含了公用图片和文字的JSP页面,其源代码如下所示:top.jsp<%@pageimport="member.member.model.MemberEntity"%> <%@pagecontentType="text/html;charset=GBK"%>会员服务系统<%//从session中获取当前会员实体对象,如果不存在,表明是会员新注册MemberEntitym=(MemberEntity)session.getAttribute("Member");if(m!=null){out.print("欢迎您,"+m.getMember_Account());out.print("|注销");}elseout.print("欢迎注册成为音阶俱乐部会员!");%>
2.音像产品浏览、订购productfororder.jsp实现了产品浏览,并提供了产品订购的入口,其源代码如下所示:productfororder.jsp<%@includefile="../header.jsp"%><%@pagecontentType="text/html;charset=GBK"%><%@pageimport="member.product.biz.*"%><%@pageimport="member.product.model.*"%><%response.setContentType("text/html;charset=gbk");request.setCharacterEncoding("gbk");%><%Stringsql="select*fromProductwhereProduct_Status="否"";StringerrMessage="";ProductBizproductBiz=newProductBiz();ProductEntity[]products=null;try{products=(ProductEntity[])productBiz.findByQueryString(sql);}catch(Exceptione){errMessage=e.getMessage();} if(products==null)errMessage="没有任何产品!";%>产品列表<%@includefile="../top.jsp"%>编号类型名称出产地区导演主演出品日期是否缺货  <%if(products!=null)for(inti=0;i<%=products[i].getProduct_Number()%><%=products[i].getProduct_Type()%><%=products[i].getProduct_Name()%><%=products[i].getProduct_Language()%><%=products[i].getProduct_Director()%><%=products[i].getProduct_Actor()%><%=products[i].getProduct_Date()%><%=products[i].getProduct_Status()%>target=_blank>详细信息target=_blank>订购<%}else{%><%=errMessage%>
<%}%>productfororder.jsp运行效果如图10-10所示:图10-10productfororder.jsp运行效果注意到productfororder.jsp中使用<%@include%>指令包含了header.jsp文件,该文件强制要求只有会员才能进行订购操作,其源代码如下所示:header.jsp<%//如果session中不存在当前会员信息,则重定位至登录界面if(session.getAttribute("Member")==null)response.sendRedirect("../login.jsp");%>3.订单的修改、删除、提交在图10-10所示的界面中,如果会员对某产品感兴趣,则点击相应的“订购”链接,系统会自动生成订购单,如图10-11所示: 图10-11生成订购单会员可以对订货数量进行修改、对订单进行删除,可以提交订单,orderupdate.jsp、orderdelete.jsp和ordersubmit.jsp分别实现了上述功能,order.jsp则负责自动生成订单。以下是这些JSP文件的源代码:order.jsp<%@includefile="../header.jsp"%><%@pagecontentType="text/html;charset=GBK"%><%@pageimport="member.member.model.*"%><%@pageimport="member.product.biz.*"%><%@pageimport="member.product.model.*"%><%@pageimport="member.order.biz.*"%><%@pageimport="member.order.model.*"%><%@pageimport="member.tools.util.*"%><%@pageimport="java.util.Date"%><%response.setContentType("text/html;charset=gbk");request.setCharacterEncoding("gbk");%><%floattotalPrice=0;//订单总价%><%//errMessage表示错误提示信息StringerrMessage="";//当前会员对象MemberEntitymember=(MemberEntity)session.getAttribute("Member");OrderBizorderBiz=newOrderBiz();OrderEntity[]orders=null;//根据订购产品ID获取产品对象if(request.getParameter("ID")!=null){intid=(newInteger(request.getParameter("ID"))).intValue();ProductEntityproduct=null; ProductBizproductBiz=newProductBiz();try{product=(ProductEntity)productBiz.findById("Product",id);}catch(Exceptione){errMessage=e.getMessage();}//确认该产品是否已经存在订单Stringsql="select*from[Order]whereOrder_Product_ID="+id+"andOrder_Member_ID="+member.getID()+"andOrder_Status="未提交"";try{orders=(OrderEntity[])orderBiz.findByQueryString(sql);}catch(Exceptione){errMessage=e.getMessage();}//如果是第一次订购某件产品if(orders==null){OrderEntityorder=newOrderEntity();BaseCalendarcalendar=newBaseCalendar();order.setOrder_Number(calendar.getDateAndTime());order.setOrder_Date(java.sql.Date.valueOf(calendar.getDate()));order.setOrder_Product_ID(product.getID());order.setOrder_Member_ID(member.getID());Stringtomorrow=calendar.addDate(java.sql.Date.valueOf(calendar.getDate()),1);order.setOrder_ShipDate(java.sql.Date.valueOf(tomorrow));order.setOrder_ShipAddress(member.getMember_Address());order.setOrder_City(member.getMember_City());order.setOrder_Zipcode(member.getMember_ZipCode());order.setOrder_Amount(1);order.setOrder_UnitPrice(product.getProduct_PromotionPrice());order.setOrder_Status("未提交");orderBiz.addOrder(order);}//相应产品已经存在订购单,则进行合并else{orders[0].setOrder_Amount(orders[0].getOrder_Amount()+1);orderBiz.updateOrder(orders[0]);}}Stringsql="select*from[Order]whereOrder_Member_ID="+member.getID()+"andOrder_Status="未提交"";try{ orders=(OrderEntity[])orderBiz.findByQueryString(sql);}catch(Exceptione){errMessage=e.getMessage();}%><%=member.getMember_Account()%>的订购单列表<%@includefile="../top.jsp"%>订单编号产品名称数量原价促销价实际总价发货日期  <%if(orders!=null){ProductBizproductBiz=newProductBiz();ProductEntityproduct=null;for(inti=0;i<%=orders[i].getOrder_Number()%><%=product.getProduct_Name()%> value=<%=orders[i].getOrder_Amount()%>><%=product.getProduct_UnitPrice()%><%=orders[i].getOrder_UnitPrice()%><%=orders[i].getOrder_UnitPrice()*orders[i].getOrder_Amount()%><%=orders[i].getOrder_ShipDate()%>")>);"><%}}else{%><%=errMessage%>
<%}%>
订单总价:<%=totalPrice%>
送货日期:>送货地址:>补充说明: functiondeleteOrder(id){if(confirm("确认删除该订单么?"))self.location="orderdelete.jsp?ID="+id;}functionupdateOrder(Order_id){varamount=eval("document.all."+Order_id+".value");varid=Order_id.substring(Order_id.indexOf("_")+1,Order_id.length);if(confirm("确认修改订货数量为"+amount))self.location="orderupdate.jsp?ID="+id+"&amount="+amount;}functionsubmitOrder(){if(confirm("确认提交订购单?"))document.forms[0].submit();}orderupdate.jsp<%@includefile="../header.jsp"%><%@pagecontentType="text/html;charset=GBK"%><%@pageimport="member.order.biz.*"%><%@pageimport="member.order.model.*"%><%response.setContentType("text/html;charset=gbk");request.setCharacterEncoding("gbk");%><%intid=(newInteger(request.getParameter("ID"))).intValue();intamount=(newInteger(request.getParameter("amount"))).intValue();OrderBizorderBiz=newOrderBiz();OrderEntityorder=null;try{order=(OrderEntity)orderBiz.findById("[Order]",id); if(order!=null){order.setOrder_Amount(amount);orderBiz.updateOrder(order);response.sendRedirect("order.jsp");}}catch(Exceptione){out.print(e.getMessage());}%>orderdelete.jsp<%@includefile="../header.jsp"%><%@pagecontentType="text/html;charset=GBK"%><%@pageimport="member.order.biz.*"%><%@pageimport="member.order.model.*"%><%intid=(newInteger(request.getParameter("ID"))).intValue();OrderBizorderBiz=newOrderBiz();try{orderBiz.deleteById("[Order]",id);response.sendRedirect("order.jsp");}catch(Exceptione){out.println(e.getMessage());}%>ordersubmit.jsp<%@includefile="../header.jsp"%><%@pagecontentType="text/html;charset=GBK"%><%@pageimport="member.order.biz.*"%><%@pageimport="member.order.model.*"%><%@pageimport="member.member.model.*"%><%response.setContentType("text/html;charset=gbk");request.setCharacterEncoding("gbk");%><%//当前会员对象MemberEntitymember=(MemberEntity)session.getAttribute("Member");//获取订单发货时间StringOrder_ShipDate=request.getParameter("Order_ShipDate");//获取订单送货地址 StringOrder_ShipAddress=request.getParameter("Order_ShipAddress");//获取订单说明StringOrder_Instruction=request.getParameter("Order_Instruction");Stringsql="select*from[Order]whereOrder_Member_ID="+member.getID()+"andOrder_Status="未提交"";OrderBizorderBiz=newOrderBiz();OrderEntity[]orders=null;try{//查找订单orders=(OrderEntity[])orderBiz.findByQueryString(sql);if(orders!=null){//设置订单信息,修改状态为"已提交"for(inti=0;iordersuccess.jsp<%@includefile="../header.jsp"%><%@pagecontentType="text/html;charset=GBK"%><%@pageimport="member.order.biz.*"%><%@pageimport="member.order.model.*"%><%response.setContentType("text/html;charset=gbk");request.setCharacterEncoding("gbk");%>订单提交成功 <%@includefile="../top.jsp"%>订单提交成功!

继续订货注销图10-20是表单提交成功后的提示页:图10-20ordersuccess.jsp运行效果4.从系统注销订单提交成功后,会员可以继续选择订购其他产品,也可以注销系统,实现会员的注销由loginout.jsp完成,其源代码如下所示:loginout.jsp<%//设置当前session中的会员对象为nullsession.setAttribute("Member",null);response.sendRedirect("login.jsp");%>5.查询个人订单会员可以查询个人的订单,如图10-21所示: 图10-21个人订单查询个人订单查询由ordersearch.jsp负责实现,其源代码如下所示:ordersearch.jsp<%@includefile="../header.jsp"%><%@pagecontentType="text/html;charset=GBK"%><%@pageimport="member.product.biz.*"%><%@pageimport="member.product.model.*"%><%@pageimport="member.order.biz.*"%><%@pageimport="member.order.model.*"%><%@pageimport="member.member.model.*"%><%@pageimport="member.tools.util.BaseUtil"%><%response.setContentType("text/html;charset=gbk");request.setCharacterEncoding("gbk");%><%floattotalPrice=0;//订单总价%><%//errMessage表示错误提示信息StringerrMessage="";//action参数用于判断表单是否提交Stringaction=request.getParameter("action");//当前会员对象MemberEntitymember=(MemberEntity)session.getAttribute("Member");//获取订单发货时间StringOrder_ShipDate=request.getParameter("Order_ShipDate");//获取订单状态StringOrder_Status=request.getParameter("Order_Status");//获取订单说明StringOrder_ProductName=request.getParameter("Order_ProductName");OrderBizorderBiz=newOrderBiz(); OrderEntity[]orders=null;try{//表单没有提交,默认显示当前会员的所有订单if(action==null){Stringsql="select*from[Order]whereOrder_Member_ID="+member.getID();orders=(OrderEntity[])orderBiz.findByQueryString(sql);}else{Stringsql="select*from[Order]where1=1";if(!BaseUtil.isNull(Order_ShipDate))sql+="andOrder_ShipDate=""+Order_ShipDate+""";if(!BaseUtil.isNull(Order_Status))sql+="andOrder_Status=""+Order_Status+""";orders=(OrderEntity[])orderBiz.findByQueryString(sql);}}catch(Exceptione){out.println(e.getMessage());}%><%=member.getMember_Account()%>的订购单列表<%@includefile="../top.jsp"%>订单查询发货日期:订单状态:未提交已提交已发货
订单编号产品名称数量单价实际总价发货日期订单状态<%if(orders!=null){ProductBizproductBiz=newProductBiz();ProductEntityproduct=null;for(inti=0;i<%=orders[i].getOrder_Number()%><%=product.getProduct_Name()%><%=orders[i].getOrder_Amount()%><%=orders[i].getOrder_UnitPrice()%><%=orders[i].getOrder_UnitPrice()*orders[i].getOrder_Amount()%><%=orders[i].getOrder_ShipDate()%><%=orders[i].getOrder_Status()%><%}} else{%><%=errMessage%><%}%>
订单总价:<%=totalPrice%>6、产品信息维护俱乐部员工可以对音像产品进行各类维护管理,包括浏览、新增、修改、删除产品等。会员服务系统中由productlist.jsp负责实现产品浏览,product.jsp负责实现新增和修改产品,productdelete.jsp实现了产品的删除。以下是各JSP文件的源代码及其运行效果:productlist.jsp<%@includefile="../staff.jsp"%><%@pagecontentType="text/html;charset=GBK"%><%@pageimport="member.product.biz.*"%><%@pageimport="member.product.model.*"%><%response.setContentType("text/html;charset=gbk");request.setCharacterEncoding("gbk");%><%Stringsql="select*fromProduct";StringerrMessage="";ProductBizproductBiz=newProductBiz();ProductEntity[]products=null;try{products=(ProductEntity[])productBiz.findByQueryString(sql);}catch(Exceptione){errMessage=e.getMessage();}if(products==null)errMessage="没有任何产品!";%> 产品列表<%@includefile="../stafftop.jsp"%>新增产品编号类型名称出产地区导演主演出品日期是否缺货  <%if(products!=null)for(inti=0;i<%=products[i].getProduct_Number()%><%=products[i].getProduct_Type()%><%=products[i].getProduct_Name()%><%=products[i].getProduct_Language()%><%=products[i].getProduct_Director()%><%=products[i].getProduct_Actor()%><%=products[i].getProduct_Date()%><%=products[i].getProduct_Status()%>target=_blank>详细信息)"><%}else{%><%=errMessage%><%} %>functiondeleteProduct(id){if(confirm("确认删除该产品记录么?"))self.location="productdelete.jsp?ID="+id;}productlist.jsp的运行效果如图10-22所示:图10-22productlist.jsp运行效果注意到productlist.jsp中包含了staff.jsp和stafftop.jsp,前者用于判断当前用户是否为俱乐部员工,后者用于包含公共的图片和文字,其源代码如下所示:staff.jsp<%if(session.getAttribute("Staff")==null)response.sendRedirect("../stafflogin.jsp");%>stafftop.jsp<%@pageimport="member.staff.model.StaffEntity"%><%@pagecontentType="text/html;charset=GBK"%>会员服务系统<% StaffEntitys=(StaffEntity)session.getAttribute("Staff");if(s!=null){out.print("欢迎您,"+s.getStaff_Account());out.print("|注销");}elseout.print("您无权访问该页面!");%>
在图10-22中点击“新增产品”链接,进行新增产品操作,product.jsp实现了新增产品,其效果如图10-23所示:图10-23product.jsp运行效果product.jsp<%@includefile="../staff.jsp"%><%@pagecontentType="text/html;charset=GBK"%><%@pageimport="member.product.biz.*"%><%@pageimport="member.product.model.*"%><%@pageimport="member.tools.util.BaseUtil"%><%response.setContentType("text/html;charset=gbk");request.setCharacterEncoding("gbk");%><%! //该函数用于从当前表单中获取各项数据,并将其封装成ProductEntity对象publicProductEntitygetProduct(HttpServletRequestrequest){ProductEntityproduct=newProductEntity();product.setID((newInteger(request.getParameter("ID"))).intValue());product.setProduct_Actor(request.getParameter("Product_Actor"));product.setProduct_Date(java.sql.Date.valueOf(request.getParameter("Product_Date")));product.setProduct_Director(request.getParameter("Product_Director"));product.setProduct_Instruction(request.getParameter("Product_Instruction"));product.setProduct_Language(request.getParameter("Product_Language"));product.setProduct_Name(request.getParameter("Product_Name"));product.setProduct_Number(request.getParameter("Product_Number"));product.setProduct_PromotionPrice((newFloat(request.getParameter("Product_PromotionPrice"))).floatValue());product.setProduct_Status(request.getParameter("Product_Status"));product.setProduct_Type(request.getParameter("Product_Type"));product.setProduct_UnitPrice((newFloat(request.getParameter("Product_UnitPrice"))).floatValue());returnproduct;}%><%//type参数用以标识操作类型,add表示添加,edit表示修改Stringtype=request.getParameter("type");//action参数用以判断表单是否提交Stringaction=request.getParameter("action");//id用以标识产品IDintid=(newInteger(request.getParameter("ID"))).intValue();//errMessage表示错误提示信息StringerrMessage="";//产品对象ProductEntityproduct=newProductEntity();//如果表单被提交,则保存当前产品信息if(action!=null){ProductBizproductBiz=newProductBiz();product=getProduct(request);try{//如果是添加产品if(id==0)productBiz.addProduct(product);//如果是修改产品信息elseproductBiz.updateProduct(product);response.sendRedirect("productlist.jsp"); }catch(Exceptione){errMessage=e.getMessage();}}else{if(type.equals("edit")){ProductBizproductBiz=newProductBiz();try{product=(ProductEntity)productBiz.findById("Product",id);}catch(Exceptione){errMessage=e.getMessage();}}}%>产品基本信息<%@includefile="../stafftop.jsp"%>">产品基本信息影片类型:>动作片>喜剧片>科幻片>战争片>动画片 >论理片>言情片>电视剧>其他名称:>*编号:>出产地区:>国产>港台>韩日>欧美>其他单价: >*促销价:>导演:>主演:>出品日期:>简介:<%=product.getProduct_Instruction()%>是否缺货:>否>是 >
<%=errMessage%>functionsaveProduct(){if(validate())document.forms[0].submit();}functionvalidate(){vardoc=document.forms[0];if(doc.Product_Name.value==""){alert("产品名称不能为空");returnfalse;}if(doc.Product_UnitPrice.value==""){alert("产品单价不能为空");returnfalse;}returntrue;}productdelete.jsp实现了音像产品的删除,其源代码如下所示:productdelete.jsp<%@includefile="../staff.jsp"%><%@pagecontentType="text/html;charset=GBK"%><%@pageimport="member.product.biz.*"%><%@pageimport="member.product.model.*"%><%intid=(newInteger(request.getParameter("ID"))).intValue();try{ProductBizproductBiz=newProductBiz(); productBiz.deleteById("Product",id);response.sendRedirect("productlist.jsp");}catch(Exceptione){out.print(e.getMessage());}%>读者观察代码不难发现,员工对于产品的操作和会员对于产品的操作,其源代码实现有很多相似之处。员工还可以对会员信息进行类似维护工作,其实现思想和员工对产品的维护工作非常类似,此处不再赘述。读者参照已有的实例代码,完全可以自行实现。本章小结本章以音阶俱乐部的网上会员服务系统为实例背景,从需求分析到系统构架设计、数据库设计、系统实现,都作了详细介绍。读者通过此实例,可以加深对JSP的认识,也可以体会多层构架模式的优点及其如何结合JSP进行实现。读者还可以进一步考虑,例如如果本实例如果采用Struts,在实现方式上会有哪些不同;又比如数据库改用其他关系数据库,原系统由需要做哪些调整。'