课程设计实训教学示例项目——《网上银行账户管理系统》——在项目中实现对XML文件进行解析的各种功能
课程设计实训教学示例项目《网上银行账户管理系统》——解决系统中可能存在的SQL注入式攻击的安全性问题
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——解决系统中可能存在的SQL注入式攻击的安全性问题1.1.1对系统中可能存在的SQL注入式攻击的安全性防患1、SQL 注入式攻击概述(1)SQL 注入式攻击SQL 注入式攻击是将其他的(恶意的)SQL 代码传递到某个应用程序中的行为,该代码通常被附加到该应用程序包含的合法SQL 代码中。
如果查询语句是select * from userInfo where userName='"+userName+"' and passWord='"+userPassWord+"'" 。
如果用户名是:admin,而密码为1' or '1'='1。
那么查询语句将会变成:select * from userInfo where userName ='admin' or '1'='1' and passWord ='1' or '1'='1'。
这样查询语句就通过了,从而就可以进入到系统的管理界面。
所有SQL 数据库都在不同程度上容易遭受SQL 注入式攻击,下面主要以SQL Server 数据库作为示例数据库来说明上述问题。
用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection(即SQL注入)。
(2)出现的场合1)当处理作为SQL 命令组成部分的用户输入时,应当特别注意可能发生的SQL 注入式攻击。
如果系统的身份验证是使用表单身份验证方式,则必须防止SQL 注入式攻击。
下面的语句存在注入攻击漏洞:ResultSet rs=stam.executeQuery("select * from userInfo where userName='" +userName + "' and passWord='"+ userPassWord + "'"); 如果对这样的SQL语句,采用下面的方式:select * from userInfo where userName ='' or'x'='x' or 'x'='' and password='1' 则会出现注入攻击漏洞。
课程设计实训项目——《网上银行账户管理系统》——构建基于J2EE Web Servlet组件技术的控制层(第1部分)
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——构建基于J2EE Web Servlet组件技术的控制层(第2/4部分)1.1.1构建后台管理控制层中的页面跳转Servlet组件1、添加AdminForwordServlet组件(1)包名称为com.px1987.webbank.servlet并继承于HttpServlet类(2)设置该AdminForwordServlet的URL-Pattern为/adminForwordAction.action(3)编程该AdminForwordServlet组件中的各个控制方法package com.px1987.webbank.servlet;import java.io.IOException;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.px1987.webbank.config.TargetPageNameConfig;public class AdminForwordServlet extends HttpServlet {private static final long serialVersionUID = 8443628335186891289L;public AdminForwordServlet() {super();}public void destroy() {super.destroy();}public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String action=request.getParameter("action");if(action.equals("forwardQueryUserInfo")){forwardQueryUserInfo(request, response);}else if(action.equals("forwardQueryUserInfoFrameSetTopFrame")){ forwardQueryUserInfoFrameSetTopFrame(request, response);}else if(action.equals("forwardQueryUserInfoFrameSetMainFrame")){ forwardQueryUserInfoFrameSetMainFrame(request, response);}else if(action.equals("forwardShowCleckUserInfo")){forwardShowCleckUserInfo(request, response);}else if(action.equals("forwardShowVIPUserInfo")){forwardShowVIPUserInfo(request, response);}else if(action.equals("forwardShowRegisterUserInfo")){forwardShowRegisterUserInfo(request, response);}else if(action.equals("forwardImagesUserInfo")){forwardImagesUserInfo(request, response);}else if(action.equals("forwardImageUserInfoFrameSetTopFrame")){forwardImageUserInfoFrameSetTopFrame(request, response);}else if(action.equals("forwardImageUserInfoFrameSetMainFrame")){ forwardImageUserInfoFrameSetMainFrame(request, response);}else if(action.equals("forwardReportsUserInfo")){forwardReportsUserInfo(request, response);}else if(action.equals("forwardReportsUserInfoFrameSetTopFrame")){ forwardReportsUserInfoFrameSetTopFrame(request, response);}else if(action.equals("forwardReportsUserInfoFrameSetMainFrame")){ forwardReportsUserInfoFrameSetMainFrame(request, response);}else if(action.equals("forwardDeleteCleckUserInfo")) {forwardDeleteCleckUserInfo(request, response);}else if(action.equals("forwardDeleteVIPUserInfo")){forwardDeleteVIPUserInfo(request, response);}else if(action.equals("forwardDeleteRegisterUserInfo")) {forwardDeleteRegisterUserInfo(request, response);}}// ************************下面为各个实际的页面跳转的方法******************* public void forwardQueryUserInfo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String forwardQueryUserInfo=TargetPageNameConfig.getProperty("forwardQueryUserInfo");RequestDispatcher oneRequestDispatcher=request.getRequestDispatcher(forwardQueryUserInfo);oneRequestDispatcher.forward(request, response);}public void forwardQueryUserInfoFrameSetTopFrame(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String forwardQueryUserInfoFrameSetTopFrame=TargetPageNameConfig.getProperty("forwardQueryUserInfoFrameSetTopFrame");RequestDispatcher oneRequestDispatcher=request.getRequestDispatcher(forwardQueryUserInfoFrameSetTopFrame);oneRequestDispatcher.forward(request, response);}public void forwardQueryUserInfoFrameSetMainFrame(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String forwardQueryUserInfoFrameSetMainFrame=TargetPageNameConfig.getProperty("forwardQueryUserInfoFrameSetMainFrame");RequestDispatcher oneRequestDispatcher=request.getRequestDispatcher(forwardQueryUserInfoFrameSetMainFrame);oneRequestDispatcher.forward(request, response);}public void forwardShowCleckUserInfo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }public void forwardShowVIPUserInfo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }public void forwardShowRegisterUserInfo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }public void forwardImagesUserInfo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String forwardImagesUserInfo=TargetPageNameConfig.getProperty("forwardImagesUserInfo");RequestDispatcher oneRequestDispatcher=request.getRequestDispatcher(forwardImagesUserInfo);oneRequestDispatcher.forward(request, response);}public void forwardImageUserInfoFrameSetTopFrame(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String forwardImageUserInfoFrameSetTopFrame=TargetPageNameConfig.getProperty("forwardImageUserInfoFrameSetTopFrame");RequestDispatcher oneRequestDispatcher=request.getRequestDispatcher(forwardImageUserInfoFrameSetTopFrame);oneRequestDispatcher.forward(request, response);}public void forwardImageUserInfoFrameSetMainFrame(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String forwardImageUserInfoFrameSetMainFrame=TargetPageNameConfig.getProperty("forwardImageUserInfoFrameSetMainFrame");RequestDispatcher oneRequestDispatcher=request.getRequestDispatcher(forwardImageUserInfoFrameSetMainFrame);oneRequestDispatcher.forward(request, response);}public void forwardReportsUserInfo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String forwardImagesUserInfo=TargetPageNameConfig.getProperty("forwardImagesUserInfo");RequestDispatcher oneRequestDispatcher=request.getRequestDispatcher(forwardImagesUserInfo);oneRequestDispatcher.forward(request, response);}public void forwardReportsUserInfoFrameSetTopFrame(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String forwardImageUserInfoFrameSetTopFrame=TargetPageNameConfig.getProperty("forwardImageUserInfoFrameSetTopFrame");RequestDispatcher oneRequestDispatcher=request.getRequestDispatcher(forwardImageUserInfoFrameSetTopFrame);oneRequestDispatcher.forward(request, response);}public void forwardReportsUserInfoFrameSetMainFrame(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String forwardImageUserInfoFrameSetMainFrame=TargetPageNameConfig.getProperty("forwardImageUserInfoFrameSetMainFrame");RequestDispatcher oneRequestDispatcher=request.getRequestDispatcher(forwardImageUserInfoFrameSetMainFrame);oneRequestDispatcher.forward(request, response);}public void forwardDeleteCleckUserInfo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }public void forwardDeleteVIPUserInfo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }public void forwardDeleteRegisterUserInfo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}public void init() throws ServletException {}}(4)部署该Servlet组件<servlet><servlet-name>AdminForwordServlet</servlet-name> <servlet-class>com.px1987.webbank.servlet.AdminForwordServlet </servlet-class></servlet><servlet-mapping><servlet-name>AdminForwordServlet</servlet-name><url-pattern>/adminForwordAction.action</url-pattern></servlet-mapping>1.1.2构建后台管理控制层中用户信息显示的Servlet组件1、添加AdminManageServlet组件(1)包名称为com.px1987.webbank.servlet并继承于HttpServlet类(2)设置该AdminManageServlet组件的URL-Pattern为/adminInfoManageAction.action(3)编程该AdminManageServlet组件中的各个控制方法package com.px1987.webbank.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class AdminManageServlet extends HttpServlet {public AdminManageServlet() {super();}public void destroy() {super.destroy();}public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();out .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");out.println("<HTML>");out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");out.println(" <BODY>");out.print(" This is ");out.print(this.getClass());out.println(", using the GET method");out.println(" </BODY>");out.println("</HTML>");out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();out .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");out.println("<HTML>");out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");out.println(" <BODY>");out.print(" This is ");out.print(this.getClass());out.println(", using the POST method");out.println(" </BODY>");out.println("</HTML>");out.flush();out.close();}public void init() throws ServletException {}}(4)部署该AdminManageServlet组件<servlet><servlet-name>AdminManageServlet</servlet-name><servlet-class>com.px1987.webbank.servlet.AdminManageServlet</servlet-class></servlet><servlet-mapping><servlet-name>AdminManageServlet</servlet-name><url-pattern>/adminInfoManageAction.action</url-pattern></servlet-mapping>1.1.3构建控制层中的用户信息管理的Servlet组件1、UserInfoManage Servlet(1)包名称为com.px1987.webbank.servlet,并且继承HttpServlet类(2)设置该UserInfoManageServlet的URL-pattern为/userInfoManageAction.action(3)编程该UserInfoManageServlet类package com.px1987.webbank.servlet;import java.io.IOException;import java.util.Date;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import mons.validator.GenericValidator; import org.springframework.context.ApplicationContext;import org.springframework.web.context.support.WebApplicationContextUtils; import erInfoActionForm;import erPassWordBean;import com.px1987.webbank.config.TargetPageNameConfig;import com.px1987.webbank.constant.WebBankAllConstants;import com.px1987.webbank.exception.WebBankException;import erInfoManageImpleFacade;import erInfoVO;import com.px1987.webbank.util.MD5JavaBean;public class UserInfoManageServlet extends HttpServlet {private static final long serialVersionUID = 7411827675133411230L;String forwardShowWebAppError=null;String showWebAppErrorAndReturn=null;String forwardShowInfoAndGotoTarget=null;ApplicationContext applicationContext=null;public UserInfoManageServlet() {super();}public void destroy() {super.destroy();}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { }public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { UserInfoActionFormoneUserInfoActionForm=doGetUserInfoFormData(request);// ***************下面是获得请求的类型并相应地跳转到目标处理方法中*********** if(oneUserInfoActionForm.getAction().equals("doUserLogin")){forwardDoUserLogin(request, response,oneUserInfoActionForm);}else if(oneUserInfoActionForm.getAction().equals("doGetPassWord")){ forwardDoGetPassWord(request, response,oneUserInfoActionForm);}elseif(oneUserInfoActionForm.getAction().equals("doGetUserPassWordAndUpdate")){ forwardDoGetUserPassWordAndUpdate(request,response,oneUserInfoActionForm);}else if(oneUserInfoActionForm.getAction().equals("doLogOut")){forwardDoLogOut(request, response,oneUserInfoActionForm);}elseif(oneUserInfoActionForm.getAction().equals("doUpdateUserPassWord")){forwardDoUpdateUserPassWord(request,response,oneUserInfoActionForm);}}public UserInfoActionForm doGetUserInfoFormData(HttpServletRequest request){ //*******下面是统一获得表单中的各个请求参数(其实这些代码可以由框架来完成)***** String action=request.getParameter("action");String verifyCodeDigit=request.getParameter("verifyCodeDigit");String type_User_Admin=request.getParameter("type_User_Admin");String userName=request.getParameter("userName");String userPassWord=request.getParameter("erPassWord");String confirmPassWord=request.getParameter("oneUserPassWordBean.confirmPassWord");String passWordAsk=request.getParameter("oneUserPassWordBean.passWordAsk"); String passWordAnswer=request.getParameter("oneUserPassWordBean.passWordAnswer"); String userNewPassWord=request.getParameter("erNewPassWord"); String aliaoName=request.getParameter("aliaoName");String userMail=request.getParameter("userMail");String userImage=request.getParameter("userImage");String userSex=request.getParameter("userSex");String userBirthDay=request.getParameter("userBirthDay");String stateName=request.getParameter("stateName");String cityName=request.getParameter("cityName");String userResume=request.getParameter("userResume");String userType=request.getParameter("userType");String userQQCode=request.getParameter("userQQCode");String userICQCode=request.getParameter("userICQCode");String userMSNCode=request.getParameter("userMSNCode");String userSign=request.getParameter("userSign");String emailVisible=request.getParameter("emailVisible");String acceptAdvise=request.getParameter("acceptAdvise");String adminUserType=request.getParameter("adminUserType");String workUnit=request.getParameter("workUnit");String studyHistory=request.getParameter("studyHistory");String studySchool=request.getParameter("studySchool");String idCardNo=request.getParameter("idCardNo");String userID=request.getParameter("userID");String registerTime=request.getParameter("registerTime");String validateFlag=request.getParameter("validateFlag"); UserInfoActionForm oneUserInfoActionForm=new UserInfoActionForm(); oneUserInfoActionForm.setAction(action);oneUserInfoActionForm.setVerifyCodeDigit(verifyCodeDigit); oneUserInfoActionForm.setType_User_Admin(type_User_Admin); oneUserInfoActionForm.setUserName(userName);UserPassWordBean oneUserPassWordBean=new UserPassWordBean(); oneUserPassWordBean.setUserPassWord(userPassWord); oneUserPassWordBean.setConfirmPassWord(confirmPassWord); oneUserPassWordBean.setPassWordAsk(passWordAsk); oneUserPassWordBean.setPassWordAnswer(passWordAnswer); oneUserPassWordBean.setUserNewPassWord(userNewPassWord); oneUserInfoActionForm.setOneUserPassWordBean(oneUserPassWordBean); oneUserInfoActionForm.setAliaoName(aliaoName); oneUserInfoActionForm.setUserMail(userMail); oneUserInfoActionForm.setUserImage(userImage); oneUserInfoActionForm.setUserSex(userSex); oneUserInfoActionForm.setUserBirthDay(userBirthDay); oneUserInfoActionForm.setStateName(stateName); oneUserInfoActionForm.setCityName(cityName); oneUserInfoActionForm.setUserResume(userResume); oneUserInfoActionForm.setUserType(userType); oneUserInfoActionForm.setUserQQCode(userQQCode); oneUserInfoActionForm.setUserICQCode(userICQCode); oneUserInfoActionForm.setUserMSNCode(userMSNCode); oneUserInfoActionForm.setUserSign(userSign); oneUserInfoActionForm.setEmailVisible(emailVisible); oneUserInfoActionForm.setAcceptAdvise(acceptAdvise); oneUserInfoActionForm.setAdminUserType(adminUserType); oneUserInfoActionForm.setWorkUnit(workUnit); oneUserInfoActionForm.setStudyHistory(studyHistory); oneUserInfoActionForm.setStudySchool(studySchool); oneUserInfoActionForm.setIdCardNo(idCardNo);oneUserInfoActionForm.setUserID(userID);oneUserInfoActionForm.setRegisterTime(registerTime);oneUserInfoActionForm.setValidateFlag(validateFlag);return oneUserInfoActionForm;}public void forwardDoUpdateUserPassWord(HttpServletRequest request, HttpServletResponse response,UserInfoActionForm oneUserInfoActionForm) throws ServletException, IOException{boolean okOrNot=false;UserInfoManageImpleFacade oneUserInfoManageImpleFacade=null;String type_User_Admin=oneUserInfoActionForm.getType_User_Admin();/** 下面对用户在注册表单中进行修改时的部分输入项目进行服务器端的验证*/String userName=oneUserInfoActionForm.getUserName();String userPassWord=oneUserInfoActionForm.getOneUserPassWordBean().getUserPassWord();String userNewPassWord=oneUserInfoActionForm.getOneUserPassWordBean().getUserNewPassWord();String confirmPassWord=oneUserInfoActionForm.getOneUserPassWordBean().getConfirmPassWord();UserInfoVO oneUserInfoVO=null;int type_User_Admin_Didgit=Integer.parseInt(type_User_Admin);try {//此时的oneUserInfoVO将是更加全面的信息(前台或者后台用户的信息)//没有将J2EE Web与Spring相互整合之前的实现方法// oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();applicationContext=WebApplicationContextUtils.getWebApplicationContext(thi s.getServletContext());oneUserInfoManageImpleFacade=(UserInfoManageImpleFacade)applicationContext.getBean("oneUserInfoManageImpleFacade");oneUserInfoVO=oneUserInfoManageImpleFacade.doGetOneUserInfo(userName, new MD5JavaBean().getkeyBeanofStr(userPassWord), new Integer(type_User_Admin_Didgit));}catch (WebBankException e) {request.setAttribute("errorText", e.getMessage());forwardShowWebAppError=TargetPageNameConfig.getProperty("forwardShowWebAppError");RequestDispatcher oneRequestDispatcher=request.getRequestDispatcher(forwardShowWebAppError);oneRequestDispatcher.forward(request, response);return;}switch(type_User_Admin_Didgit){//代表前台用户(此时的userType则代表不同类型的注册用户)case erType_RegisterUser:try{okOrNot=oneUserInfoManageImpleFacade.doUpdateOneRegisterUserPassWord(oneUs erInfoVO, new MD5JavaBean().getkeyBeanofStr(userNewPassWord));}catch (WebBankException e) {request.setAttribute("errorText", e.getMessage());forwardShowWebAppError=TargetPageNameConfig.getProperty("forwardShowWebApp Error");RequestDispatcher oneRequestDispatcher=request.getRequestDispatcher(forwardShowWebAppError);oneRequestDispatcher.forward(request, response);return;}break;//代表后台管理员(此时的adminUserType则代表不同类型的管理员用户)case erType_AdminUser:try{okOrNot=oneUserInfoManageImpleFacade.doUpdateOneAdminUserPassWord(oneUserI nfoVO, new MD5JavaBean().getkeyBeanofStr(userNewPassWord));}catch (WebBankException e) {request.setAttribute("errorText", e.getMessage());forwardShowWebAppError=TargetPageNameConfig.getProperty("forwardShowWebAppError");RequestDispatcher oneRequestDispatcher=request.getRequestDispatcher(forwardShowWebAppError);oneRequestDispatcher.forward(request, response);return;}break;}if(okOrNot) {// ******************* 更新Session中的用户信息 ******************* HttpSession session=request.getSession();UserInfoVO oneUserInfoVOInSession=(UserInfoVO)session.getAttribute("oneUserInfoVO");oneUserInfoVOInSession.setUserPassWord(newMD5JavaBean().getkeyBeanofStr(userNewPassWord));oneUserInfoVOInSession.setUserPassWordNoMD5(userNewPassWord);//更新session中的数据为了能够进行安全管理(会话跟踪)session.setAttribute("oneUserInfoVO", oneUserInfoVOInSession);request.setAttribute("targetURLPage","/pageForwordAction.action?action=forwardUserLogin");request.setAttribute("showInfoText",userName+"您好!您的系统注册密码信息修改成功,请重新进行系统登陆身份确认!");forwardShowInfoAndGotoTarget=TargetPageNameConfig.getProperty("forwardShowInfoAndGotoTarget");RequestDispatcher oneRequestDispatcher=request.getRequestDispatcher(forwardShowInfoAndGotoTarget);oneRequestDispatcher.forward(request, response);return;}else{request.setAttribute("errorText", "您的系统注册密码信息修改行为没有成功,请与管理员联系!");showWebAppErrorAndReturn=TargetPageNameConfig.getProperty("showWebAppErrorAndReturn");RequestDispatcher oneRequestDispatcher=request.getRequestDispatcher(showWebAppErrorAndReturn);oneRequestDispatcher.forward(request, response);return;}}public void forwardDoLogOut(HttpServletRequest request, HttpServletResponse response, UserInfoActionForm oneUserInfoActionForm) throws ServletException, IOException{HttpSession session=request.getSession();UserInfoVO oneoneUserInfoVO=(UserInfoVO)session.getAttribute("oneUserInfoVO");String userName=oneoneUserInfoVO.getUserName();//以便能够触发attributeRemoved事件session.removeAttribute("oneUserInfoVO");session.invalidate();request.setAttribute("targetURLPage","/pageForwordAction.action?action=forwardIndex");request.setAttribute("showInfoText",userName+"您好!您已经从本系统中在线退出,因此您将失除所有的权限。
课程设计实训教学项目《网上银行账户管理系统》——实现项目中后台系统管理员信息查询的数据分页显示功能
}
public boolean isFirstPage() {
return firstPage;
杨教授大学堂,版权所有,盗版必究。
3/12 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
} public void setFirstPage(boolean firstPage) {
this.firstPage = firstPage; } public boolean isHasNextPage() {
实现原理:翻页的时候从缓存中取出一页数据并显示输出。这种方法有两个主要的缺 点:一是用户可能看到的是过期数据;二是如果数据量非常大时第一次查询遍历结果集会 耗费很长时间,并且缓存的数据也会占用大量内存,效率明显下降。 1 、 添 加 一 个 包 装 分 页 状 态 的 VO 类 PageStateVO_Sington , 包 名 称 为 com.px1987.webbank.model.vo (1)添加一个包装分页状态的 VO 类 PageStateVO_Sington
private inБайду номын сангаас totalNumberOfElements;
//总的数据条目数量,0 表示没有数据
private int thisPageFirstElementNumber; //获取当前页的首条数据的行编码(从 0 开始
计数)
private int thisPageLastElementNumber; //获取当前页的末条数据的行编码(从 0 开始
计数)
private int nextPageNumber;
//获取下一页编码
private int previousPageNumber; //获取上一页编码
课程设计实训教学示例项目——《网上银行账户管理系统》——在项目中应用观察者模式实现日志记录的功能操作
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——在项目中应用观察者模式实现日志记录的功能操作1.1.1添加操作日志记录的观察者类1、添加日志记录信息的VO类(1)BusinessActionLogInfoVO,包名称为com.px1987.webbank.model.vo2、添加观察者BusinessActionLogObserver类的接口BusinessActionLogInterface (1)接口所在的包名称为com.px1987.webbank.util(2)设计该接口package com.px1987.webbank.util;import com.px1987.webbank.model.*;public interface BusinessActionLogInterface {public void logBusinessActionInfo(BusinessActionLogInfoVO oneBusinessActionLogInfoVO);}3、设计观察者BusinessActionLogObserver类(1)添加BusinessActionLogObserver类该类实现java.util包中的Observer接口和前面的BusinessActionLogInterface接口,并且对业务行为进行观察。
该类名称为BusinessActionLogObserver、包为com.px1987.webbank.util。
目前该类的功能实现是基于JDK的Logger类实现日志功能。
(2)编程该类package com.px1987.webbank.util;import java.util.Observable;import java.util.Observer;import com.px1987.webbank.model.BusinessActionLogInfoVO;public class BusinessActionLogObserver implements Observer,BusinessActionLogInterface { public BusinessActionLogObserver() {}public void update(Observable o, Object arg) {BusinessActionLogInfoVO oneBusinessActionLogInfoVO=(BusinessActionLogInfoVO)arg;logBusinessActionInfo(oneBusinessActionLogInfoVO);}public void logBusinessActionInfo( BusinessActionLogInfoVOoneBusinessActionLogInfoVO) { }}4、为日志管理类提供一个工厂方法模式来创建各个日志记录类的对象实例(1)类名称为BusinessActionLogInfoFactory,包名称为com.px1987.webbank.factory(2)编程该BusinessActionLogInfoFactory类注意本工厂类中的产品对象实例的创建方法与标准的GOF中的工厂方法中的产品对象实例的创建方法不同,主要是由于该日志管理类作为观察者模式的观察者类。
J2EE课程设计实训教学示例项目——《网上银行账户管理系统》——银行帐户管理系统的需求和设计
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——银行帐户管理系统的需求和设计1.1.1银行帐户管理系统的需求和设计1 、银行帐户管理系统的主要的功能银行账户是开展各项金融业务的基础,是一切金融交易的门槛,不论什么样的金融交易,只要通过银行,都表现为资金从一个账户到另一个账户的转移,都会在账户记录中留下痕迹。
因此,必须加强银行账户系统的信息化建设,加大对账户资金流动的监控力度。
用户到银行办理业务主要有开户、存款、取款、查询、转账、改密码、销户等七项工作。
因此,系统的前台基本功能应该包含开户、存款、取款、查询、转账、改密码、销户等多项功能模块。
通过该银行账户管理系统的开发,使银行的账户管理工作系统化、规范化、自动化,从而达到提高账户管理效率的目的,使有关的工作人员可以轻松快捷地完成对账户管理的任务。
2、系统的基本要求本系统选题为银行账户管理系统,是模拟银行账户的管理开发的。
设计的指导思想是一切为使用者着想,界面要美观大方,操作尽量简单明了,而且作为一个实用的管理系统要有良好的容错性,在出现误操作时能尽量及时地给出警告,以便用户及时地改正。
本系统的具体表现为:1)系统应符合银行账户管理的规定,满足银行相关人员日常使用的需要,并达到操作过程中的直观、方便、实用安全等要求;2)系统采用模块化程序设计方法,即便于系统功能的各种组合和修改,又便于系统以后的扩展和功能完善;3)系统应具备数据库维护功能,及时根据应用的需求进行数据的添加、删除、等操作。
3、基本功能描述(1)开户1)功能描述:用户向银行前台工作人员出示身份证,填写姓名、家庭住址、身份证号码,并且决定开始要存入的初始金额;银行工作人员给用户开出帐号以及给出密码和开户日期。
2)操作者:前台工作人员3)用户输入:输入用户姓名、初始金额、身份证号4)输出:帐号、密码、开户日期(2)存款1)功能描述:用户向银行前台工作人员提供帐号,并且决定要存入的金额;银行工作人员给用户帐号的余额和存款日期。
J2EE课程设计实训教学示例项目《网上银行账户管理系统》——为各个具体的动态代理类提供一个统一的工厂类
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——为各个具体的动态代理类提供一个统一的工厂类1.1.1为各个具体的动态代理类AllUserDAOTransactionManager和AllAdminDAOTransactionManager等类提供一个统一的工厂类1、类名称为AllDAOTransactionManagerProxyFactory,包名称为com.px1987.webbank.factory,并且继承java.util.Observable类(2)编程该AllDAOTransactionManagerProxyFactory类该AllDAOTransactionManagerProxyFactory类根据所传递来的各个事务代理的类名称,利用反射技术动态地创建出对应的对象。
package com.px1987.webbank.factory;import java.util.Observable;import com.px1987.webbank.config.ClassNameConfig;import com.px1987.webbank.exception.WebBankException;import com.px1987.webbank.proxy.AllBaseDAOTransactionManager;public class AllDAOTransactionManagerProxyFactory extends Observable {public AllDAOTransactionManagerProxyFactory() {}public AllBaseDAOTransactionManager newAllDAOTransactionManagerProxyBean(String allDAOProxyClassName) throws WebBankException{AllBaseDAOTransactionManager oneAllUserDAOTransactionManager=null;Class oneClass=null;try {oneClass = Class.forName(allDAOProxyClassName);}catch (ClassNotFoundException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBankException("不能正确地获得"+allDAOProxyClassName+"类");}try {oneAllUserDAOTransactionManager =(AllBaseDAOTransactionManager)oneClass.newInstance();}catch (InstantiationException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBankException("不能正确地创建"+allDAOProxyClassName+"类的对象实例");}catch (IllegalAccessException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBankException("不能正确地创建"+allDAOProxyClassName+"类的对象实例");}return oneAllUserDAOTransactionManager;}}。
课程设计实训教学示例项目——《网上银行账户管理系统》——应用Struts 2框架中的拦截器组件实现身份验证
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——应用Struts 2框架中的拦截器组件实现身份验证1.1.1应用方法过滤的拦截器MethodFilterInterceptor类实现对前台用户身份验证1、MethodFilterInterceptor类该类继承AbstractInterceptor类,重写了intercept(ActionInvocation invocation)并提供了一个新的方法doInterceptor(ActionInvocation invocation)抽象方法。
这个拦截器与以往的拦截器配置有所不同。
那就是可以指定哪些方法需要被拦截,那些不需要。
通常在引用该拦截器时指定------有些Action方法在调用的时候,不需要要其中的部分拦截器。
这时,我们就可以使用拦截器过滤功能。
2、CheckUserLoginInterceptor继承于com.opensymphony.xwork2.interceptor.MethodFilterInterceptor类,包名称为com.px1987.webbank.interceptor3、编程该CheckUserLoginInterceptor类package com.px1987.webbank.interceptor;import java.util.Map;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;import erInfoVO;public class CheckUserLoginInterceptor extends MethodFilterInterceptor { @Overrideprotected String doIntercept(ActionInvocation actionInvocation) throws Exception { Map sessionMap= actionInvocation.getInvocationContext().getSession();Object userInfoObject = sessionMap.get("oneUserInfoVO" );if (userInfoObject ==null) {return "showNoLoginErrorWithTopBar";}return actionInvocation.invoke();}}4、声明一个全局的名称为showNoLoginError的result<global-results><result name="showNoLoginErrorWithTopBar">/Struts2/errorDeal/showNoLoginErrorWithTopBar.jsp </result> </global-results>5、定义该CheckUserLoginInterceptor类<interceptors><interceptor name ="checkUserLoginInterceptor"class ="com.px1987.webbank.interceptor.CheckUserLoginInterceptor" /> </interceptors>6、在各个Action类中引用该CheckUserLoginInterceptor类<action name ="pageForwordAction"class ="com.px1987.webbank.action.PageForwordAction" ><interceptor-ref name ="checkUserLoginInterceptor" ><paramname="includeMethods">forwardUpdateUserInfo,forwardUpdateUserPassWord,forwardLogout,f orwardNewAccountInfo,forwardDropOneAccountInfo,forwardNewAccountInfo,forwardDropOn eAccountInfo,forwardTransmitAccount,forwardShowMeAccountInfo</param></interceptor-ref></action>7、测试该CheckUserLoginInterceptor类的效果在浏览器的URL地址栏中输入如下的服务地址:http://127.0.0.1:8080/webbank/pageForwordAction!forwardUpdateUserInfo.actionhttp://127.0.0.1:8080/webbank/pageForwordAction!forwardUpdateUserPassWord.action1.1.2应用方法过滤的拦截器MethodFilterInterceptor类实现对后台用户身份验证1、在项目中添加CheckAdminUserLoginInterceptor类该类继承于com.opensymphony.xwork2.interceptor.MethodFilterInterceptor类,包名称为com.px1987.webbank.interceptor2、编程该CheckAdminUserLoginInterceptor类package com.px1987.webbank.interceptor;import erInfoVO;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;import java.util.Map;public class CheckAdminUserLoginInterceptor extends MethodFilterInterceptor { @Overrideprotected String doIntercept(ActionInvocation actionInvocation) throws Exception { Map sessionMap= actionInvocation.getInvocationContext().getSession();Object userInfoObject = sessionMap.get("oneUserInfoVO" );if (userInfoObject ==null) {return "showNoLoginErrorWithTopBar";}UserInfoVO oneUserInfoVO=(UserInfoVO)userInfoObject;int type_User_Admin=oneUserInfoVO.getType_User_Admin().intValue();if(type_User_Admin!=2){ //是否为后台系统管理员用户吗?return "showNoLoginErrorWithTopBar";}return actionInvocation.invoke();}}3、定义该CheckAdminUserLoginInterceptor类<interceptors><interceptor name ="checkUserLoginInterceptor"class ="com.px1987.webbank.interceptor.CheckUserLoginInterceptor" /> <interceptor name ="checkAdminUserLoginInterceptor"class="com.px1987.webbank.interceptor.CheckAdminUserLoginInterceptor" /> </interceptors>4、在各个Action类中引用该CheckUserLoginInterceptor类(1)在struts-pageForwordAction.xml文件中<action name ="pageForwordAction"class ="com.px1987.webbank.action.PageForwordAction" ><interceptor-ref name ="checkAdminUserLoginInterceptor" ><param name="includeMethods">forwardSystemManage</param> </interceptor-ref></action>(2)在struts-adminForwordAction.xml文件中<action name ="adminForwordAction"class ="com.px1987.webbank.action.AdminForwordAction" > <interceptor-ref name ="checkAdminUserLoginInterceptor" ></interceptor-ref></action>(3)在struts-adminForwordAction.xml文件中<action name ="*AdminManageAction"class="com.px1987.webbank.action.AdminManageAction" method="{1}" ><interceptor-ref name ="checkAdminUserLoginInterceptor" ></interceptor-ref><resultname="forwardShowQueryUserInfoResult">/Struts2/systemManage/userInfos/showQueryUserIn foResult.jsp</result></action>6、测试该CheckUserLoginInterceptor类的效果(1)对pageForwordAction 进行测试在浏览器的URL地址栏中输入如下的URL地址:http://127.0.0.1:8080/webbank/pageForwordAction!forwardSystemManage.action(2)对adminForwordAction进行测试在浏览器的URL地址栏中再输入如下的URL地址:http://127.0.0.1:8080/webbank/adminForwordAction!forwardQueryUserInfo.action(3)对AdminManageAction进行测试在浏览器的URL地址栏中输入如下的URL地址:http://127.0.0.1:8080/webbank/doQueryUserInfoAdminManageAction.action杨教授大学堂精心创作的优秀程序员职业提升必读系列资料杨教授大学堂,版权所有,盗版必究。
课程设计实训教学示例项目——《网上银行账户管理系统》——构建控制层中的各种Listener组件类
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——构建控制层中的各种监听器Listener组件类1.1.1构建控制层中的各种Listener组件类1、添加WebBankListener组件类(1)类名称为WebBankListener,包名称为com.px1987.webbank.listener,并且实现HttpSessionListener, HttpSessionAttributeListener和ServletContextListener接口(2)编程该WebBankListener组件类package com.px1987.webbank.listener;import java.util.ArrayList;import java.util.List;import java.util.Timer;import javax.servlet.ServletContext;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.http.HttpSessionAttributeListener;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;import com.px1987.webbank.config.ClassNameConfig;import com.px1987.webbank.exception.WebBankException;import com.px1987.webbank.factory.XMLInformationConfigFactory; import erInfoVO;import com.px1987.webbank.util.OnLineCounter;import com.px1987.webbank.util.WebBankScheduleTask;import com.px1987.webbank.util.XMLInformationConfig;public class WebBankListener implements HttpSessionListener, HttpSessionAttributeListener, ServletContextListener { private String saxXMLPathAndFileName=null;//当在线人员数比较多时,开销比较大!private static List onLineUserList=new ArrayList();private ServletContext oneServletContext=null;public void sessionCreated(HttpSessionEvent arg0) {//某用户访问,将增加访问计数总数OnLineCounter.addOneUser();}public void sessionDestroyed(HttpSessionEvent arg0) {//某用户离线,将减少访问计数总数OnLineCounter.reduceOneUser();}public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent){ //识别该用户是否已经登录if(httpSessionBindingEvent.getName().equals("oneUserInfoVO")){UserInfoVO nowLoginUserInfo=(UserInfoVO)httpSessionBindingEvent.getValue();onLineUserList.add(nowLoginUserInfo);/** 一旦该用户登陆成功,将减少“游客”的计数*/Integer onLineGuest=(Integer)oneServletContext.getAttribute("onLineGuest");int onLineGuestDigit=onLineGuest.intValue();oneServletContext.setAttribute("onLineGuest",newInteger((onLineGuestDigit-1)>=0?(onLineGuestDigit-1):0));}}public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent){if(httpSessionBindingEvent.getName().equals("oneUserInfoVO")){UserInfoVO nowLoginUserInfo=(UserInfoVO)httpSessionBindingEvent.getValue();onLineUserList.remove(nowLoginUserInfo); //除掉该登陆用户的信息}}public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {}public static List getOnLineUserList(){return onLineUserList;}public void contextDestroyed(ServletContextEvent arg0) {scheduletimer.cancel();}private Timer scheduletimer = null;public void contextInitialized(ServletContextEvent arg0) {oneServletContext=arg0.getServletContext();XMLInformationConfig xmlSaxInfoBeanID=null;saxXMLPathAndFileName=oneServletContext.getInitParameter("saxXMLPathAndFileName");String saxXMLFileName=oneServletContext.getRealPath("\\")+saxXMLPathAndFileName;try {String xmlInformationConfigImpleClassName=ClassNameConfig.getProperty("xmlInformationConfigImple.className");xmlSaxInfoBeanID=new XMLInformationConfigFactory().newXMLInformationConfigBean(xmlInformationConfigImpleClassName);}catch(WebBankException e) {e.printStackTrace();}try {xmlSaxInfoBeanID.xmlInit(saxXMLFileName);}catch (WebBankException e) {e.printStackTrace();System.out.println("在WebBankListener类中的contextInitialized方法出现了WebBankException异常!异常为:"+e.getMessage());}/*下面的代码实现将所解析出的xmlSaxInfoBeanID保存到ServletContext中,这样可以在其它组件中获得它*/arg0.getServletContext().setAttribute("xmlSaxInfoBeanID",xmlSaxInfoBeanID);scheduletimer=new Timer(true);scheduletimer.schedule(new WebBankScheduleTask(), 0, 60*60*1000);}public String getSaxXMLPathAndFileName() {return saxXMLPathAndFileName;}public void setSaxXMLPathAndFileName(String saxXMLPathAndFileName) { this.saxXMLPathAndFileName = saxXMLPathAndFileName;}}(3)部署程该WebBankListener组件类<listener><listener-class>com.px1987.webbank.listener.WebBankListener</listener-class> </listener>1.1.2为应用系统提供Web方式的计划任务调度1、添加WebBankScheduleTask类(1)包名称为com.px1987.webbank.util,类名称为WebBankScheduleTask,并继承于java.util.TimerTask类(2)编程该类package com.px1987.webbank.util;import java.util.*;public class WebBankScheduleTask extends TimerTask {private static boolean isRunning = false;private static final int C_SCHEDULE_HOUR = 15;//改变此时间为当前的时间,将可以控制任务启动的时间public WebBankScheduleTask() {}@Overridepublic void run() {Calendar cal = Calendar.getInstance();if (!isRunning){if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) {isRunning = true;if(someTask()){// task ok}else {//task Error}isRunning = false;}}else {System.out.println("上一次任务执行还未结束");}}public boolean someTask() {// **********//在下面添加自定义的详细任务,以下只是示例************* System.out.println("开始执行指定任务");int i = 0;while (i++ < 10){System.out.println("已完成任务的" + i + "/" + 10);}System.out.println("指定任务执行结束");//************************************************************************** return true;}public static boolean isRunning() {return isRunning;}public static void setRunning(boolean isRunning) {WebBankScheduleTask.isRunning = isRunning;}}2、在上面的WebBankListener组件中添加下面的产生定时器的功能代码private Timer scheduletimer = null;public void contextDestroyed(ServletContextEvent arg0) {scheduletimer.cancel();}public void contextInitialized(ServletContextEvent arg0) {scheduletimer=new Timer(true);scheduletimer.schedule(new WebBankScheduleTask(), 0, 60*60*1000);}3、测试该计划任务调度当Web应用在启动时,通过WebBankListener组将自动地加载前面的定时器组件。
J2EE课程设计实训教学示例项目——《网上银行账户管理系统》——在Rose工具中实现WebBank的用例图
3、添加用例图 (1)面向游客的用例图
杨教授大学堂,版权所有,盗版必究。
3/8 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
(2)面向注册用户的用例图
杨教授大学堂,版权所有,盗版必究。
4/8 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
杨教授大学堂,版权所有,盗版必究。
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
基于 Struts+Spring+JDBC 架构的课程设计实训教学示例项目—— 《网上 银行账户管理系统》——在 Rose 工具中实现 WebBank 的用例图
1.1.1 在 Rose 工具中实现 WebBank 的用例图 1、添加参与者 (1)新建参与者包
5员 职业提升必读系列资料
(3)面向 VIP 用户的用例图
杨教授大学堂,版权所有,盗版必究。
6/8 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
(4)后台用户管理的用例图
杨教授大学堂,版权所有,盗版必究。
7/8 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
(5)后台帐户管理的用例图
(6)后台系统管理的用例图
杨教授大学堂,版权所有,盗版必究。
8/8 页
(2)在该包中添加各个参与者
杨教授大学堂,版权所有,盗版必究。
1/8 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
最后为下面的状态
2、添加各个用例 (1)建一个包
杨教授大学堂,版权所有,盗版必究。
2/8 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
(2)在该包中添加各个用例
课程设计实训教学示例项目——《网上银行账户管理系统》——构建网上银行账户管理系统WebBank项目
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——构建网上银行账户管理系统WebBank项目1.1.1构建网上银行账户管理系统WebBank项目1、构建Web项目项目名称为WebBank,Context的名称为/webbank1.1.2构建本项目中的Struts2的系统环境1、添所需要的Struts2的各个*.jar包文件如下(1)目前所需要的各个Jar包文件1)commons-logging.jar2)freemarker-2.3.8.jar3)ognl-2.6.11.jar4)struts2-core-2.0.11.2.jar5)xwork-2.0.5.jar2、在web.xml中添加Struts2的Filter<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>3、在classes目录下添加struts.xml文件以实现对各个Action进行配置(1)主配置文件struts.xml目前的内容如下<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><include file ="struts-default.xml" /><package name ="webbankCommon" extends ="struts-default" ></package ><include file ="struts-userInfoManage.xml" /><include file ="struts-accountInfoManage.xml" /><include file ="struts-pageForwordAction.xml" /><include file ="struts-adminForwordAction.xml" /></struts>(2)用户管理模块的struts-userInfoManage.xml目前的内容如下<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><include file ="struts-default.xml" /><package name ="webbank_UserInfo" extends ="webbankCommon" > </package ></struts>(3)帐户管理模块的struts-accountInfoManage.xml目前的内容如下<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><include file ="struts-default.xml" /><package name ="webbank_AccountInfo" extends ="webbankCommon" > </package ></struts>(4)前台服务管理模块的struts-pageForwordAction.xml目前的内容如下<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><include file ="struts-default.xml" /><package name ="webbank_PageForword " extends ="webbankCommon" > </package ></struts>(5)后台系统管理模块的struts-adminForwordAction.xml目前的内容如下<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><include file ="struts-default.xml" /><package name ="webbank_adminForword" extends ="webbankCommon" ></package ></struts>4、在classes目录下添加struts.properties文件以实现对各个工作参数进行配置(1)添加struts.properties文件(2)添加下面的内容struts.custom.i18n.resources=baseMessagesstruts.i18n.encoding=GBKstruts.multipart.saveDir=/tmpstruts.devMode=truestruts.ui.theme=simple#struts.objectFactory=org.apache.struts2.spring.StrutsSpringObjectFactory1.1.3配置本项目的Tomcat服务器1、关联服务器2、部署本Web系统3、启动Tomcat服务器杨教授大学堂精心创作的优秀程序员职业提升必读系列资料输入http://127.0.0.1:8080/webbank/index.jsp,将出现下面的结果表明与Struts2有关的系统配置是正确的杨教授大学堂,版权所有,盗版必究。
课程设计实训教学示例项目《网上银行账户管理系统》——在项目中应用Apache Commons Validator验证器组件
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——在项目中应用Apache Commons Validator 验证器组件1.1.1应用Apache Commons Validator验证器组件对项目中的表单内的各个字段进行验证1、应用服务器端数据验证的必要性上面为FireFox浏览器对JavaScript的控制项目,JavaScript是可以被屏蔽的。
2、在项目中添加Apache Validator验证器的系统Jar包Validatro框架以成为Jakarta的公共项目的一部分,可以从/commons/下载单独的Validator框架,在Struts中已经包含了这个框架的系统包。
Validator主要依赖两个jar包(1)Jakarta-oro.jar:-提供一组处理文本的类,具有文本替换、过滤、和分割功能。
(2)Commons-validator.jar:提供了一个简单、可扩展的验证框架,包含了通用的验证方法和验证规则。
Validatro框架可以采用编程方式、也可以采用配置方式进行应用。
3、采用编程方式应用Validator验证器(1)UserInfoManageAction类中的方法String userName=getModel().getUserName();if(GenericValidator.isBlankOrNull(userName)){request.setAttribute("errorText", "用户名称不能为空!请输入您的用户名称!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}String userPassWord=getModel().getUserPassWord();if(GenericValidator.isBlankOrNull(userPassWord)){request.setAttribute("errorText", "用户密码名称不能为空!请输入您的用户密码!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}if(GenericValidator.maxLength(userPassWord, 18)){request.setAttribute("errorText", "用户密码不能超过18位!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}if(GenericValidator.minLength(userPassWord, 4)){request.setAttribute("errorText", "用户密码不能小于4位!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}String confirmPassWord=getModel().getConfirmPassWord();if(userPassWord.equals(confirmPassWord)){request.setAttribute("errorText", "确认密码应该与用户密码保持一致!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}(2)AccountInfoManageAction类中的方法——黑体所标示的方法为应用Validator验证器的方法示例package com.px1987.webbank.action;import java.util.ArrayList;import java.util.Date;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import mons.validator.GenericValidator;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ModelDriven;import com.px1987.webbank.actionform.AccountInfoActionForm;import com.px1987.webbank.constant.WebBankAllConstants;import com.px1987.webbank.exception.WebBankException;import erInfoManageImpleFacade;import com.px1987.webbank.model.vo.AccountInfoVO;import com.px1987.webbank.model.vo.PageStateVO_Prototype;import erInfoVO;import com.px1987.webbank.util.MD5JavaBean;public class AccountInfoManageAction extends AllActionBase implementsModelDriven<AccountInfoActionForm> {private static final long serialVersionUID = 5055956815554797299L;private HttpServletRequest request = null;private HttpSession session =null;private HttpServletResponse response=null;private AccountInfoActionForm oneAccountInfo=new AccountInfoActionForm();public AccountInfoManageAction() {}public AccountInfoActionForm getModel() {return oneAccountInfo;}public String checkVerifyCodeOK(){initServletContextObject();String verifyCodeInSession=(String)session.getAttribute("verifyCode");String verifyCodeDigitByInputed=getModel().getVerifyCodeDigit();if(GenericValidator.isBlankOrNull(verifyCodeDigitByInputed)){request.setAttribute("errorText", "验证码不能为空!请输入本网站所提供的6位验证码!");return "showWebAppErrorAndReturn";}if(!verifyCodeDigitByInputed.equals(verifyCodeInSession)) {request.setAttribute("errorText","您的验证码不正确,请输入本网站所提供的6位验证码!");return "showWebAppErrorAndReturn";}else{return "";}}public String doTransmitAccount(){UserInfoManageImpleFacade oneUserInfoManageImpleFacade=null;boolean okOrNot=false;String checkVerifyCodeReturn=checkVerifyCodeOK();if(!checkVerifyCodeReturn.equals("")){return checkVerifyCodeReturn;}String userID=getModel().getUserID();String outPutAccountID=getModel().getOutPutAccountID();String inPutAccountID=getModel().getInPutAccountID();String balance=getModel().getBalance();String userName=getModel().getUserName();if(!GenericValidator.isFloat(balance)){request.setAttribute("errorText", "取款金额必须为数字!请重新输入您的取款金额!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}try {oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();}catch (WebBankException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}//下面识别转帐金额是否小于帐户内的存款try {okOrNot=oneUserInfoManageImpleFacade.doCheckBalanceAmountValue(balance, outPutAccountID);}catch (WebBankException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}if(!okOrNot){request.setAttribute("targetURLPage","/pageForwordAction!forwardTransmitAccount.action");request.setAttribute("showInfoText",userName+"您好!您的转出帐户:"+outPutAccountID+"中的资金不足够!");return "showInfoAndGotoTarget";}//下面的代码是具体实现转帐try {okOrNot=oneUserInfoManageImpleFacade.doTransferAccount(outPutAccountID, inPutAccountID, Float.parseFloat(balance));}catch (WebBankException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}if(!okOrNot){request.setAttribute("errorText", userName+"您好!您对转出帐户:"+outPutAccountID+"的转帐行为没有成功!");return "showWebAppError";}//一旦转帐成功,将根据该用户的ID获得其各个帐户信息ArrayList<AccountInfoVO> onePageAccountInfoVOArrayList=null;PageStateVO_Prototype onePageStateVO_Prototype=null;String firstPageNumber="1";try {onePageStateVO_Prototype=new PageStateVO_Prototype();onePageStateVO_Prototype.setThisPageNumber(Integer.parseInt(firstPageNumber));//根据该用户的ID获得其各个帐户信息(但只取出第一页的数据)onePageStateVO_Prototype.setPageSize(WebBankAllConstants.webServiceManage_pageSi ze);onePageAccountInfoVOArrayList=oneUserInfoManageImpleFacade.doGetOnePageAccount InfoByUserID(onePageStateVO_Prototype,userID);}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return "showWebAppError";}request.setAttribute("onePageAccountInfoVOArrayList",onePageAccountInfoVOArrayList);request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype);request.setAttribute("currentPageNumber",newInteger(onePageStateVO_Prototype.getThisPageNumber()).toString());return "forwardShowMeAccountInfo";}public String doGetOutMoney(){UserInfoManageImpleFacade oneUserInfoManageImpleFacade=null;boolean okOrNot=false;String checkVerifyCodeReturn=checkVerifyCodeOK();if(!checkVerifyCodeReturn.equals("")){return checkVerifyCodeReturn;}String userID=getModel().getUserID();String accountInfo_ActionType=getModel().getAccountInfo_ActionType();String accountID=getModel().getAccountID();String idCard=getModel().getIdCard();String balance=getModel().getBalance();String userPassWord=getModel().getUserPassWord();if(GenericValidator.isBlankOrNull(idCard)){request.setAttribute("errorText", "您的身份证号输入不能为空!请输入您的有效身份证号!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}if(idCard.length()!=18){request.setAttribute("errorText", "有效身份证号应该是18位数字!请输入您的有效身份证号!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}try {oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();}catch (WebBankException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}switch(Integer.parseInt(accountInfo_ActionType)){case 1: //取出款额if(!GenericValidator.isFloat(balance)){request.setAttribute("errorText", "取款金额必须为数字!请重新输入您的取款金额!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}try{okOrNot=oneUserInfoManageImpleFacade.doGetOutSomeMoneyToOneAccount(accountID, Float.parseFloat(balance));}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return "showWebAppError";}if(!okOrNot){request.setAttribute("errorText", "您对帐户:"+accountID+"的取款行为没有成功,请与管理员联系!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}break;case 2: //销毁帐户if(GenericValidator.isBlankOrNull(userPassWord)){request.setAttribute("errorText", "您的帐户密码不能为空!请输入您的有效帐户密码!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}try{okOrNot=oneUserInfoManageImpleFacade.doDeleteOneAccountInfo(accountID);}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return "showWebAppError";}if(!okOrNot){request.setAttribute("errorText", "您对帐户:"+accountID+"的销户行为没有成功,请与管理员联系!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}break;}ArrayList<AccountInfoVO> onePageAccountInfoVOArrayList=null;PageStateVO_Prototype onePageStateVO_Prototype=null;String firstPageNumber="1";try {onePageStateVO_Prototype=new PageStateVO_Prototype();onePageStateVO_Prototype.setThisPageNumber(Integer.parseInt(firstPageNumber));//根据该用户的ID获得其各个帐户信息(但只取出第一页的数据)onePageStateVO_Prototype.setPageSize(WebBankAllConstants.webServiceManage_pageSi ze);onePageAccountInfoVOArrayList=oneUserInfoManageImpleFacade.doGetOnePageAccount InfoByUserID(onePageStateVO_Prototype,userID);}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return "showWebAppError";}request.setAttribute("onePageAccountInfoVOArrayList",onePageAccountInfoVOArrayList);request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype);request.setAttribute("currentPageNumber",newInteger(onePageStateVO_Prototype.getThisPageNumber()).toString());return "forwardShowMeAccountInfo";}public String doAddNewAccountInfo(){UserInfoManageImpleFacade oneUserInfoManageImpleFacade=null;boolean okOrNot=false;String checkVerifyCodeReturn=checkVerifyCodeOK();if(!checkVerifyCodeReturn.equals("")){return checkVerifyCodeReturn;}String balance=getModel().getBalance();String idCard=getModel().getIdCard();String userID=getModel().getUserID();String userPassWord=getModel().getUserPassWord();String state=getModel().getState();int savingMonth=getModel().getSavingMonth();String accountID=getModel().getAccountID();String accountInfo_ActionType=getModel().getAccountInfo_ActionType();if(!GenericValidator.isFloat(balance)){request.setAttribute("errorText", "存款金额必须为数字!请重新输入您的存款金额!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}AccountInfoVO oneAccountInfoVO=null;switch(Integer.parseInt(accountInfo_ActionType)){case 1: //开设帐户if(Float.parseFloat(balance)<1.0f){request.setAttribute("errorText", "开户存款金额必须大于1元人民币!请重新输入您的开户存款金额!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}if(GenericValidator.isBlankOrNull(idCard)){request.setAttribute("errorText", "您的身份证号输入不能为空!请输入您的有效身份证号!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}if(idCard.length()!=18){request.setAttribute("errorText", "有效身份证号应该是18位数字!请输入您的有效身份证号!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}oneAccountInfoVO=new AccountInfoVO();Date oneDate=new Date();oneAccountInfoVO.setAccountID(new Long(oneDate.getTime()).toString());oneAccountInfoVO.setPassword(newMD5JavaBean().getkeyBeanofStr(userPassWord));oneAccountInfoVO.setState(state);oneAccountInfoVO.setBalance(Float.parseFloat(balance));oneAccountInfoVO.setStartTime(newjava.sql.Date(oneDate.getYear(),oneDate.getMonth(),oneDate.getDate()));oneAccountInfoVO.setSavingMonth(new Integer(savingMonth));oneAccountInfoVO.setIdCard(idCard);oneAccountInfoVO.setUserID(userID);break;case 2: //追加存款//对于选择框,有缺少的选择项目if(GenericValidator.isBlankOrNull(accountID)){request.setAttribute("errorText", "请选择您的存款帐号!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}break;}try {oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();}catch (WebBankException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}switch(Integer.parseInt(accountInfo_ActionType)){case 1:try{okOrNot=oneUserInfoManageImpleFacade.doCreateOneAccountInfo(oneAccountInfoVO);}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return "showWebAppError";}if(!okOrNot){request.setAttribute("errorText", "您的开户行为没有成功,请与管理员联系!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}break;case 2:try{okOrNot=oneUserInfoManageImpleFacade.doAddSomeMoneyToOneAccount(accountID,Fl oat.parseFloat(balance));}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return "showWebAppError";}if(!okOrNot){request.setAttribute("errorText", "您对帐户:"+accountID+"的追加存款行为没有成功,请与管理员联系!");getModel().setVerifyCodeDigit("");return "showWebAppErrorAndReturn";}break;}ArrayList<AccountInfoVO> onePageAccountInfoVOArrayList=null;PageStateVO_Prototype onePageStateVO_Prototype=null;String firstPageNumber="1";try {onePageStateVO_Prototype=new PageStateVO_Prototype();onePageStateVO_Prototype.setThisPageNumber(Integer.parseInt(firstPageNumber));//根据该用户的ID获得其各个帐户信息(但只取出第一页的数据)onePageStateVO_Prototype.setPageSize(WebBankAllConstants.webServiceManage_pageSi ze);onePageAccountInfoVOArrayList=oneUserInfoManageImpleFacade.doGetOnePageAccount InfoByUserID(onePageStateVO_Prototype,userID);}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return "showWebAppError";}request.setAttribute("onePageAccountInfoVOArrayList",onePageAccountInfoVOArrayList);request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype);request.setAttribute("currentPageNumber",newInteger(onePageStateVO_Prototype.getThisPageNumber()).toString());return "forwardShowMeAccountInfo";}//********* 下面的各个方法是针对查询用户的帐户进行分页控制的各个方法****** public String forwardTargetPage_ShowMeAccount() {UserInfoManageImpleFacade oneUserInfoManageImpleFacade=null;initServletContextObject();String targetPageNumber=request.getParameter("targetPage"); //获得用户所输入的页数HttpSession session=request.getSession();UserInfoVOoneUserInfoVOInSession=(UserInfoVO)session.getAttribute("oneUserInfoVO"); //获得保存在session中的用户信息(会话跟踪)ArrayList<AccountInfoVO> onePageAccountInfoVOArrayList=null;PageStateVO_Prototype onePageStateVO_Prototype=null;try {oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();}catch (WebBankException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}try {onePageStateVO_Prototype=new PageStateVO_Prototype();onePageStateVO_Prototype.setThisPageNumber(Integer.parseInt(targetPageNumber));onePageStateVO_Prototype.setPageSize(WebBankAllConstants.webServiceManage_pageSi ze);onePageAccountInfoVOArrayList=oneUserInfoManageImpleFacade.doGetOnePageAccount InfoByUserID(onePageStateVO_Prototype,oneUserInfoVOInSession.getId());}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return "showWebAppError";}request.setAttribute("onePageAccountInfoVOArrayList",onePageAccountInfoVOArrayList);request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype);request.setAttribute("currentPageNumber",newInteger(onePageStateVO_Prototype.getThisPageNumber()).toString());return "forwardShowMeAccountInfo"; //跳转到显示其各个帐户信息的页面}//*********** 下面的各个方法是针对用户的帐户进行分页控制的各个方法*********** public String forwardTargetPageUserID_getOutSomeMoney() {UserInfoManageImpleFacade oneUserInfoManageImpleFacade=null;initServletContextObject();String targetPageNumber=request.getParameter("targetPage");//获得用户所输入的页数HttpSession session=request.getSession();//获得保存在session中的用户信息(会话跟踪)UserInfoVO oneUserInfoVOInSession=(UserInfoVO)session.getAttribute("oneUserInfoVO");ArrayList<AccountInfoVO> onePageAccountInfoVOArrayList=null;PageStateVO_Prototype onePageStateVO_Prototype=null;try {oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();}catch (WebBankException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}try {onePageStateVO_Prototype=new PageStateVO_Prototype();onePageStateVO_Prototype.setThisPageNumber(Integer.parseInt(targetPageNumber));onePageStateVO_Prototype.setPageSize(WebBankAllConstants.webServiceManage_pageSi ze);onePageAccountInfoVOArrayList=oneUserInfoManageImpleFacade.doGetOnePageAccount InfoByUserID(onePageStateVO_Prototype,oneUserInfoVOInSession.getId());}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return "showWebAppError";}request.setAttribute("onePageAccountInfoVOArrayList",onePageAccountInfoVOArrayList);request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype);request.setAttribute("currentPageNumber",newInteger(onePageStateVO_Prototype.getThisPageNumber()).toString());return "forwardDropOneAccountInfo"; //跳转到显示其各个帐户信息的页面}//************ 下面的各个方法是针对用户的帐户进行分页控制的各个方法***** public String forwardTargetPageUserID_newAccountInfo() {UserInfoManageImpleFacade oneUserInfoManageImpleFacade=null;initServletContextObject();String targetPageNumber=request.getParameter("targetPage");//获得用户所输入的页数HttpSession session=request.getSession();//获得保存在session中的用户信息(会话跟踪)UserInfoVO oneUserInfoVOInSession=(UserInfoVO)session.getAttribute("oneUserInfoVO");ArrayList<AccountInfoVO> onePageAccountInfoVOArrayList=null;PageStateVO_Prototype onePageStateVO_Prototype=null;try {oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();}catch (WebBankException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}try {onePageStateVO_Prototype=new PageStateVO_Prototype();onePageStateVO_Prototype.setThisPageNumber(Integer.parseInt(targetPageNumber));onePageStateVO_Prototype.setPageSize(WebBankAllConstants.webServiceManage_pageSi ze);onePageAccountInfoVOArrayList=oneUserInfoManageImpleFacade.doGetOnePageAccount InfoByUserID(onePageStateVO_Prototype,oneUserInfoVOInSession.getId());}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return "showWebAppError";}request.setAttribute("onePageAccountInfoVOArrayList",onePageAccountInfoVOArrayList);request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype);request.setAttribute("currentPageNumber",newInteger(onePageStateVO_Prototype.getThisPageNumber()).toString());return "forwardNewAccountInfo"; //跳转到显示其各个帐户信息的页面}// **************************** 下面的各个方法是针对用户的转帐帐户进行分页控制的各个方法**************************public String forwardTargetPageUserID_transmitAccount() {UserInfoManageImpleFacade oneUserInfoManageImpleFacade=null;initServletContextObject();String targetPageNumber=request.getParameter("targetPage");//获得用户所输入的页数HttpSession session=request.getSession();//获得保存在session中的用户信息(会话跟踪)UserInfoVO oneUserInfoVOInSession=(UserInfoVO)session.getAttribute("oneUserInfoVO");ArrayList<AccountInfoVO> onePageAccountInfoVOArrayList=null;PageStateVO_Prototype onePageStateVO_Prototype=null;try {oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();}catch (WebBankException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}try {onePageStateVO_Prototype=new PageStateVO_Prototype();onePageStateVO_Prototype.setThisPageNumber(Integer.parseInt(targetPageNumber));onePageStateVO_Prototype.setPageSize(WebBankAllConstants.webServiceManage_pageSi ze);onePageAccountInfoVOArrayList=oneUserInfoManageImpleFacade.doGetOnePageAccount InfoByUserID(onePageStateVO_Prototype,oneUserInfoVOInSession.getId());}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return "showWebAppError";}request.setAttribute("onePageAccountInfoVOArrayList",onePageAccountInfoVOArrayList);request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype);request.setAttribute("currentPageNumber",newInteger(onePageStateVO_Prototype.getThisPageNumber()).toString());return "forwardTransmitAccount"; //跳转到显示其各个帐户信息的页面}}。
基于Struts+Spring+JDBC架构的课程设计实训项目《网上银行账户管理系统》——在项目中实现图像验证码功能
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
g.drawLine(x, y, x+x1, y+y1); } for(int i = 0 ; i < 6 ; i++){ String[] str = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z","1","2","3","4","5","6","7","8","9" }; String randomStr = str[random.nextInt(str.length-1)]; //String randomStr = String.valueOf(random.nextInt(10)); VerifyCode+=randomStr; // 取随机产生的认证码(4 位数字)
课程设计实训项目《网上银行账户管理系统》——在项目应用Apache Commons-FileUpload组件实现文件上传功能
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——在项目应用Apache Commons-FileUpload 组件实现文件上传的功能1.1.1在项目应用Apache Commons-FileUpload组件实现文件上传的功能1、Apache Commons-FileUploadFileUpload就是其中用来处理HTTP文件上传的子项目,Commons-FileUpload主页为:/。
下载地址:/downloads/download_fileupload.cgi,而其API在线文档为/fileupload/apidocs/index.html,用户指南为/fileupload/using.html。
2、实现的基本要求导入jar包:commons-fileupload-1.2.1.jar和commons-io.jar系统库文件。
3、上传表单要求(1)设置表单为post方式(2)设置表单为enctype="multipart/form-data“4、编程实现步骤(1)实例化一个磁盘文件工厂DiskFileItemFactoryDiskFileItemFactory diskFileItemFactory=new DiskFileItemFactory();(2)用磁盘文件工厂实例化上传组件ServletFileUploadServletFileUpload servletFileUpload=new ServletFileUpload(diskFileItemFactory);(3)用上传组件ServletFileUpload解析request对象(4)从request对象中得到表单域List<FileItem>List<FileItem> list=servletFileUpload.parseRequest(request);(5)遍历List<FileItem>,找到上传表单域Map<String, String> registerFormAllItemMap= new HashMap<String, String>();for (FileItem fileItem : fileItems) {//遍历List<FileItem>,找到上传表单域和非上传表单域if (fileItem.isFormField()){ // 是普通表单域registerFormAllItemMap.put(fileItem.getFieldName(), fileItem.getString());}else{ // 是上传表单域registerFormAllItemMap.put(fileItem.getFieldName(), fileItem.getName()); //fileItem为上传文件}}(6)设定上传路径(上传的文件保存在服务器端的路径由path决定)File file=new File(path);(7)将上传的文件保存到由path所指定的位置fileItem.write(file);5、主要的API介绍(1)DiskFileItemFactoryrepository:指定上传文件保存的目录。
J2EE课程设计实训教学示例项目——《网上银行账户管理系统》——在表示层中应用DWR框架技术(第1部分)
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——在表示层中应用DWR框架技术(第1/2部分)1.1.1有关AJAX和DWR的内容1、什么是AJAX ?(1)异步---同步?,在Java平台中如何“异步”的效果?(2)JavaScript脚本什么是“编程语言”?什么是“脚本语言”?(3)XML技术XML的用途?系统配置、数据交换、网络协议(WebService , SOAP)XML- HTML (4)XMLHttpRequest(5)如何进行AJAX的编程开发1、创建XMLHttpRequest对象(需要识别浏览器的类型)2、设置请求的回调方法3、构造请求(open方法)4、发送请求(send 方法)5、识别XMLHttpRequest的状态是“处于准备好(=4 ?)”、再识别是“数据接收正确(=200 ?)”6、对返回的数据进行解析(DOM编程)2、DWR?(1)DWR是Java平台中的一种AJAX方面框架(DOJO)(2)工作原理直接以Web方式的远程存取---直接在页面的JavaScript中对Web服务端的某个JavaBean中的方法进行调用。
(3)如何进行DWR编程开发?1、导入DWR的系统包2、在web.xml文件部暑DWR的系统文件(DWRServlet)3、设计我们的业务功能组件JavaBean中的方法(功能实现)4、设计dwr.xml文件、并发布(远程化)我们的业务功能组件JavaBean中的方法5、在页面中包含DWR的页面系统库文件(三个*.js文件)6、在页面的JavaScript中调用远程化的JavaBean中的方法、并且获得返回的结果1.1.2在项目中应用 DWR框架技术1、添加DWR的系统包(1)导入我们的系统包(2)定位到我们的系统包所在的目录处(3)最后将产生出下面的状态2、在web.xml中部署DWR的Servlet本系统中应用DWR 2.0版的系统库,最后的配置内容如下<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4"xmlns="/xml/ns/j2ee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/j2ee /xml/ns/j2ee/web-app_2_4.xsd"><servlet><servlet-name>dwr-invoker</servlet-name><servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <init-param><param-name>logLevel</param-name><param-value>DEBUG</param-value></init-param><init-param ><param-name>classes</param-name><param-value>ng.Object</param-value></init-param><init-param><param-name>config</param-name><param-value>/WEB-INF/dwr.xml</param-value></init-param><init-param><param-name>debug</param-name><param-value>true</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dwr-invoker</servlet-name><url-pattern>/dwr/*</url-pattern></servlet-mapping></web-app>注意:对于DRW2.02以前的系统所应该添加的<init-param >以避免产生出下面的错误。
J2EE课程设计实训教学示例项目《网上银行账户管理系统》——采用动态代理技术重构各个DAO组件中的事务控制
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——采用动态代理技术重构各个DAO组件中的事务控制1.1.1采用动态代理技术重构各个DAO组件中的事务控制技术实现1、动态代理技术所谓的动态代理类是指在程序运行时,运用反射机制动态创建出。
但该动态代理类需要实现InvocationHandler接口,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类。
动态代理为实现许多常见设计模式(包括 Facade、Bridge、Interceptor、Decorator、Proxy(包括远程和虚拟代理)和 Adapter 模式)提供了替代的动态机制。
虽然这些模式不使用动态代理,只用普通的类就能够实现,但是在许多情况下,动态代理方式更方便、更紧凑。
2、JDK对动态代理技术实现的支持Java在JDK 1.3之后的版本中加入了协助开发动态代理功能的API类,这样我们就不必为特定对象与其中的方法编写特定的代理程序,使用动态代理,可以使得一个处理程序handler(也就是我们的动态代理类)能够服务于各个不同的被代理类的对象。
(1)优点与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。
动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。
(2)ng.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力1)InvocationHandler接口:该接口中仅定义了一个方法Object:invoke(Objectobj,Method method, Object[] args)。
在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组。
课程设计实训教学示例项目——《网上银行账户管理系统》——在项目中应用JFreeChart图表技术(第2部分)
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——在项目中应用JFreeChart图表技术(第2/2部分)7、设计Builder 接口的具体实现类----TimeseriesChartBean该实现类也就是我们的具体画出各种不同图形的JavaBean,本功能采用时间线图实现。
(1)实现时间线图的TimeseriesChartBean类,包名称为com.px1987.webbank.jfreechart(2)编程该类package com.px1987.webbank.jfreechart;import java.util.Observable;import org.jfree.chart.JFreeChart;import org.jfree.data.general.Dataset;import org.jfree.data.time.TimeSeriesCollection;import com.px1987.webbank.actionform.JFreeChartInfoActionForm;public class TimeseriesChartBean extends Observable implements JFreeChartBuilder { JFreeChart timeSeriesChart=null;public TimeseriesChartBean(){}public Dataset getDataSet(){/*下面的addValue方法中的第一个参数为X轴数据,第二个参数为Y轴的数据值*/org.jfree.data.time.TimeSeries ca = new org.jfree.data.time.TimeSeries("蓝梦银行用户管理中心");for (int i = 2003; i < 2008; i++){for (int mon = 0; mon < 12; mon++){//TimeSeriesDataPair是一个时间点的数值体现ca.add(new org.jfree.data.time.TimeSeriesDataItem( new org.jfree.data.time.Day(1, mon + 1, i), new Double(500 + Math.random() * 100)));}}org.jfree.data.time.TimeSeries ibm =new org.jfree.data.time.TimeSeries("蓝梦银行帐户管理中心");for (int i = 2003; i < 2008; i++){for (int mon = 0; mon < 12; mon++){ibm.add(new org.jfree.data.time.TimeSeriesDataItem(new org.jfree.data.time.Day(1, mon + 1, i), new Double(400 - Math.random() * 100)));}}org.jfree.data.time.TimeSeries king = new org.jfree.data.time.TimeSeries("蓝梦银行卡管理中心");for (int i = 2003; i < 2008; i++){for (int mon = 0; mon < 12; mon++){king.add(new org.jfree.data.time.TimeSeriesDataItem(new org.jfree.data.time.Day(1, mon + 1, i), new Double(300 - Math.random() * 100)));}}//时间曲线数据集合TimeSeriesCollection xyDataset = new TimeSeriesCollection();xyDataset.addSeries(ca);xyDataset.addSeries(ibm);xyDataset.addSeries(king);return xyDataset;}public void modifyJFreeChartPlot(){timeSeriesChart.setBackgroundPaint(java.awt.Color.white);}public void createOneChart(JFreeChartInfoActionForm oneJFreeChartInfoActionForm){// Create tooltip and URL generatorsbels.StandardXYToolTipGenerator ttg =new bels.StandardXYToolTipGenerator();org.jfree.chart.urls.StandardXYURLGenerator urlg =new org.jfree.chart.urls.StandardXYURLGenerator("WebChartHelp.jsp");org.jfree.chart.axis.ValueAxis timeAxis = new org.jfree.chart.axis.DateAxis(oneJFreeChartInfoActionForm.getCategoryName());org.jfree.chart.axis.NumberAxis valueAxis = new org.jfree.chart.axis.NumberAxis(oneJFreeChartInfoActionForm.getNumberString());valueAxis.setAutoRangeIncludesZero(false); // override defaultorg.jfree.chart.renderer.xy.StandardXYItemRenderer renderer = new org.jfree.chart.renderer.xy.StandardXYItemRenderer(org.jfree.chart.renderer.xy.StandardXYItemRenderer.LINES + org.jfree.chart.renderer.xy.StandardXYItemRenderer.SHAPES,ttg, urlg);renderer.setShapesFilled(true);org.jfree.chart.plot.XYPlot plot =new org.jfree.chart.plot.XYPlot((TimeSeriesCollection)getDataSet(),timeAxis, valueAxis, renderer);timeSeriesChart = new JFreeChart(oneJFreeChartInfoActionForm.getChartTitle(),JFreeChart.DEFAULT_TITLE_FONT, plot, false);}public JFreeChart getOneJFreeChart(){return timeSeriesChart;}}8、设计Builder 接口的具体实现类----OnePageBar3DChartBean该实现类也就是我们的具体画出各种不同图形的JavaBean,本功能采用3D 柱状图并且直接跳转到一个独立的页面实现。
基于Struts+Spring+JDBC架构的课程设计实训教学项目《网上银行账户管理系统》——实现系统中安全管理功能
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——实现系统中安全管理功能1.1.1实现系统中安全管理功能1、前台客户的系统功能权限(1)未进行系统登陆时,只提供下面的各个功能菜单项目(只读操作)(2)以前台用户的身份进行系统登陆后,提供下面的各个功能菜单(3)以后台用户的身份进行系统登陆后,将进入系统管理功能菜单首先采用基于表单的验证,利用后台Action组件集中处理登录请求。
用户登录后将调用权限管理系统的用户鉴别服务,如果验证成功,调用权限计算服务,并返回权限关系表,以HashMap的方式存放到登录用户的全局Session中;如果没有全局的Session或者过期,则被导向到登录页面,重新获取权限。
2、如何避免系统中的用户直接输入某个*.jsp页面而直接进行系统中的功能访问操作因为用户如果直接在浏览器的URL中输入http://127.0.0.1:8080/webbank/userManage/userLogin.jsp后,将能够直接进入到系统中的功能页面。
这样将给需要带来一定的隐患,应该禁止而只允许以*.action的形式进行访问。
(1)添加一个过滤器组件TransferJSPPage包名称为com.px1987.webbank.filter,并且实现javax.servlet.Filter接口、同时继承java.util.Observable类。
(2)编程该过滤器组件TransferJSPPage(3)部署该过滤器组件TransferJSPPage类<filter><filter-name>transferjsppage</filter-name><filter-class>com.px1987.webbank.filter.TransferJSPPage</filter-class></filter><filter-mapping><filter-name>transferjsppage</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping><filter-mapping><filter-name>transferjsppage</filter-name><url-pattern>/webResource/*</url-pattern></filter-mapping>(4)测试该过滤器组件TransferJSPPage类的功能效果输入http://127.0.0.1:8080/webbank/userManage/userLogin.jsp后,系统将自动地进行跳转到系统的首页注意:一旦采用该方式以后,所有的页面跳转将应该采用*.action方式进行;同时还应该注意页面中的路径的相对定位。
课程设计实训教学示例项目——《网上银行账户管理系统》——J2EE Web与Spring框架相互整合的实现示例
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——J2EE Web与Spring框架相互整合的实现示例1.1.1J2EE Web与Spring相互整合1、Spring Web 模块中的org.springframework.web.context. WebApplicationContext 接口对于Web应用,Spring提供了可配置的ApplicationContext加载机制org.springframework.web.context.ContextLoader类。
ContextLoader加载器目前有两种选择(1)org.springframework.web.context.ContextLoaderListener(2)org.springframework.web.context.ContextLoaderServlet2、添加Spring有关的系统包3、再添加log4j-1.2.9.jar包文件4、添加log4j有关的各个配置项目(1)添加log4j的属性配置文件可以将Spring 系统包中的samples/petclinic/war/WEB-INF/log4j.properties文件引入到本项目中的WEB-INF目录中。
(2)修改其所产生的log文件的名称log4j.rootLogger=INFO, stdout, logfilelog4j.appender.stdout=org.apache.log4j.ConsoleAppenderyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d %p [%c] - <%m>%nlog4j.appender.logfile=org.apache.log4j.RollingFileAppenderlog4j.appender.logfile.File=StrutsSpringHibernateWeb.loglog4j.appender.logfile.MaxFileSize=512KB# Keep three backup files.log4j.appender.logfile.MaxBackupIndex=3# Pattern to output: date priority [category] - messageyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d %p [%c] - %m%n(3)在web.xml 文件中添加<context-param>标签以定位log4j.properties文件由于在本例中采用对log4j.properties文件进行用户化的定制,因此需要在web.xml 文件中添加如下的标签。
课程设计实训教学示例项目——《网上银行账户管理系统》——在项目中添加各种Util工具功能类
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——在项目中添加各种Util工具功能类1.1.1在项目中添加各个实用工具类——实现转换页面信息中的特殊字符1、实现转换页面信息中的特殊字符(1)类名称为TransferSpecialCharToHTMLEntity,包名称为com.px1987.webbank.util(2)编程该类package com.px1987.webbank.util;public class TransferSpecialCharToHTMLEntity {public TransferSpecialCharToHTMLEntity(){}public static String FilterCharToHTMLEntity(String inputString){ //本方法主要实现对特殊的字符进行HTML的StringBuffer resultString = null;char[] orig = null;int beg = 0;if (inputString == null){return "";}int len = inputString.length();for (int i = 0; i < len; ++i) {char c = inputString.charAt(i);switch (c){case 0x27: //为“'”单引号码?case 0x20: //为空格case 0x0d: //为回车case 0x0a:case '&':case '<':case '>':case '"':if (resultString == null){orig = inputString.toCharArray();resultString = new StringBuffer(len + 10);}if (i > beg){resultString.append(orig, beg, i - beg);}beg = i + 1;switch (c){ //以下的代码主要实现将特殊符号转换为HTML的实体case 0x27: //为“'”单引号码?resultString.append("'");break;case 0x20: //为空格resultString.append(" ");break;case 0x0d: //为回车case 0x0a:resultString.append("<br>");break;case '&':resultString.append("&");break;case '<':resultString.append("<");break;case '>':resultString.append(">");break;case '"':resultString.append(""");break;}break;}}if (resultString == null){return inputString;}resultString.append(orig, beg, len - beg);return resultString.toString();}}2、添加在首页中对Cookie进行操作的JavaBean组件----对时间进行访问操作(1)类名称为ReadWriteCookie,包名称为com.px1987.webbank.util(2)编程该组件package com.px1987.webbank.util;import javax.servlet.*;import javax.servlet.jsp.*;import javax.servlet.http.*;import java.util.*;public class ReadWriteCookie {Cookie lastAccessCookie=null;HttpServletRequest request=null;HttpServletResponse response=null;HttpSession session=null;ServletContext application=null;String nowDateString=null;String lastAccessDateString=null;public ReadWriteCookie() {}public ReadWriteCookie(PageContext pageContext) {request=(HttpServletRequest)pageContext.getRequest();response=(HttpServletResponse)pageContext.getResponse();session=request.getSession();application=pageContext.getServletContext();}public void operateCookie(){Date nowDate=new Date();nowDateString=nowDate.toLocaleString();//取得Cookie资料(因为在Cookie中可以存储多个信息)Cookie[] cookies = request.getCookies();if(cookies==null){//建立Cookie变量lastAccessCookie = new Cookie("lastAccessDate", nowDateString);//设定Cookie在用户机器硬盘上的存活期为1年。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
将解析器和解析对象 XMLDOMData.xml 联系起来,同时指定事件回调方法的对象开始 解析 */
saxParser.parse(new File(configFilePathAndName), this); } catch (javax.xml.parsers.ParserConfigurationException pe){
(2)设计该接口 package com.px1987.webbank.util; import com.px1987.webbank.exception.*; public interface XMLInformationConfig {
public void xmlInit(String configFilePathAndName) throws WebBankException; } 2、为上面的接口提供一个实现类 (1)添加 SAXInformationConfig 类
} catch (Exception ex){
throw new WebBankException("在 SAXInformationConfig 类中的 xmlInit 方法中 出现 Exception");
} finally{
saxParserFactory = null; saxParser = null; } } private String tagElementName = null; // 定义开始解析元素的方法. 这里是将<xxx>中的名称 xxx 提取出来. public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { this.tagElementName = qName; //获得该标签的名称 } // 这里是将<xxx></xxx>之间的标签体的值加入到 currentValue public void characters(char[] ch, int start, int length) throws SAXException{ String tagBodyText = new String(ch, start, length); //获得标签体的文字串内容 if (this.tagElementName.equals("marquee-text") && !tagBodyText.trim().equals("")){ marqueeText = tagBodyText; } } } 3、为 SAXInformationConfig 实现类提供一个工厂类 XMLInformationConfigFactory (1)用来统一创建 XMLInformationConfig 接口的对象实例 名称为 XMLInformationConfigFactory 类,包名称为 com.px1987.webbank.factory , 并且从 java.util.Observable 类继承。
private String marqueeText = ""; public String getMarqueeText(){
return marqueeText; } public SAXInformationConfig(){
DefaultHandler
杨教授大学堂,版杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
} /** * 读取配置文件信息,并设置相关参数。 * @param configFileName String 配置文件路径及文件名。 */ public void xmlInit(String configFilePathAndName) throws WebBankException {
throw new WebBankException("在 SAXInformationConfig 类中的 xmlInit 方法中 出现 ParserConfigurationException");
} catch (SAXException se) {
throw new WebBankException("在 SAXInformationConfig 类中的 xmlInit 方法中 出现 SAXException");
类 名 称 为 SAXInformationConfig , 包 名 称 为 com.px1987.webbank.util , 基 类 为 org.xml.sax.helpers.DefaultHandler(采用 SAX 技术)。
杨教授大学堂,版权所有,盗版必究。 1/13 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
} catch (java.io.IOException ioe) {
throw new WebBankException("在 SAXInformationConfig 类中的 xmlInit 方法中 出现 IOException");
杨教授大学堂,版权所有,盗版必究。 3/13 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
基于 Struts+Spring+JDBC 架构的课程设计实训教学示例项目——《网上 银行账户管理系统》——在项目中实现对 XML 文件进行解析的各种 功能
1.1.1 在项目中实现对 XML 文件进行解析的各种功能 1、添加一个对 XML 进行解析的 JavaBean 组件的接口及实现类 (1)接口名称为 XMLInformationConfig,包名称为 com.px1987.webbank.util
SAXParserFactory saxParserFactory = null; SAXParser saxParser = null; saxParserFactory = SAXParserFactory.newInstance(); //获取 SAX 工厂对象 saxParserFactory.setNamespaceAware(false); saxParserFactory.setValidating(false); try {
(2)编程该 SAXInformationConfig 类 package com.px1987.webbank.util; import org.xml.sax.helpers.DefaultHandler; import com.px1987.webbank.exception.WebBankException; import java.io.*; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public class SAXInformationConfig extends XMLInformationConfig{