Java Wed应用---商城会员管理
Java Wed应用起源
Java从1995 年发布以来,刮起的热潮从未消退。这个最初为电视盒等小型设备设计的编程语言,到如今已经成为网络应用领域当之无愧的王者。TIOBE 每月发布的世界编程语言排行榜上,Java 总是占据第一的位置,没有半点悬念。
随着网络技术的迅猛发展,国内外的信息化建设已经进入以 Web应用为核心的阶段,而Java 语言与平台无关、面向对象、安全性好、多线程等优异的特性很适合进行 Web 开发。也正因为如此,越来越多的程序员和编程爱好者走上了JavaWeb应用开发之路。
Java Wed应用
Java Web应用已经渗透在我们实际生活中的各行各业,例如,网易的邮件系统、清华大学的本科招生网等。此外,由于 Java提供了较高的安全性能,在安全级别要求高的领域,JavaWeb应用技术得到了广泛的应用。例如,在银行金融行业中,中国工商银行、中国农业银行、中国建设银行、中国交通银行、中国邮政储蓄银行、中国光大银行的网上银行都采用了Java Web 技术。
一、商城会员管理
商城会员管理模块主要实现新会员的注册、老会员的登录、会员信息的修改、会员密码找回等功能。新会员在注册时,系统会验证用户填写的会员名、电子邮件地址、密码和验证码等信息。例如,验证会员名是否已经存在,电子邮箱地址是否已被其他会员使用,两次密码输入是否一致等。会员只有在登录后才可以进行商品购买、查看订单、修改会员信息等操作。会员每次购物生成的订单及订单明细都会被保存到相应的数据库表中,会员在登录后就可以通过相关操作进行查询。
1.会员登录模块
功能说明:
E-STORE电子商城的注册用户在登录之前与未注册的游客一样,可以浏览和查询商品,但不能购买商品,也不能进行查看购物车、订单等操作。会员登录模块实现用户的登录功能,用户输入用户名和密码,单击“登录”按钮,由系统验证用户的合法性,如果输入正确,系统会自动保存会员信息并在页面上显示“已登录”的提示,页面上商品的显示内容和操作也会较游览用户有一些改变,允许会员进行购买商品、修改会员信息、查看购物车、订单等操作。
E-STORE 电子商城的注册会员在登录前后的页面显示图如下,
注册用户登录:
注册用户登录成功:
2.流程分析与设计
1、设计数据库
数据表的概念设计:
会员信息实体:会员信息实体包括会员编号、会员名称、登录密码、真实姓名、电子邮件、找回密码问题、问题答案等属性。其中,找回密码问题和问题答案用来实现会员遗忘登录密码时的找回功能。
会员信息实体图如下:
数据表的逻辑结构:
会员信息表结构:会员信息表用来保存E-STORE 中所有注册会员的信息,数据表命名为“tb customer”,该表的结构如下:
在数据库中创建表:
启动 SQLy0g,打开 estoredb 数据库,展开如图 4.4 所示的“数据库”选项,展开“estoredb”数据库,使用鼠标右键单击表节点,在弹出的快捷菜单中执行“创建表”命令,如图 4.5所示,将弹出用来创建数据库表的对话框。
展开控制台根目录:
创建数据库表:
根据会员信息表所示的数据表“tb_customer”的结构设计数据表,如下图所示:
其中,会员名称“user name”字段被设置为主键,以避免会员同名。
2、数据库会员实体类设计
会员登录验证需要进行后台数据库查询,查询结果以会员实体类对象返回,登录后该会员信息在本次网站访问期间都可以用此对象的形式保存。因此需要设计数据库会员实体类“CustomerEntity”,类的成员变量命名分别与数据库会员表字段名同名,并为所有成员变量的存取设计Set和Get成员方法,称为访问器。当要对会员表的记录进行访问时,用类“CustomerEntity”实例代表表中记录,对数据库进行读操作时,使用该类的 getXxx方法获取记录各字段的信息,当对数据库进行写操作时,使用该类的setXxx()方法将要写入记录的信息先赋值该类的对象,再将对象作为方法参数写入数据库。
3、数据库会员表操作类设计
会员在前台页面进行登录验证操作需要查询数据库会员表,设计CustomerDao数据库操作类从页面分离对数据库会员表的访问。
创建 CustomerDao 类并添加相应数据库查询的方法:
方法参数是待验证的会员名,由页面元素提交。方法的返回值为会员实体类的对象,代表查询到的会员记录。由于会员表的name字段被设计成主键,因而在给定的name查询条件下,该方法返回的记录只能唯一,或者为空。如果返回的记录为空,代表数据库中不存在这个会员。
4、功能实现流程设计
(1)在会员登录页面“login,jsp”中输入会员的用户名和密码,以请求参数的形式提交给userLoginResultjsp页面进行处理。在lef.jsp 页面中使用指令:
将1oginjsp包含在left.jsp中,添加登录模块效果如图下:
(2)userLoginResultjsp页面获取页面请求参数用户名与密码。
(3)以用户名为参数调用ProductDao 类的selectProductEntity 方法,查询数据库表。
(4)查询结果为空,提示“会员不存在”,否则将返回的会员实体对象进行保存。
(5)将实体对象的密码与页面请求参数密码(即用户在登录时输入的密码)进行比较,密码不一致,登录失败,页面提示重新登录,系统页面跳转到首页。
(6)密码验证一致,则登录成功,系统显示成功登录信息,页面跳转至商品展示页面,同时将会员信息保存在会话中,以供会员本次访问网站时使用。
会员登录功能流程图如下:
3.编程详解
1、创建会员实体类“CustomerEntity”
在 cn.estore.entity包中创建会员实体类“CustomerEntity”,实现代码如下:
2、创建CustomerDao 类
在cn.estore.dao包中创建CustomerDao 类,并添加selectCustmoerEntity 方法。具体实现代码如下:
3、创建“1oginjsp”
在“pages/common/enparts”目录下创建“1oginjsp”,设计提交表单,表单元素包用户名和密码输入框,表单以Po方法提交,则表单的内容将以页面请求参数的形式提交
userLoginResultjsp页面,具体实现代码如下:
其中,代码“<form name="form" method="post" action="…/userLoginResult.jsp" onSubmit-"retumm checkEmpty(form)”>”指明了本页面提交表单名称(标识)为form,在表单提交之前会触发 onSubmit 事件,进行表单内容的验证,如果验证不通过(即:以form为参数调用checkEmpty函数,结果返回“false”),则表单不会提交。
由于loginjsp包含在left,jsp页面中,所以可以使用第2章中在left.jsp 页面中添加的checkEmpty函数验证表单输入是否为空。
4、创建userLoginResult.jsp 页面。
①在 pages 目录下新建一个Customer 目录,专门存放与会员管理相关的页面。然后在Customer 目录下创建页面“useroginResult.jsp”,在页面中引入类“CustomerEntity”和类“CustomerDao”,并生成各自的对象,当用户的信息以请求参数的形式提交到页面userLoginResult.jsp后,使用 Request 对象的 getParameter 方法获取参数“name”的值,据此,调用类 ProductDao 对象的selectCustomerEntity方法查询数据库,进行服务器端验证。
②判断方法“selectCustomerEntity”的返回值,如果密码输入信息为空或密码不正确,提示出错信息,页面返回,其实现代码如下:
其中,信息的提示和页面返回都是使用JavaScript代码完成的,因为在此时页面己经跳转到显示登录结果的页面了,要想返回到刚才登录信息的填写页面,可以使用avaSeript的代码“history.go(-1)”实现。History是浏览器的一个对象,其代表了用户在网站上不同页面之间访问页面的历史。History的g0方法实现在这个浏览历史中前进或后退。
用户在访问网站过程中,网站有责任保护登录会员的个人信息,例如,会员的登录用户名和密码信息,因此在E-STORE 工程中定义了一个Encrypt类用于对字符串进行加密和解密,具体代码请参见本书配套程序“src/cn.estore.uti1”目录。
③ 如果用户登录信息验证都正确,用户信息将存放在 CustomerEntity 类的对象“userEntity中,此对 象是页面“userLoginResult.jsp”的内部对象,仅在该页面范围内存在,作用范围也限于该页面,当页面跳转后,此对象就不可再用了,而会员的信息在其他页面的访间中也会用到,因此,该对象应该保存在多个页面都能访问的地方。
为了能够保存用户的访问信息,在此需要用到会话对象Session。用户从访问E-STORE电子商城的第一个网页开始,直到离开该网站结束,被定义为一次“会话”,在服务器端,JSP引擎会产生一个 Session 对象代表此次会话。一个Session 对象属于一个特定的会话,由服务器负责产生、管理和销毁,而对于JSP程序员来说,Session 对象被作为JSP 页面的隐含对象而存在,程序员可以在JSP页面中直接使用。Session对象的生存期和作用范围都是这次会话,因此,可以将用户登录的信息存放在 Session对象中,作为Session 对象的一个属性而存在。Session 对象提供了 setAttribute 方法完成其属性值的添加,将用户信息对象以属性名为“user”的属性存放在 Session 对象中,并同时保存会员登录名“name”。
④会员登录成功后,页面跳转到首页,在首页的左侧会显示注册会员登录成功所示的会员信息。
在 JavaScript 中通过设置“window.location.href-URL”可以实现页面的跳转。
5、允许登录会员查看商品详细信息,修改相关超链接。
会员登录后,可以进行购物操作,因此对商品展示页面、新品、特价、搜索结果页面的商品显示信息需要进行修改,让会员可以进行购物操作。以“mainjsp”为例,将原来显示“登录后才能购买”的位置修改为以下代码,为登录后的用户添加“查看详细内容”超链接。
其中,<a href-"#" onClick = "window.open (''showProductByld,jsp ?i= <%= e.getld(%>'width=500,height-200);">查看详细内容</a>,是使用JavaScript 代码实现打开页面“showProductByld,jsp”,并传送请求参数商品编号。
4.会话机制与 Session 对象
1.会话机制
用户在浏览某个网站时,从打开浏览器到关闭浏览器的过程称为一个会话。当一个客户访问一个服务器时,可能会在这个网站的几个页面之间反复连接,反复刷新一个页面,由于 HTTP协议自身的特点,用户每执行一个网站页面的访问都需要和 Web服务器重新建立连接。同一用户的多次访问数据的维护无法由HTTP协议自身完成,而网站的应用程序应当通过某种办法来维护同一个用户访问的数据,这就是会话机制。需要注意的是,一个会话的概念需要包括特定的用户、特定的服务器及连续的操作时间。不同用户、不同服务器及在不同时间内的连续操作都是处在不同的会话中的。
正如 E-STORE 的实现那样,JavaWeb应用通常使用javax.servlet.http.HttpSession 类的子类的对象 Session 来维护会话。Session对象的标识(即Session对象的I)在用户第一次访问 Web应用时由服务器自动产生并保持唯一性,在网站的开发时,可以使用Session的特定方法来获取其对应的 J 值。
用 Session 对象来保存每个用户的状态信息,以便在 HTTP 协议下也能跟踪每个用户的操作状态。其中 Session对象本身保存在服务器上,而把Session的I 随响应一起发送并保存在客户机的 Cookies 中,当用户在此访问同一 Web应用时,该ID 又随请求再次发送到服务器,服务器根据此 ID 査找所有 Session 对象,如果找到匹配的 Session对象,则可在这个 Session 对象上取出属于该用户的状态信息,实现非连接下的状态维护。在很多服务器上,如果测试用户浏览器支持 Cookies,就直接使用Cookies保存Session对象的ID,如果不支持或者由于用户禁用了Cookies,就自动使用 URL-rewriting(URL重写)技术保存 Session对象的 ID。直到客户端用户关闭浏览器后,服务器端该客户的 Session 对象才被注销,进而和用户的会话对应关系消失,当客户端重新打开浏览器再连接到该服务器时,服务器又为该客户再创建一个新的Session对象实现一个新的会话的维护。
2.Session 对象的常用方法
Session 对象为维护会话信息的每个流程提供了方便的存取信息方法,常用的方法如下:
(1) public String getId():返回 Session 创建时 JSP引擎为它设的唯一D,每个 Session的ID 是不同的。
(2) public void setAttribute(String key,Object obj):将参数 Object 指定的对象 obj添加到Session对象中,并为添加的对象属性指定一个索引关键字。
(3) public Object getAttribute(String key):获取 Session 对象中含有关键字的属性对象(4)public Boolean isNew():判断 Session 对象是否是一个新建的 Session 对象。
3.提示:
request.getParameter()是从上一个页面用户提交的数据中取得,而Session 存在范围是用户的整个会话期。Request 只是一个请求,简单说就是在页面上的一个操作,结果输出之后,Request 就结束了。而 Session 可以跨越很多页面,可以理解为客户端同一个浏览器窗口发出的多个请求,在这些请求之间都可以传递信息。