您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 实例二:用户密码修改
用户往往要更改自己的登录密码,现在就用Struts和Hibernate来实现它。由于这个过程需要对数据库进行修改等操作,所以要比前一节实例稍复杂些。通过这个实例可以巩固所学的Struts、Hibernate以及配置等知识。4.3.1总体设计在前一个实例的基础上继续开发,加上修改密码的功能。加上修改密码的逻辑,主要是在新建立的Action类里面完成。在后端,可以沿用第一个实例中的数据库表和Hibernate映射,而不需要增加新的字段。在前端,当用户需要改变登录密码时,用新建立的Action类进行验证和处理,看数据库中是否有这个用户,并验证旧的和新的密码,如果一切没有问题,则修改数据库,使新密码生效,否则显示错误信息,如图4-43和图4-44所示。图4-43图4-444.3.2具体实现(1)要增加一个处理密码修改逻辑的Action类——ChangePasswordAction,其主要工作是:判断需要修改的用户是否是合法用户,然后判断是否输入了正确的旧密码,两次输入的新密码是否一致。若通过了这些验证,就调用Hibernate方法来修改数据库,修改用户的密码。ChangePasswordAction.java的完整代码见后面的代码列表,这里简单介绍其中的主要内容。①下述代码表示通过ActionForm接受用户的输入数据。LoginFormloginForm=(LoginForm)form;Stringusername=loginForm.getUsername();Stringpassword=loginForm.getPassword();StringnewPassword=loginForm.getNewPassword();StringconfirmPassword=loginForm.getConfirmPassword();②下述代码表示如果用户两次输入的密码不一致,设置ActionForm里面的错误信息,并做页面跳转。在这里可以看到,ActionForm不仅仅从页面传递数据到Action类,而且也能保存Action的状态,并能在页面上访问。所以直白地说,ActionForm就是用来在Action和页面之间保持和传递数据的。if(!newPassword.equals(confirmPassword)){loginForm.setErrorMessage(Yourpasswordentrisdidnotmatch!);returnmapping.findForward(change_failure);}③下述代码表示将User从进行Hibernate查询得到的List中取出来,并设置其新密码,然后用session.save()将对象持久化。这种方式体现了Hibernate带来的方便性。user=(User)userList.get(0);user.setPassword(newPassword);session.save(user);//使用session.save()方法在数据库中插入数据(2)其次在LoginForm中增加两个字段,如下所示。privateStringnewPassword;privateStringconfirmPassword;然后增加publicvoidresetManually()方法。该方法用来清空ActionForm中的数据,否则会在不同的request中遗留上次输入的数据。publicvoidresetManually(){username=null;password=null;newPassword=null;confirmPassword=null;errorMessage=null;}必要的时候在Action类中调用此方法。(3)修改Struts-config.xml文件。在action-mapping下增加一个action,此Action仍然使用LoginForm。actionname=loginFormpath=/changetype=ChangePasswordActionforwardname=change_successpath=/change_success.jsp/forwardforwardname=change_failurepath=/change_failure.jsp/forward/action(4)增加3个JSP页面:change_password.jsp、change_success.jsp和change_failure.jsp。下面是change_password页面中的form部分代码。html:formaction=change.domethod=posttableborder=0cellspacing=0cellpadding=0align=lefttrtd用户名:/tdtdhtml:textproperty=username//td/trtrtd旧密码:/tdtdhtml:passwordproperty=password//td/trtrtd新密码:/tdtdhtml:passwordproperty=newPassword//td/trtrtd新密码确认:/tdtdhtml:passwordproperty=confirmPassword//td/trtrtdhtml:submitproperty=changevalue=确认/inputtype=buttonvalue=返回onClick=location.href='/Example2/login.jsp'/td/tr/table/html:form这里采用html:password标签接受用户的密码输入。(5)下面是完整的文件代码列表。①ChangePasswordAction.java代码如下所示:importorg.apache.struts.action.*;importjavax.servlet.http.*;importjava.io.IOException;importjavax.servlet.ServletException;importjava.util.ArrayList;importorg.hibernate.*;importorg.hibernate.cfg.*;/***@authorChaoWu**Description:ThisclassisaStrutsActionclassusedtodothevalidation*workandchangethepassword.*p**Copyright:*p*/publicclassChangePasswordActionextendsAction{/***Thismethoddealswiththeactionsneedtochangethepassword*@parammapping*@paramform*@paramreq*@paramres*@return*/publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestreq,HttpServletResponseres)throwsIOException,ServletException{LoginFormloginForm=(LoginForm)form;//得到用户输入的用户名,密码,新密码和新密码确认Stringusername=loginForm.getUsername();Stringpassword=loginForm.getPassword();StringnewPassword=loginForm.getNewPassword();StringconfirmPassword=loginForm.getConfirmPassword();//判断新密码和新密码确认是否一致if(newPassword!=null&&confirmPassword!=null){//Notthesameif(!newPassword.equals(confirmPassword)){loginForm.setErrorMessage(Yourpasswordentrisdidnotmatch!);returnmapping.findForward(change_failure);}}else{//若不一致,返回错误信息,并要求用户重新输入loginForm.setErrorMessage(Pleaseenterthenewpasswordtwice!);returnmapping.findForward(change_failure);}//若新密码通过,则判断是否有此用户,以及其密码是否正确if(username!=null){//Whetherit'savalidusertry{SessionFactorysf=newConfiguration().configure().buildSessionFactory();Sessionsession=sf.openSession();Transactiontx=session.beginTransaction();//在数据库中寻找此用户StringsqlQuery=selectufromUseruwhereu.username='+username+';QuerylQuery=session.createQuery(sqlQuery);ArrayListuserList=(ArrayList)lQuery.list();Useruser=newUser();//存在此用户if((null!=userList)&&(userList.size()0)){user=(User)userList.get(0);if(!user.getPassword().equals(password)){loginForm.setErrorMessage(Invaliduserorincorrectpassword!);returnmapping.findForward(change_failure);}else{//如果存在此用户,并且密码正确,则修改密码为新密码if(newPassword!=null){user.setPassword(newPassword);//将新密码保存到数据库中session.save(user);}else{loginForm.setErrorMessage(Pleaseentertheoldpassword!);returnmapping.findForward(change_failure);}}}else{//不存在此用户loginForm.setErrorMessage(Invaliduserorincorrectpassword!);returnmapping.findForward(change_failure);}tx.commit();session.close();}catch(HibernateExceptione){e.printStackTrace();loginForm.setErrorMessage(Error!);returnmapping.findForward(change_failure);}}else{loginForm.setErrorMessage(Pleaseentertheusername!);returnmapping.findForward(change_failure);}//成功完成密码修改returnmapping.findForward(change_success);}}②LoginAction.java如下所示:importo
本文标题:实例二:用户密码修改
链接地址:https://www.777doc.com/doc-3167182 .html