第4章注册、登录和注销4.1开发步骤4.2知识点:DAO模式4.3知识点:Hibernate:Query接口4.4知识点:Hibernate:Query接口4.5知识点:Struts2:Action4.6知识点:Struts2:OGNL表达式4.7知识点:Struts2:标签库第4章注册、登录和注销用户注册是网上书店的基本功能之一。用户如果想从网上书店购买商品,必须有一个网上书店的账号,用户可以通过“注册”功能获得账号,注册页面效果如图4-1所示。当注册成功之后,会进入注册成功页面;如果注册信息不对,则显示注册失败。图4-1用户注册界面第4章注册、登录和注销当用户购物完成离开网站的时候,应该让用户注销,关闭会话。在用户没有登录的时候,菜单栏目应该显示包含“登录”;当用户登录以后,菜单栏目显示包含“注销”。效果如图4-3、图4-4所示。图4-3用户没有登录时的菜单图4-4用户登录以后的菜单4.1开发步骤在J2EE的开发中,服务器端Web应用程序分为若干层。每层在处理程序上都有一项明确的责任。不应该将它们混合,并且每层都要与其它层分开,各个层之间通过通信接口联系。如图4-5所示。Spring容器客户端浏览器数据库Web服务器(Tomcat)ActionServiceDAO核心控制器JSP视图JavaBeans图4-5J2EE的分层结构4.1开发步骤●DAO层DAO层完成连接数据库增删改等实现细节,例如SQL语句怎么写、怎样把对象放入数据库等等。DAO将底层数据访问操作和业务层逻辑分离开,对业务层提供面向对象的数据访问接口。而业务层调用DAO接口实现各种业务方法,如验证用户密码是否正确。●Service业务层业务层位于上层的表示层和控制层,依赖于下层的业务层的实现(DAO),而下层业务层不应该依赖于上层的表示层和控制器的实现。业务层提供了处理应用程序的业务逻辑和业务校验,如验证用户登录系统的密码是否正确;提供了管理事务,允许与其它层相互作用的接口。Servcie层是面向功能的,一个功能模块比如说银行等级并完成一次存款,把请求给Service层,Service层将这个功能分解成许多步骤调用底层的DAO来实现这次存款。有时,会看到Servcie层和DAO层的方法是类似的,是因为Service层的需求不是很复杂,不用再对Service层完成太多包装或者处理就可以直接调用DAO的方法。●Action控制层控制层的控制器Action接受用户的输入并调用业务层的业务方法和表示层的组件去完成用户的请求。当Web应用单击Web页面中的提交按钮来发送HTML表单时,控制器接受请求并调用相应的业务层方法去处理请求,然后调用相应的视图来显示业务层返回的数据。4.1开发步骤Struts中的控制器由ActionServlet类和Action类来实现,ActionServlet主要负责接受HTTP请求信息,根据配置文件struts-config.xml的配置信息,把请求转发给适当的Action对象。如果该Action对象不存在,ActionServlet会先创建这个Action对象,Action充当用户请求和业务逻辑处理之间的适配器,其功能是将请求与业务逻辑分开,Action根据用户请求调用相关的业务逻辑组件,Action类侧重控制应用程序的流程,而不是实现应用程序的逻辑。●Spring服务器各种组件的生成都是由Spring容器来控制,被看作是Spring中的一个Bean,它可享受Spring提供的所有服务(依赖注入、实例管理、事务管理等)。●JSP视图层视图是用户看到并与之交互的界面,视图向用户显示相关的数据,并能接受用户的输入数据,但不能进行任何实际的业务处理。视图可以向业务层查询业务状态,但不能改变业务层,视图还可以接受模型发出的数据更新事件,从而对用户界面进行同步更新。视图其实就是一组JSP文件,在这些JSP文件中没有业务逻辑,也没有业务层信息,只有标签,这些标签可以是标准的JSP标签或客户端标签,如Struts标签库中的标签。使用框架的最大好处是不仅在于减少重复开发工作量,缩短开发时间,降低开发成本,同时,使程序设计更加合理,程序运行更加稳定等。基于这些原因,基本上现在开发中,都会选择某些合适的开发框架,从而达到快捷,高效的目的。4.1.1注册开发为5个步骤:步骤1DAO步骤2Service步骤3Action步骤4Spring步骤5JSP具体步骤如下:步骤1DAODAO层所涉及的类,接口如图4-6所示。图4-6DAO层主要类图4.1.1注册其中,IUserDAO接口中的saveUser()用于将一个User对象保存到数据库中。UserDAO类中的saveUser()具体实现了这个方法。BaseDAO是将对数据库进行的操作进行封装,这样,在UserDAO中就可以直接使用Session。在这里使用了DAO模式。这三个类和接口在工程中的位置如图4-7所示。图4-7文件在项目中的位置4.1.1注册创建IUserDAO.java,代码如下://包名为org.apex.bookstore.daopackageorg.apex.bookstore.dao;//引入另一个包org.apex.bookstore.vo的User类importorg.apex.bookstore.vo.User;//定义用户DAO的接口IUserDAOpublicinterfaceIUserDAO{//保存用户注册的信息publicvoidsaveUser(Useruser);}4.1.1注册创建BaseDAO.java,代码如下://包名为org.apex.bookstore.daopackageorg.apex.bookstore.dao;//引入需要的类importorg.hibernate.SessionFactory;importorg.hibernate.classic.Session;//对一些基本操作进行封装,在它的子类中可以直接使用publicclassBaseDAO{privateSessionFactorysessionFactory;publicSessionFactorygetSessionFactory(){returnsessionFactory;}publicvoidsetSessionFactory(SessionFactorysessionFactory){this.sessionFactory=sessionFactory;}publicSessiongetSession(){Sessionsession=sessionFactory.openSession();returnsession;}}4.1.1注册创建UserDAO.java,代码如下://包名org.apex.bookstore.dao.impl;packageorg.apex.bookstore.dao.impl;//引入需要的类importjava.util.List;importorg.apex..bookstore.dao.BaseDAO;importorg.apex..bookstore.dao.IUserDAO;importorg.apex.bookstore.vo.User;importorg.hibernate.Query;importorg.hibernate.Session;importorg.hibernate.Transaction;publicclassUserDAOextendsBaseDAOimplementsIUserDAO{//保存用户的信息到数据库中publicvoidsaveUser(Useruser){Sessionsession=getSession();//将user对象保存到数据库中Transactiontx=session.beginTransaction();session.save(user);tx.commit();session.close();}}4.1.1注册●步骤2ServiceService层主要用于处理各种业务。主要的类和接口是:IUserService,UserService,如图4-8所示。其中,IUserService是一个接口,定义了两个方法,saveUser()方法用于将User对象存储到数据库中。validateUser()方法用于验证用户输入的名称和密码是否正确。UserService实现IUserService接口,通过IUserDAO类,实现了这两个方法。图4-8Service层的主要类4.1.1注册文件IUserService.java和UserService.java在项目中的位置如图4-9所示。图4-9文件在项目中的位置4.1.1注册IUserService.java代码如下://包名org.apex.bookstore.servicepackageorg.apex.bookstore.service;//引入需要的类importorg.apex.bookstore.vo.User;publicinterfaceIUserService{//用户注册时,保存用户的信息publicvoidsaveUser(Useruser);//用户登陆时,验证用户的信息publicUservalidateUser(Stringusername,Stringpassword);}UserService.java代码如下://包名org.apex.bookstore.service.implpackageorg.apex.bookstore.service.impl;//引入需要的类importorg.apex.bookstore.dao.IUserDAO;importorg.apex.bookstore.service.IUserService;importorg.apex.bookstore.vo.User;4.1.1注册publicclassUserServiceimplementsIUserService{//属性userDAO,service层调用DAO层完成相关操作privateIUserDAOuserDAO;//保存用户注册时的信息publicvoidsaveUser(Useruser){this.userDAO.saveUser(user);}//用户登录时,用于验证用户的信息publicUservalidateUser(Stringusername,Stringpassword){returnnull;}//属性userDAO的get方法publicIUserDAOgetUserDAO(){returnuserDAO;}//属性userDAO的set方法publicvoidsetUserDAO(IUserDAOuserDAO){this.userDAO=userDAO;}}4.1.1注册●步骤3ActionUserAction类含有是三个方法,如图4-10所示。register()方法用于用户注册,execute()方法用于用户登录,logout()方法用于用户注销。这些方法的实现依赖于Service层,在属性中,有一个userService属性,它的类型是IUserServe。图4-10Action类图4.1.1注册UserAction.java文件在项目中的位置如图4-11所示。图4-11文件在项目中的位置4.1.1注册UserAction.java代码如下:struts.xml文件中配置UserAction,struts.xml在项目中的位置如图4-12所示。图4-12struts.xml在项目中的位置!DOCTYPEstrutsPUBLIC-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN