课程设计实训教学示例项目——《网上银行账户管理系统》——构建项目数据库连接组件和测试(第2部分)
基于Struts+Spring+JDBC架构课程设计实训教学示例项目《网上银行账户管理系统》——重构为Struts技术的项目
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——重构为Struts技术的项目1.1.1重构为Struts框架技术的应用项目1、将项目重构为Struts项目(1)利用MyEclipse提供的对Struts框架的技术支持(2)设置与Struts框架有关的工作参数(3)最后的结果如下2、添加AdminManageActionForm表单类(1)类名称为AdminManageActionForm,包名称为com.px1987.webbank.strutsform(2)设计该类的各个参数(3)添加下面的各个成员属性和get/set方法String submitButton=null;String userInfoCheckBox[]=null;String someOnePage=null;String userType=null;String registerYear=null;String userSex=null;String userComeFrom=null; //userComeFrom是下面的stateName和cityName的组合String stateName=null;String cityName=null;String currentPageNumber=null;(4)最后为下面的结果package com.px1987.webbank.strutsform;import javax.servlet.http.HttpServletRequest;import org.apache.struts.action.ActionErrors;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionMapping;public class AdminManageActionForm extends ActionForm {private static final long serialVersionUID = 6889244660210689330L; private String userComeFrom;private String userType;private String userSex;private String registerYear;private String submitButton;private String stateName;private String someOnePage;private String cityName;private String[] userInfoCheckBox;private String currentPageNumber;public ActionErrors validate(ActionMapping mapping,HttpServletRequest request) {ActionErrors oneActionErrors=new ActionErrors();return oneActionErrors;}public void reset(ActionMapping mapping, HttpServletRequest request) { userComeFrom="";userType="";userSex="";registerYear="";submitButton="";stateName="";someOnePage="";cityName="";String[] userInfoCheckBox={};currentPageNumber="";}public String getUserComeFrom() {userComeFrom=this.stateName+this.cityName; //将省与城市组合起来return userComeFrom;}public void setUserComeFrom(String userComeFrom) { erComeFrom = userComeFrom;}public String getUserType() {return userType;}public void setUserType(String userType) {erType = userType;}public String getUserSex() {return userSex;}public void setUserSex(String userSex) {erSex = userSex;}public String getRegisterYear() {return registerYear;}public void setRegisterYear(String registerYear) { this.registerYear = registerYear;}public String getSubmitButton() {return submitButton;}public void setSubmitButton(String submitButton) { this.submitButton = submitButton;}public String getStateName() {return stateName;}public void setStateName(String stateName) {this.stateName = stateName;}public String getSomeOnePage() {return someOnePage;}public void setSomeOnePage(String someOnePage) {this.someOnePage = someOnePage;}public String getCityName() {return cityName;}public void setCityName(String cityName) {this.cityName = cityName;}public String[] getUserInfoCheckBox() {return userInfoCheckBox;}public void setUserInfoCheckBox(String[] userInfoCheckBox) { erInfoCheckBox = userInfoCheckBox;}public String getCurrentPageNumber() {return currentPageNumber;}public void setCurrentPageNumber(String currentPageNumber) { this.currentPageNumber = currentPageNumber;}}3、添加AdminForwordAction类(1)类名称为AdminForwordAction,包名称为com.px1987.webbank.strutsaction(2)请求的Path路径设置为:/adminForwordAction,基类为org.apache.struts.actions.DispatchAction(3)将出现下面的结果(4)编程该AdminForwordAction类package com.px1987.webbank.strutsaction;import java.util.ArrayList;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import org.apache.struts.actions.DispatchAction;import com.px1987.webbank.constant.WebBankAllConstants; import com.px1987.webbank.exception.WebBankException; import erInfoManageImpleFacade; import com.px1987.webbank.model.vo.PageStateVO_Sington; import erInfoVO;import com.px1987.webbank.strutsform.AdminManageActionForm; public class AdminForwordAction extends DispatchAction {private UserInfoManageImpleFacade oneUserInfoManageImpleFacade=null;private static PageStateVO_Sington onePageStateVO=null;private static ArrayList<UserInfoVO> allCleckUserInfoVOArrayList=null;private static ArrayList<UserInfoVO> allVIPUserInfoVOArrayList=null;private static ArrayList<UserInfoVO> allRegisterUserInfoVOArrayList=null;/* 采用将oneUserInfoManageImpleFacade对象注入时的构造方法*/public void setOneUserInfoManageImpleFacade(UserInfoManageImpleFacade oneUserInfoManageImpleFacade) {this.oneUserInfoManageImpleFacade = oneUserInfoManageImpleFacade;}public AdminForwordAction() {}/*没有采用将oneUserInfoManageImpleFacade对象注入时的构造方法public AdminForwordAction() throws WebBankException {oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();}*/public ActionForward forwardAdminLeftMenu(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {return mapping.findForward("forwardAdminLeftMenu");}public ActionForward forwardAdminSwitchMenu(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {return mapping.findForward("forwardAdminSwitchMenu");}public ActionForward forwardAdminDefaultContent(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {return mapping.findForward("forwardAdminDefaultContent");}public ActionForward forwardQueryUserInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {return mapping.findForward("forwardQueryUserInfo");}public ActionForward forwardQueryUserInfoFrameSetTopFrame(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { String defaultStateName="北京";ArrayList<String> allCityNameInOneState=null;try{// oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();allCityNameInOneState=oneUserInfoManageImpleFacade.doGetAllCityNameInOneState(de faultStateName);}catch (WebBankException e) {request.setAttribute("errorText", e.getMessage());return mapping.findForward("showWebAppError");}request.setAttribute("allCityNameInOneState", allCityNameInOneState);return mapping.findForward("forwardQueryUserInfoFrameSetTopFrame");}public ActionForward forwardQueryUserInfoFrameSetMainFrame(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {return mapping.findForward("forwardQueryUserInfoFrameSetMainFrame");}//************************************************************************** public ActionForward forwardShowCleckUserInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {if(allCleckUserInfoVOArrayList==null){try { //获得前台工作人员的信息// oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();allCleckUserInfoVOArrayList=oneUserInfoManageImpleFacade.doGetAllCleckUserInfo();}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return mapping.findForward("showWebAppError");}}// ***********下面根据所获得的返回数据获得PageStateVO中的各个状态属性的值并填充各个成员属性****************if(onePageStateVO==null){onePageStateVO=new PageStateVO_Sington();}int currentPageNumber=1; //当前页的页码(第一次为从第一页开始)ArrayList<UserInfoVO>thisPageAllElements=onePageStateVO.setPageStateVOMemberProperty(currentPageNumber,WebBankAllConstants.systemManage_pageSize,allCleckUserInfoVOArrayList);request.setAttribute("thisPageAllElements",thisPageAllElements);request.setAttribute("onePageStateVO",onePageStateVO);request.setAttribute("currentPageNumber",new Integer(currentPageNumber).toString());return mapping.findForward("forwardShowCleckUserInfo");}public ActionForward forwardShowCleckUserInfoTargetPage(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {String targetPage=request.getParameter("targetPage");int currentPageNumber=Integer.parseInt(targetPage); //获得用户输入的某一页的页码ArrayList<UserInfoVO>thisPageAllElements=onePageStateVO.setPageStateVOMemberProperty(currentPageNumber, WebBankAllConstants.systemManage_pageSize,allCleckUserInfoVOArrayList);request.setAttribute("thisPageAllElements",thisPageAllElements);request.setAttribute("onePageStateVO",onePageStateVO);request.setAttribute("currentPageNumber",new Integer(currentPageNumber).toString());return mapping.findForward("forwardShowCleckUserInfo");}//*********************************************************************** public ActionForward forwardShowVIPUserInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {if(allVIPUserInfoVOArrayList==null){try { //获得VIP人员的信息// oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();allVIPUserInfoVOArrayList=oneUserInfoManageImpleFacade.doGetAllVIPUserInfo();}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return mapping.findForward("showWebAppError");}}// ***********下面根据所获得的返回数据获得PageStateVO中的各个状态属性的值并填充各个成员属性****************if(onePageStateVO==null){onePageStateVO=new PageStateVO_Sington();}int currentPageNumber=1; //当前页的页码(第一次为从第一页开始)ArrayList<UserInfoVO>thisPageAllElements=onePageStateVO.setPageStateVOMemberProperty(currentPageNumber,WebBankAllConstants.systemManage_pageSize,allVIPUserInfoVOArrayList);request.setAttribute("thisPageAllElements",thisPageAllElements);request.setAttribute("onePageStateVO",onePageStateVO);request.setAttribute("currentPageNumber",new Integer(currentPageNumber).toString());return mapping.findForward("forwardShowVIPUserInfo");}public ActionForward forwardShowVIPUserInfoTargetPage(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {String targetPage=request.getParameter("targetPage");int currentPageNumber=Integer.parseInt(targetPage);//获得用户输入的某一页的页码ArrayList<UserInfoVO>thisPageAllElements=onePageStateVO.setPageStateVOMemberProperty(currentPageNumber, WebBankAllConstants.systemManage_pageSize,allVIPUserInfoVOArrayList);request.setAttribute("thisPageAllElements",thisPageAllElements);request.setAttribute("onePageStateVO",onePageStateVO);request.setAttribute("currentPageNumber",new Integer(currentPageNumber).toString());return mapping.findForward("forwardShowVIPUserInfo");}//*************************************************************************** public ActionForward forwardShowRegisterUserInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {if(allRegisterUserInfoVOArrayList==null){try { //获得VIP人员的信息// oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();allRegisterUserInfoVOArrayList=oneUserInfoManageImpleFacade.doGetAllRegisterUserIn fo();}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return mapping.findForward("showWebAppError");}}// ***********下面根据所获得的返回数据获得PageStateVO中的各个状态属性的值并填充各个成员属性****************if(onePageStateVO==null){onePageStateVO=new PageStateVO_Sington();}int currentPageNumber=1; //当前页的页码(第一次为从第一页开始)ArrayList<UserInfoVO>thisPageAllElements=onePageStateVO.setPageStateVOMemberProperty(currentPageNumber,WebBankAllConstants.systemManage_pageSize,allRegisterUserInfoVOArrayList);request.setAttribute("thisPageAllElements",thisPageAllElements);request.setAttribute("onePageStateVO",onePageStateVO);request.setAttribute("currentPageNumber",new Integer(currentPageNumber).toString());request.setAttribute("allRegisterUserInfoVOArrayList",allRegisterUserInfoVOArrayList);return mapping.findForward("forwardShowRegisterUserInfo");}public ActionForward forwardShowRegisterUserInfoTargetPage(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {String targetPage=request.getParameter("targetPage");int currentPageNumber=Integer.parseInt(targetPage); //获得用户输入的某一页的页码ArrayList<UserInfoVO>thisPageAllElements=onePageStateVO.setPageStateVOMemberProperty(currentPageNumber, WebBankAllConstants.systemManage_pageSize,allRegisterUserInfoVOArrayList);request.setAttribute("thisPageAllElements",thisPageAllElements);request.setAttribute("onePageStateVO",onePageStateVO);request.setAttribute("currentPageNumber",new Integer(currentPageNumber).toString());return mapping.findForward("forwardShowRegisterUserInfo");}//************************************************************************** public ActionForward forwardImagesUserInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {return mapping.findForward("forwardImagesUserInfo");}public ActionForward forwardImageUserInfoFrameSetTopFrame(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {return mapping.findForward("forwardImageUserInfoFrameSetTopFrame");}public ActionForward forwardImageUserInfoFrameSetMainFrame(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {return mapping.findForward("forwardImageUserInfoFrameSetMainFrame");}//************************************************************************** public ActionForward forwardReportsUserInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {return mapping.findForward("forwardReportsUserInfo");}public ActionForward forwardReportsUserInfoFrameSetTopFrame(ActionMapping mapping,ActionForm form,HttpServletRequest request, HttpServletResponse response) {return mapping.findForward("forwardReportsUserInfoFrameSetTopFrame");}public ActionForward forwardReportsUserInfoFrameSetMainFrame(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {return mapping.findForward("forwardReportsUserInfoFrameSetMainFrame");}//*************************************************************************** public ActionForward forwardDeleteCleckUserInfo(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {if(allCleckUserInfoVOArrayList==null){try { //获得前台工作人员的信息// oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();allCleckUserInfoVOArrayList=oneUserInfoManageImpleFacade.doGetAllCleckUserInfo();}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return mapping.findForward("showWebAppError");}}// ***********下面根据所获得的返回数据获得PageStateVO中的各个状态属性的值并填充各个成员属性****************if(onePageStateVO==null){onePageStateVO=new PageStateVO_Sington();}int currentPageNumber=1; //当前页的页码(第一次为从第一页开始)ArrayList<UserInfoVO>thisPageAllElements=onePageStateVO.setPageStateVOMemberProperty(currentPageNumber,WebBankAllConstants.systemManage_pageSize,allCleckUserInfoVOArrayList);request.setAttribute("thisPageAllElements",thisPageAllElements);request.setAttribute("onePageStateVO",onePageStateVO);request.setAttribute("currentPageNumber",new Integer(currentPageNumber).toString());return mapping.findForward("forwardDeleteCleckUserInfo");}public ActionForward forwardDeleteCleckUserInfoTargetPage(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {String targetPage=request.getParameter("targetPage");int currentPageNumber=Integer.parseInt(targetPage);//获得用户输入的某一页的页码ArrayListthisPageAllElements=onePageStateVO.setPageStateVOMemberProperty(currentPageNumber, WebBankAllConstants.systemManage_pageSize,allCleckUserInfoVOArrayList);request.setAttribute("thisPageAllElements",thisPageAllElements);request.setAttribute("onePageStateVO",onePageStateVO);request.setAttribute("currentPageNumber",new Integer(currentPageNumber).toString());return mapping.findForward("forwardDeleteCleckUserInfo");}// *************下面的方法是响应各个删除的表单请求的方法******************** public ActionForward doDeleteCleckUserInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {String userInfoCheckBox[]=null;AdminManageActionFormadminManageActionForm=(AdminManageActionForm)form;userInfoCheckBox=adminManageActionForm.getUserInfoCheckBox();if((userInfoCheckBox==null)||(userInfoCheckBox.length <1)){ //操作者没有选中任何要删除的用户IDrequest.setAttribute("errorText", "请选中所要删除的各个用户!");return mapping.findForward("showSystemManageActionErrorInfoAndReturn");}// 选中了用户后,则进行删除的操作ArrayList<String> deletedUserIDs=new ArrayList();for(int index=0; index <userInfoCheckBox.length; index++){deletedUserIDs.add(userInfoCheckBox[index]);//获得所要删除的各个用户的ID }boolean deleteResult=false;try {// oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();deleteResult=oneUserInfoManageImpleFacade.doBatchDeleteUserInfo(deletedUserIDs);}catch (WebBankException e) {request.setAttribute("errorText", e.getMessage());return mapping.findForward("showWebAppError");}if(!deleteResult){request.setAttribute("errorText", "在批量删除用户数据时出现了错误!");return mapping.findForward("showWebAppError");}//*************完成了删除功能后,继续查询并显示要删除的数据************ try{ //重新查询数据库表以获得删除后的CleckUserInfo数据allCleckUserInfoVOArrayList=oneUserInfoManageImpleFacade.doGetAllCleckUserInfo();}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return mapping.findForward("showWebAppError");}onePageStateVO=null; // 销毁onePageStateVO以获得删除后的onePageStateVO状态数据return mapping.findForward("forwardDeleteCleckUserInfo"); //重新显示第一页的数据}public ActionForward doDeleteRegisterUserInfo(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {String userInfoCheckBox[]=null;AdminManageActionFormadminManageActionForm=(AdminManageActionForm)form;userInfoCheckBox=adminManageActionForm.getUserInfoCheckBox();if((userInfoCheckBox==null)||(userInfoCheckBox.length <1)){ //操作者没有选中任何要删除的用户IDrequest.setAttribute("errorText", "请选中所要删除的各个用户!");return mapping.findForward("showSystemManageActionErrorInfoAndReturn");}//选中了用户后,则进行删除的操作ArrayList<String> deletedUserIDs=new ArrayList();for(int index=0; index <userInfoCheckBox.length; index++){deletedUserIDs.add(userInfoCheckBox[index]);//获得所要删除的各个用户的ID }boolean deleteResult=false;try {// oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();deleteResult=oneUserInfoManageImpleFacade.doBatchDeleteUserInfo(deletedUserIDs);}catch (WebBankException e) {request.setAttribute("errorText", e.getMessage());return mapping.findForward("showWebAppError");}if(!deleteResult){request.setAttribute("errorText", "在批量删除用户数据时出现了错误!");return mapping.findForward("showWebAppError");}//***************完成了删除功能后,继续查询并显示要删除的数据*********** try{ //重新查询数据库表以获得删除后的VIPUserInfo数据allRegisterUserInfoVOArrayList=oneUserInfoManageImpleFacade.doGetAllRegisterUserIn fo();}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return mapping.findForward("showWebAppError");}onePageStateVO=null; //销毁onePageStateVO以获得删除后的onePageStateVO状态数据return mapping.findForward("forwardDeleteRegisterUserInfo"); //重新显示第一页的数据}public ActionForward doDeleteVIPUserInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {String userInfoCheckBox[]=null;AdminManageActionForm adminManageActionForm=(AdminManageActionForm)form;userInfoCheckBox=adminManageActionForm.getUserInfoCheckBox();if((userInfoCheckBox==null)||(userInfoCheckBox.length <1)){ //操作者没有选中任何要删除的用户IDrequest.setAttribute("errorText", "请选中所要删除的各个用户!");return mapping.findForward("showSystemManageActionErrorInfoAndReturn");}// 选中了用户后,则进行删除的操作ArrayList<String> deletedUserIDs=new ArrayList();for(int index=0; index <userInfoCheckBox.length; index++){deletedUserIDs.add(userInfoCheckBox[index]);//获得所要删除的各个用户的ID }boolean deleteResult=false;try {// oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();deleteResult=oneUserInfoManageImpleFacade.doBatchDeleteUserInfo(deletedUserIDs);}catch (WebBankException e) {request.setAttribute("errorText", e.getMessage());return mapping.findForward("showWebAppError");}if(!deleteResult){request.setAttribute("errorText", "在批量删除用户数据时出现了错误!");return mapping.findForward("showWebAppError");}//************完成了删除功能后,继续查询并显示要删除的数据************** try{//重新查询数据库表以获得删除后的VIPUserInfo数据allVIPUserInfoVOArrayList=oneUserInfoManageImpleFacade.doGetAllVIPUserInfo();}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return mapping.findForward("showWebAppError");}onePageStateVO=null; // 销毁onePageStateVO以获得删除后的onePageStateVO状态数据return mapping.findForward("forwardDeleteVIPUserInfo"); //重新显示第一页的数据}//************************************************************************ public ActionForward forwardDeleteVIPUserInfo(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {if(allVIPUserInfoVOArrayList==null) {try { //获得VIP人员的信息// oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();allVIPUserInfoVOArrayList=oneUserInfoManageImpleFacade.doGetAllVIPUserInfo();}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return mapping.findForward("showWebAppError");}}// ***********下面根据所获得的返回数据获得PageStateVO中的各个状态属性的值并填充各个成员属性****************if(onePageStateVO==null){onePageStateVO=new PageStateVO_Sington();}int currentPageNumber=1; //当前页的页码(第一次为从第一页开始)ArrayList<UserInfoVO>thisPageAllElements=onePageStateVO.setPageStateVOMemberProperty(currentPageNumber,WebBankAllConstants.systemManage_pageSize,allVIPUserInfoVOArrayList);request.setAttribute("thisPageAllElements",thisPageAllElements);request.setAttribute("onePageStateVO",onePageStateVO);request.setAttribute("currentPageNumber",new Integer(currentPageNumber).toString());return mapping.findForward("forwardDeleteVIPUserInfo");}public ActionForward forwardDeleteVIPUserInfoTargetPage(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { String targetPage=request.getParameter("targetPage");int currentPageNumber=Integer.parseInt(targetPage); //获得用户输入的某一页的页码ArrayList<UserInfoVO>thisPageAllElements=onePageStateVO.setPageStateVOMemberProperty(currentPageNumber, WebBankAllConstants.systemManage_pageSize,allVIPUserInfoVOArrayList);request.setAttribute("thisPageAllElements",thisPageAllElements);request.setAttribute("onePageStateVO",onePageStateVO);request.setAttribute("currentPageNumber",new Integer(currentPageNumber).toString());return mapping.findForward("forwardDeleteVIPUserInfo");}//*******************************************************************public ActionForward forwardDeleteRegisterUserInfo(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {if(allRegisterUserInfoVOArrayList==null) {try { //获得VIP人员的信息// oneUserInfoManageImpleFacade=new UserInfoManageImpleFacade();allRegisterUserInfoVOArrayList=oneUserInfoManageImpleFacade.doGetAllRegisterUserIn fo();}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return mapping.findForward("showWebAppError");}}// *****下面根据所获得的返回数据获得PageStateVO中的各个状态属性的值并填充各个成员属性*****if(onePageStateVO==null){onePageStateVO=new PageStateVO_Sington();}int currentPageNumber=1; //当前页的页码(第一次为从第一页开始)ArrayList<UserInfoVO>thisPageAllElements=onePageStateVO.setPageStateVOMemberProperty(currentPageNumber,WebBankAllConstants.systemManage_pageSize,allRegisterUserInfoVOArrayList);request.setAttribute("thisPageAllElements",thisPageAllElements);request.setAttribute("onePageStateVO",onePageStateVO);request.setAttribute("currentPageNumber",new Integer(currentPageNumber).toString());return mapping.findForward("forwardDeleteRegisterUserInfo");}public ActionForward forwardDeleteRegisterUserInfoTargetPage(ActionMapping mapping,ActionForm form,HttpServletRequest request, HttpServletResponse response) {String targetPage=request.getParameter("targetPage");int currentPageNumber=Integer.parseInt(targetPage); //获得用户输入的某一页的页码ArrayList<UserInfoVO>thisPageAllElements=onePageStateVO.setPageStateVOMemberProperty(currentPageNumber, WebBankAllConstants.systemManage_pageSize,allRegisterUserInfoVOArrayList);request.setAttribute("thisPageAllElements",thisPageAllElements);request.setAttribute("onePageStateVO",onePageStateVO);request.setAttribute("currentPageNumber",new Integer(currentPageNumber).toString());return mapping.findForward("forwardDeleteRegisterUserInfo");}}(5)添加forward定义4、添加AdminManageAction类(1)类名称为AdminManageAction,包名称为com.px1987.webbank.strutsaction(2)请求的路径Path为:/adminManageAction,基类为org.apache.struts.actions.DispatchAction(3)设置DispatchAction的参数(4)将出现下面的结果(5)编程该AdminManageAction类package com.px1987.webbank.strutsaction; import java.io.UnsupportedEncodingException;import java.util.ArrayList;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import org.apache.struts.actions.DispatchAction;import com.px1987.webbank.constant.WebBankAllConstants;import com.px1987.webbank.exception.WebBankException;import erInfoManageImpleFacade;import com.px1987.webbank.model.vo.PageStateVO_Prototype;import erInfoVO;import com.px1987.webbank.strutsform.AdminManageActionForm;public class AdminManageAction extends DispatchAction {UserInfoManageImpleFacade oneUserInfoManageImpleFacade=null;HttpSession session =null;// ****************查询用户信息******************************** public ActionForward doQueryUserInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {AdminManageActionForm adminManageActionForm = (AdminManageActionForm) form;String userSex=adminManageActionForm.getUserSex();String userType=adminManageActionForm.getUserType();String registerTime=adminManageActionForm.getRegisterYear();String userComeFrom=adminManageActionForm.getUserComeFrom();UserInfoVO oneUserInfoVOPartProperty=new UserInfoVO();oneUserInfoVOPartProperty.setUserSex(Integer.parseInt(userSex));oneUserInfoVOPartProperty.setUserType(Integer.parseInt(userType));oneUserInfoVOPartProperty.setRegisterTime(registerTime);。
基于Struts+Spring+JDBC架构课程设计实训教学示例项目——《网上银行账户管理系统》——系统概要设计说明书
J2EE课程设计实训教学示例项目《网上银行账户管理系统》系统概要设计说明书文档信息目录第一章引言 (5)1.1编写目的 (5)1.1.1概要设计说明书目的 (5)1.1.2预期读者 (5)1.2背景 (5)1.1.3待开发软件系统的名称 (5)1.1.4项目的任务提出者 (6)1.1.5项目的任务开发者 (6)1.3定义 (6)1.1.6本文档中涉及的专业词汇 (6)1.1.7名词说明 (6)第二章总体设计(系统架构设计) (7)2.1需求规定 (7)2.1.1输入输出要求 (7)2.1.2时间要求 (7)2.1.3灵活性要求 (7)2.2运行环境 (7)2.2.1设备 (7)2.2.2支撑软件 (8)2.3基本设计概念和处理流程 (8)2.3.1系统概述 (8)2.3.2 系统架构示图 (9)2.3.3各层中应用了相应的主流的J2EE框架技术 (11)2.3.4系统基于MVC设计 (12)2.4 系统结构(系统各个组件设计) (13)2.4.1体系结构包图(架构包图) (13)2.4.2组件设计图(系统中的各个组件) (13)2.4.3类图与接口设计(各个组件中的相关的类和接口) (13)第三章系统数据结构设计 (15)3.1数据库逻辑结构设计 (15)3.1.1实体关系(Entity-Relationship)图 (15)3.1.2数据库表的逻辑设计 (16)第四章系统出错处理设计 (21)4.1出错信息 (21)4.2补救措施 (21)4.3系统维护设计 (22)第一章引言1.1编写目的本文档作为网上银行的概要设计说明文档,用于与用户确定最终的目标,并成为协议文本的一部分,同时也是本系统设计人员的基础文档。
1.1.1概要设计说明书目的本概要设计说明书说明了网上银行系统设计的整体结构。
1.1.2预期读者本系统开发人员及维护人员。
1.2背景网上银行是开展各项金融业务的基础,是一切金融交易的门槛,不论什么样的金融交易,只要通过银行,都表现为资金从一个账户到另一个账户的转移,都会在账户记录中留下痕迹。
课程设计实训教学示例项目《网上银行账户管理系统》利用模板模式重构客户信息管理DAO组件及测试(第1部分)
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——利用模板模式重构前台客户信息管理的DAO 组件及测试(第1/3部分)1.1.1利用模板模式重构UserManageDAOJDBCImple类1、应用的技术背景由于在本DAO组件类中需要实现数据分页、二进制字段等方面的数据访问,而这些功能的实现在不同的数据库系统中所需要的SQL语句是不一样的。
为了使得本DAO能够达到可扩展性,因此应用模板模式重构UserManageDAOJDBCImple类。
(1)不同的数据库对标准的SQL支持不完全一致由于不同的数据库在对标准的SQL语句的支持方面是不同的,已经为了能够使得上层的“业务层”与数据库类型无关,因此应该要针对不同的数据库类型提供不同的DAO组件。
(2)不同的数据库又提供对标准的SQL语句的某些通用的支持但由于不同的数据库在对SQL语句的支持方面也有相同的部分,针对这样的应用场景,我们应该如何解决?2、每次翻页的时候只从数据库里检索页面大小的块区的数据(每次翻页的时候只从数据库里检索页面大小的块区的数据)(1)主要的优点:每次翻页都需要查询数据库,但查询出的记录数很少,网络传输数据量不大,如果使用连接池更可以略过最耗时的建立数据库连接过程。
而在数据库端有各种成熟的优化技术用于提高查询速度,比在应用服务器层做缓存有效多了。
(2)实现原理:只是检索页面大小的块区的数据,而非检索所有的数据(3)Oracle的Top-N分页技术select * from (select rownum r,表名.* from 表名) where r between 从那开始 and 到那结束;例:查询1~10条记录select * from (select rownum r,student.* from student) where r between 1 and 10;(4)MySQL的Top-N分页技术limit函数:第一个参数,从哪个元素开始(第一条记录为0);第二个元素,获取记录的条数。
J2EE课程设计实训教学示例项目——《网上银行账户管理系统》——银行帐户管理系统的需求和设计
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——银行帐户管理系统的需求和设计1.1.1银行帐户管理系统的需求和设计1 、银行帐户管理系统的主要的功能银行账户是开展各项金融业务的基础,是一切金融交易的门槛,不论什么样的金融交易,只要通过银行,都表现为资金从一个账户到另一个账户的转移,都会在账户记录中留下痕迹。
因此,必须加强银行账户系统的信息化建设,加大对账户资金流动的监控力度。
用户到银行办理业务主要有开户、存款、取款、查询、转账、改密码、销户等七项工作。
因此,系统的前台基本功能应该包含开户、存款、取款、查询、转账、改密码、销户等多项功能模块。
通过该银行账户管理系统的开发,使银行的账户管理工作系统化、规范化、自动化,从而达到提高账户管理效率的目的,使有关的工作人员可以轻松快捷地完成对账户管理的任务。
2、系统的基本要求本系统选题为银行账户管理系统,是模拟银行账户的管理开发的。
设计的指导思想是一切为使用者着想,界面要美观大方,操作尽量简单明了,而且作为一个实用的管理系统要有良好的容错性,在出现误操作时能尽量及时地给出警告,以便用户及时地改正。
本系统的具体表现为:1)系统应符合银行账户管理的规定,满足银行相关人员日常使用的需要,并达到操作过程中的直观、方便、实用安全等要求;2)系统采用模块化程序设计方法,即便于系统功能的各种组合和修改,又便于系统以后的扩展和功能完善;3)系统应具备数据库维护功能,及时根据应用的需求进行数据的添加、删除、等操作。
3、基本功能描述(1)开户1)功能描述:用户向银行前台工作人员出示身份证,填写姓名、家庭住址、身份证号码,并且决定开始要存入的初始金额;银行工作人员给用户开出帐号以及给出密码和开户日期。
2)操作者:前台工作人员3)用户输入:输入用户姓名、初始金额、身份证号4)输出:帐号、密码、开户日期(2)存款1)功能描述:用户向银行前台工作人员提供帐号,并且决定要存入的金额;银行工作人员给用户帐号的余额和存款日期。
课程设计实训教学示例项目——《网上银行账户管理系统》——前台客户信息的DAO组件及测试(第1部分)
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——前台客户信息的DAO组件及测试(第2/2部分)1.1.1明确DAO组件的设计原则1、DAO接口的设计要点:(1)接口的语义应该仅限于反映对实体的持久化操作(CRUD)比如create、update、delete、findByXXX等。
在DAO接口中不能带有任何的业务语义(商业)。
如果不遵守这个原则,会造成业务逻辑与数据逻辑的混淆,不符合高内聚的最高原则。
(2)DAO实现类的编程要求独立的数据保持组件可以将应用程序与数据源名称、连接信息、DB管理方面的帐户等数据库相关内容隔离开。
因此,应该将这些内容放到某个XML的配置文件中。
(3)DAO(数据访问逻辑组件)的主要作用数据访问逻辑组件主要完成从数据库中检索数据和把实体数据保存回数据库中。
数据访问逻辑组件还包含实现数据相关操作所需的事务控制逻辑。
2、DAO类设计一般的方式(1)每个数据库表对应一个DAO组件-----遵守“单一职责”(2)一个DAO组件对应多个不同的数据库表(这些数据库表之间的数据有紧密关系)1.1.2提供与用户信息相关的DAO组件1、添加一个所有DAO组件的共同接口AllDAOBaseInterface(1)接口的名称为AllDAOBaseInterface,包名称为com.px1987.webbank.dao.inter(2)设计该AllDAOBaseInterfac接口package com.px1987.webbank.dao.inter;import java.sql.Connection;public interface AllDAOBaseInterfac {public void setCon(Connection con);}注意:该接口是为了能够在后面应用动态代理技术而提供的,以便能够注入数据库连接Connection对象。
基于Struts+Spring+JDBC架构课程设计实训项目——《网上银行账户管理系统》——构建表示层中的各个页面组件
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——构建表示层中的各个页面组件1.1.1应用系统表示层设计的要点1、表示层应该包含所有表示用户看到的应用程序屏幕的边界类(视图类)。
该层的主要职责是:(1)提供友好、方便的用户界面一个好的应用程序不仅要有强大的功能,还要有美观实用的用户界面。
合理利用空间,保持界面的简洁;合理利用颜色、图像和显示效果来达成内容与形式的统一。
(2)收集(通过表单)、预处理用户的输入信息(对用户输入进行错误检查---JavaScript 或者采用服务器端)(3)显示处理后的结果数据(JSTL或者EL)(4)编辑并校验输入数据的合法性(5)格式化处理结果(6)将输入数据向前传递给请求控制层(Servlet)以屏蔽后台文件的物理结构关系(7)展示的方式支持浏览器方式、应用程序方式。
2、在设计时所应该要考虑的问题(1)界面设计的一致性在界面设计中应该保持界面的一致性,一致性既包括使用统一的界面元素、标准的控件,也包括使用相同的信息表现方法;如在字体、标签风格、颜色、术语、显示错误信息等方面确保一致。
(2)布局合理化原则1)界面风格要支持目前流行的浏览器,并且要使用样式表CSS;应注意在一个窗口内部所有控件的布局和信息组织的艺术性,务求美观大方。
2)在一个窗口中按tab键,移动聚焦的顺序不能杂乱无章,tab 的顺序应为先从上至下,再从左至右。
一屏中首先应输入的和重要信息的控件在tab顺序中应当靠前,也应放在窗口上较醒目的位置。
3)布局力求简洁、有序、易于操作。
(3)数据的输入如何获得基于无状态HTTP的请求数据?如何将请求的字符数据转换为对应的模型对象?(4)输入数据的验证如何验证输入数据的合法性并给出明确的错误消息提示?(5)数据的输出如何展现复杂的对象结构?如何处理复杂的展现逻辑?(6)数据的传递和共享如何在不同的请求或页面之间传递和共享数据?(7)页面的流程管理如何管理Web应用中的页面流程?(8)模块化的管理如何将复杂的Web应用以模块化的方式管理?(9)灵活可扩展的架构如何支持各种不同的展现层技术?如何与业务层或数据层的各种框架整合?(10)安全和访问控制的管理如何提供基于Web的安全机制和资源访问控制的管理?(11)代码实现的简洁和高效如何让开发步骤和代码维护变得简单?如何尽量减少开发的中间环节?如何将公共的功能剥离出来,并可以灵活的组装应用?(12)其它问题异步调用、国际化支持、文件上传、防止重复提交等等。
J2EE课程设计实训项目——《网上银行账户管理系统》——构建Struts2控制层中的各个Action组件(第2部分)
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——构建Struts2控制层中的各个Action组件(第2/4部分)1.1.1构建后台管理控制层中图像显示的Action组件1、添加JFreeChartAction组件(1)包名称为com.px1987.webbank.action并继承于AllActionBase类、并且实现com.opensymphony.xwork2.ModelDriven接口类(2)编程该JFreeChartAction组件中的各个控制方法package com.px1987.webbank.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;import com.px1987.webbank.actionform.JFreeChartInfoActionForm;import com.px1987.webbank.constant.WebBankAllConstants;import com.px1987.webbank.exception.WebBankException;import com.px1987.webbank.jfreechart.WebChartCommander;public class JFreeChartAction extends AllActionBase implements ModelDriven<JFreeChartInfoActionForm> {private static final long serialVersionUID = -5896732237807922548L;private JFreeChartInfoActionForm oneJFreeChartInfo=new JFreeChartInfoActionForm();String resultImageFileName=null;String targetImageFileURL=null;String chartTitleString=null;String categoryName=null;String numberString=null;String webChartType=null;String chartWidth=null;public JFreeChartAction() {}public JFreeChartInfoActionForm getModel() {return oneJFreeChartInfo;}public String doMVCImagesUserInfo() {initServletContextObject();chartTitleString=getModel().getChartTitle();categoryName=getModel().getCategoryName();numberString=getModel().getNumberString();webChartType=getModel().getWebChartType();chartWidth=getModel().getChartWidth();chartHeight=getModel().getChartHeight();int webChartTypeIndex=Integer.parseInt(webChartType);try {resultImageFileName=newWebChartCommander().produceCommandRequest(WebBankAllConstants.webChartFrameWor kType_JFreeChart,webChartTypeIndex,chartTitleString, categoryName,numberString,chartWidth,chartHeight,session);}catch (WebBankException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}targetImageFileURL=request.getContextPath()+"/DisplayChartServlet?filename="+ resultImageFileName;request.setAttribute("resultImageFileName",resultImageFileName);request.setAttribute("targetImageFileURL",targetImageFileURL);return "mvcImagesUserInfo";}}2、在struts-adminForwordAction.xml中配置该Action组件类<action name ="*JFreeChartAction"class="com.px1987.webbank.action.JFreeChartAction"method="{1}" ><result name="mvcImagesUserInfo">/systemManage/userInfos/mvcImagesUserInfo.jsp</result></action>1.1.2构建后台管理控制层中用户信息显示的Action组件1、添加AdminManageAction组件(1)包名称为com.px1987.webbank.action并继承于AllActionBase类、并且实现com.opensymphony.xwork2.ModelDriven接口类(2)编程该AdminManageAction组件中的各个控制方法package com.px1987.webbank.action;import java.io.UnsupportedEncodingException;import java.util.ArrayList;import com.opensymphony.xwork2.ModelDriven;import com.px1987.webbank.actionform.AdminManageActionForm;import com.px1987.webbank.constant.WebBankAllConstants;import com.px1987.webbank.exception.WebBankException;import erInfoManageImpleFacade;import com.px1987.webbank.model.vo.PageStateVO_Prototype;import erInfoVO;public class AdminManageAction extends AllActionBase implements ModelDriven <AdminManageActionForm>{private static final long serialVersionUID = -8904416180148124024L;private AdminManageActionForm oneAdminManageActionForm=new AdminManageActionForm();public AdminManageAction() {}public String doQueryUserInfo() {UserInfoManageImpleFacade oneUserInfoManageImpleFacade=null;initServletContextObject();String userSex=getModel().getUserSex();String userType=getModel().getUserType();String userComeFrom=getModel().getUserComeFrom();UserInfoVO oneUserInfoVOPartProperty=new UserInfoVO();oneUserInfoVOPartProperty.setUserSex(Integer.parseInt(userSex));oneUserInfoVOPartProperty.setUserType(Integer.parseInt(userType));oneUserInfoVOPartProperty.setRegisterTime(registerTime);oneUserInfoVOPartProperty.setUserComeFrom(userComeFrom);ArrayList onePageUserInfoVOArrayList=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();//根据该用户的ID获得其各个帐户信息(但只取出第一页的数据)onePageStateVO_Prototype.setThisPageNumber(1);onePageStateVO_Prototype.setPageSize(WebBankAllConstants.webServiceManage_ pageSize);onePageUserInfoVOArrayList=oneUserInfoManageImpleFacade.doGetOnePageUserIn foByUserType(onePageStateVO_Prototype, oneUserInfoVOPartProperty);}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return "showWebAppError";}//未找到目标数据时,则显示错误if(onePageUserInfoVOArrayList.size()==0){request.setAttribute("errorText","没有找到满足条件的用户信息");return "showSystemManageActionErrorInfo";}// 如果找到满足条件的用户信息,则转到显示输出的页面中显示输出request.setAttribute("onePageUserInfoVOArrayList",onePageUserInfoVOArrayLi st);request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype);request.setAttribute("currentPageNumber",newInteger(onePageStateVO_Prototype.getThisPageNumber()).toString());request.setAttribute("userType",userType);request.setAttribute("userSex",userSex);request.setAttribute("registerYear",registerTime);request.setAttribute("userComeFrom",userComeFrom);return "forwardShowQueryUserInfoResult";}public String doQueryUserInfoTargetPage() {UserInfoManageImpleFacade oneUserInfoManageImpleFacade=null;initServletContextObject();String targetPageNumber=request.getParameter("targetPage");String userType=request.getParameter("userType");String userSex=request.getParameter("userSex");String registerTime=request.getParameter("registerYear");String userComeFrom=request.getParameter("userComeFrom");try { //由于是超链接提交,因此只好手动转换userComeFrom=new String(userComeFrom.getBytes("ISO8859-1"),"gb2312");}catch (UnsupportedEncodingException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}UserInfoVO oneUserInfoVOPartProperty=new UserInfoVO();oneUserInfoVOPartProperty.setUserSex(Integer.parseInt(userSex));oneUserInfoVOPartProperty.setUserType(Integer.parseInt(userType));oneUserInfoVOPartProperty.setRegisterTime(registerTime);oneUserInfoVOPartProperty.setUserComeFrom(userComeFrom);ArrayList<UserInfoVO> onePageUserInfoVOArrayList=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(targetPageNumb er));onePageStateVO_Prototype.setPageSize(WebBankAllConstants.webServiceManage_ pageSize);onePageUserInfoVOArrayList=oneUserInfoManageImpleFacade.doGetOnePageUserIn foByUserType(onePageStateVO_Prototype, oneUserInfoVOPartProperty);}catch(WebBankException e){request.setAttribute("errorText", e.getMessage());return "showWebAppError";}request.setAttribute("onePageUserInfoVOArrayList",onePageUserInfoVOArrayLi st);request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype);request.setAttribute("currentPageNumber",newInteger(onePageStateVO_Prototype.getThisPageNumber()).toString());request.setAttribute("userType",userType);request.setAttribute("userSex",userSex);request.setAttribute("registerYear",registerTime);request.setAttribute("userComeFrom",userComeFrom);return "forwardShowQueryUserInfoResult";}public AdminManageActionForm getModel() {return oneAdminManageActionForm;}}2、在struts-adminForwordAction.xml中配置该Action组件类<action name ="*AdminManageAction"class="com.px1987.webbank.action.AdminManageAction"method="{1}" ><result name="forwardShowUserInfo">/systemManage/userInfos/showUserInfo.jsp</result></action>注意:在<result>标签中不能采用这样形式的目标/adminForwordAction!forwardShowUserInfo.action。
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;}}。
课程设计实训教学示例项目——《网上银行账户管理系统》——构建项目数据库连接组件和测试(第3部分)
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——构建项目数据库连接组件和测试(第3/6部分)1.1.1对前面的数据库连接ConnectDBBean组件应用单元测试1、单元测试(1)单元测试有关的概念(2)为什么要应用它?(3)如何应用它?-----应用JUnit框架2、添加一个测试项目----应该将测试项目和被测试的项目相互分离!(1)添加一个Java测试项目(2)项目的名称为TestWebBank(3)最后为下面的状态3、在测试项目中添加对应用项目的引用为了能够在测试项目中对被测试项目中的各个类进行使用,需要在测试项目中添加对应用项目的引用。
4、在测试项目中添加JUnit框架有关的系统包文件(1)在Eclipse中直接添加JUnit的系统包文件(2)选择JUnit4.0系统版本库(3)注意:JUnit4.X版提供了许多方便单元测试的各个功能!5、在测试项目中添加测试用例(TestCase)类(测试类)什么是测试用例?编程要点?(1)添加测试用例类(2)类名称为TestConnectDBBean添加类名称为TestConnectDBBean,包名称为com.px1987.webbank.daotest,被测试的类选择为com.px1987.webbank.dao.imple.ConnectDBBean。
(3)点击“Next”下一步按钮,将出现下面的状态。
(4)编程该测试用例类中的各个测试方法(5)最终的程序代码package com.px1987.webbank.daotest;import static org.junit.Assert.*;import java.sql.Connection;import org.junit.After;import org.junit.Assert;import org.junit.Before;import org.junit.Test;import com.px1987.webbank.config.ClassNameConfig; import com.px1987.webbank.dao.inter.ConnectDBInterface; import com.px1987.webbank.exception.WebBankException; import com.px1987.webbank.factory.ConnectDBFactory; public class TestConnectDBBean {ConnectDBInterface connectDBBean=null;String connectDBBeanClassName=null;@Beforepublic void setUp() throws Exception {connectDBBeanClassName=ClassNameConfig.getProperty("connectDBBean.classNam e");connectDBBean=newConnectDBFactory().newConnectDBBean(connectDBBeanClassName);}@Afterpublic void tearDown() throws Exception {connectDBBean=null;}@Testpublic void testCloseDBCon() throws WebBankException {connectDBBean.closeDBCon();boolean isDBConnectionClose=connectDBBean.isDBConnectionClose();Assert.assertTrue(isDBConnectionClose); //断言}@Testpublic void testGetConnection() throws WebBankException{Connection returnDBCon=connectDBBean.getConnection();Assert.assertNotNull(returnDBCon); //断言}}注意:由于采用的是JUnit4.0系统库,现在改变为“Java标注”的方式实现---其中的@Before、@After和@Test等符号。
课程设计实训教学示例项目——《网上银行账户管理系统》——构建控制层中的各种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有关的系统配置是正确的杨教授大学堂,版权所有,盗版必究。
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 >以避免产生出下面的错误。
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——系统需求说明书
J2EE课程设计实训教学示例项目《网上银行账户管理系统》系统需求说明书目录第一章引言 (3)1.1 目的 (3)1.2 背景 (3)第二章任务概述 (3)2.1目标 (3)2.2用户的特点 (3)第三章功能需求 (4)3.1系统划分 (4)3.2用户角色划分: (4)3.3前台服务的用例图 (5)第四章非功能性需求 (16)4.1 对性能的规定---精度 (16)4.2 时间特性要求 (16)4.3灵活性 (16)4.4 输人输出要求 (17)4.5 数据管理能力要求 (17)4.6 故障处理要求 (17)4.7 其他专门要求 (18)第五章运行环境需求 (18)5.1 对网络构建的需求 (18)5.2 硬件设备 (18)5.3支持软件 (18)第一章引言1.1 目的本文档作为银行客户关系管理(CRM,Customer Relationship Management)系统中的帐户子系统第一期的需求说明文档,用于与用户确定最终的目标,并成为协议文本的一部分,同时也是本系统设计人员的基础文档。
1.2 背景银行账户是开展各项金融业务的基础,是一切金融交易的门槛,不论什么样的金融交易,只要通过银行,都表现为资金从一个账户到另一个账户的转移,都会在账户记录中留下痕迹。
因此,必须加强银行账户系统的信息化建设,加大对账户资金流动的监控力度。
用户到银行办理业务主要有开户、存款、取款、查询、转账、改密码、销户等七项工作。
因此,系统的前台基本功能应该包含开户、存款、取款、查询、转账、改密码、销户等多项功能模块。
通过该银行账户管理系统的开发,使银行的账户管理工作系统化、规范化、自动化,从而达到提高账户管理效率的目的,使有关的工作人员可以轻松快捷地完成对账户管理的任务。
第二章任务概述2.1目标在本实训课结束时,使自己具有J2EE Web技术开发的经历,并且懂得如何获取专业领域的知识的能力。
2.2用户的特点(1)本软件的最终用户的特点:所有上网用户在无需培训的情况下,按照网站页面提示即可使用网站的相关服务和功能(2)后台管理和维护人员的教育水平和技术专长:本软件的后台管理和维护人员均是具有一定网络知识的人员。
基于Struts+Spring+JDBC的课程设计项目——《网上银行账户管理系统》——构建数据访问层中的各个实体PO类
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——构建数据访问层中的各个实体PO类1.1.1应用系统中的数据表示----不同的“层”应该有自己的数据表示1、请思考应用系统中的各层数据的划分原则三层体系结构中的数据表示首先要做到的是数据的低耦合度,一般的表示应该如下:(1)Web层的数据表示是ActionFormBean(如Struts框架),数据来源于表单,视图层负责向用户展示模型状态。
(2)业务层的数据表示是VO类,业务层负责业务逻辑。
(3)持久层的数据表示是PO()类,其数据来源于数据库表或者XML文件这样将可以实现在一个规范的J2EE架构中,不同层的数据表示应该被限制在层内,而不应该扩散到其它层,从而就可以降低层间的耦合性,提高J2EE架构整体的可维护性和可扩展性。
比如说Web层的逻辑进行了修改,那么只需要修改Web层的Form Bean结构,而不需要触动业务层和持久层的代码修改。
同样的,当数据库表进行了小的调整,那么也只需要修改持久层数据表示,而不需触动业务层代码和Web层代码。
1.1.2在数据访问层中添加各个PO类----应该考虑能否应用继承(减少属性重复)1、建立各个PO(1)UserInfoBasePO基类,包名称为com.px1987.webbank.dao.po(2)添加下面的各个成员属性private String id;private String userName;private String userPassWord;private int userType;private String aliaoName;private String passWordAsk;private String userImage;private String registerTime;private String passWordAnswer;private String userMail;private int userSex;private String userBirthDay;private String userComeFrom;private String userResume;private String confirmDate;private boolean validateFlag;(3)并为这些成员属性提供get/set方法(4)生成hashCode()和equals()方法为什么要生成?Hashcode和equals 这2个方法都是用来判断2个对象是否相等的,但是他们是有区别的。
基于Struts+Spring+JDBC架构课程设计实训项目——《网上银行账户管理系统》——系统部署有关的各种UML图
基于 Struts+Spring+JDBC 架构的课程设计实训教学示例项目—— 《网上 银行账户管理系统》——系统部署有关的各种 UML 图
1.1.1 为系统提供一个部署视图 1、打开缺省的部署视图
2、在该部署视图中添加各个有关的节点 (1)处理器 客户主机(浏览器) 、Web 服务器(Apache) 、应用服务器(Tomcat) 、数据库服务器 (Oracle 数据库系统) 。 (2)设备 打印机、条码扫描仪 3、在部署视图中描述它们 (1)在部署视图中添加各个节点
杨教授大学堂,版权所有,盗版必究。
1/2 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
(2)采用连接线连接ห้องสมุดไป่ตู้们
杨教授大学堂,版权所有,盗版必究。
2/2 页
课程设计实训教学示例项目《网上银行账户管理系统》——构建Struts2控制层中各个ActionForm组件(第1部分)
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
get/set 方法。
(3)最后产生出下面的结果
(4)由于 Struts2 具有自动地进行数据类型的转换功能,因此可以直接将数据定义为某个 目标类型 public Date getUserBirthDay() {
(2)在该 UserInfoActionForm 类中添加下面的各个成员属性 String userID=null; String verifyCodeDigit=null; String login_GetPassWord_ActionType=null; String userName=null; UserPassWordBean oneUserPassWordBean=null; 自动转换
return userBirthDay; }
杨教授大学堂,版权所有,盗版必究。 3/17 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
public void setUserBirthDay(Date userBirthDay) { erBirthDay = userBirthDay; } (5)UserInfoActionForm 类的程序代码示例 package com.px1987.webbank.actionform; import java.io.*; public class UserInfoActionForm { String userID=null; String verifyCodeDigit=null; String login_GetPassWord_ActionType=null; String userName=null; UserPassWordBean oneUserPassWordBean=null; 自动转换 String aliaoName=null; String type_User_Admin=null; String userMail=null; String userImage=null; String userSex=null; String registerTime=null; String userBirthDay=null; String userComeFrom=null; String stateName=null; String cityName=null; String userResume=null; String userType=null; String adminUserType=null; String userSign=null; String userQQCode=null; String userICQCode=null; String userMSNCode=null;
课程设计实训教学示例项目——《网上银行账户管理系统》——在项目中添加各种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年。
课程设计实训教学示例项目——《网上银行账户管理系统》——根据省名获得该省中的各个城市名称的DAO组件
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——根据省名获得该省中的各个城市名称的DAO 组件1.1.1提供根据省名获得该省中的各个城市名称的DAO组件1、提供StateCityManageDAOInterface接口(1)接口名称为StateCityManageDAOInterface,包名称为com.px1987.webbank.dao.inter,并且继承于com.px1987.webbank.dao.inter.AllDAOBaseInterface接口(2)设计该接口package com.px1987.webbank.dao.inter;import java.util.List;import eFromPO;import com.px1987.webbank.exception.WebBankException;public interface StateCityManageDAOInterface extends AllDAOBaseInterface{public List<ComeFromPO> selectAllCityNameInOneState(String stateName) throws WebBankException;}2、提供StateCityManageDAOInterface接口的实现类StateCityManageDAOJDBCImple(1)新增加StateCityManageDAOJDBCImple类,包名称为com.px1987.webbank.dao.imple,并且从java.util.Observable类继承(2)编程该实现类package com.px1987.webbank.dao.imple;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import java.util.Observable;import com.px1987.webbank.config.ClassNameConfig;import com.px1987.webbank.dao.inter.ConnectDBInterface;import com.px1987.webbank.dao.inter.StateCityManageDAOInterface;import eFromPO;import com.px1987.webbank.exception.WebBankException;import com.px1987.webbank.factory.ConnectDBFactory;import com.px1987.webbank.factory.GenerialFactory;import com.px1987.webbank.factory.LogInfoFactory;public class StateCityManageDAOJDBCImple extends Observable implementsStateCityManageDAOInterface { Connection con=null;public void setCon(Connection con) {this.con = con;}ConnectDBInterface connectDBBean=null;String connectDBBeanClassName=null;/* 采用工厂方式实现时 */public StateCityManageDAOJDBCImple(){connectDBBeanClassName=ClassNameConfig.getProperty("connectDBBean.className");}public Connection getConnection() throws WebBankException{// connectDBBean=newConnectDBFactory().newConnectDBBean(connectDBBeanClassName);connectDBBean = (ConnectDBInterface)new GenerialFactory().newSomeOneInstance(connectDBBeanClassName);con=connectDBBean.getConnection();return con;}/* 利用 Spring IOC获得目标对象public StateCityManageDAOJDBCImple(){}DataSource dataSource=null;public DataSource getDataSource() {return dataSource;}public void setDataSource(DataSource dataSource) {this.dataSource = dataSource;}public Connection getConnection() throws WebBBSException{if(dataSource==null){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("由Spring 所提供的DataSource对象为空!");}try{con=dataSource.getConnection();}catch(SQLException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在getConnection方法中出现连接数据库错误!,异常的详细内容为:"+e.getMessage());}return con;}*/public List<ComeFromPO> selectAllCityNameInOneState(String stateName)throws WebBankException {List<ComeFromPO> allComeFromPOs=new ArrayList<ComeFromPO>();ResultSet rs=null;ComeFromPO oneComeFromPO=null;PreparedStatement pstmt =null;String selectStatement="select * from comeFrom where stateName=?";con=getConnection();try{try {pstmt = con.prepareStatement(selectStatement,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);} catch (SQLException e) {int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e);throw new WebBankException("SQL语句可能不正确!系统原始的异常信息的详细内容为:"+e.getMessage());}try{pstmt.setString(1, stateName);}catch (SQLException e) {int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBankException("在设置SQL查询参数中出现了错误!系统原始的异常信息的详细内容为:"+e.getMessage());}try {rs=pstmt.executeQuery();} catch (SQLException e) {int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBankException("在StateCityManageDAOJDBCImple类中的selectAllCityNameInOneState方法中在查询数据库表时出现错误!,异常的详细内容为:"+e.getMessage());}try{while(rs.next()){oneComeFromPO=new ComeFromPO();oneComeFromPO.setComeFromID(rs.getString("comeFromID"));oneComeFromPO.setStateName(rs.getString("stateName"));oneComeFromPO.setCityName(rs.getString("cityName"));allComeFromPOs.add(oneComeFromPO);}}catch (SQLException e) {int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e);throw new WebBankException("在StateCityManageDAOJDBCImple类中的selectAllCityNameInOneState方法中结果集操作中出现了错误!系统原始的异常信息的详细内容为:"+e.getMessage());}}finally{try{con.close();}catch(SQLException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBankException("在selectAllCityNameInOneState方法中不能正确地关闭数据库连接!,异常的详细内容为:"+e.getMessage());}}return allComeFromPOs;}}3、添加一个工厂类,用来统一创建StateCityManageDAOInterface接口的对象实例(1)StateCityManageDAOFactory类,包名称为com.px1987.webbank.factory ,并且从java.util.Observable类继承(2)编程该StateCityManageDAOFactory类package com.px1987.webbank.factory;import java.util.Observable;import com.px1987.webbank.config.ClassNameConfig;import com.px1987.webbank.dao.inter.StateCityManageDAOInterface;import com.px1987.webbank.exception.WebBankException;public class StateCityManageDAOFactory extends Observable {public StateCityManageDAOFactory() {}public StateCityManageDAOInterface newStateCityManageDAOBean(String stateCityManageDAOJDBCImpleClassName) throws WebBankException{StateCityManageDAOInterface oneStateCityManageDAOJDBCImple=null;Class oneClass=null;try {oneClass = Class.forName(stateCityManageDAOJDBCImpleClassName);}catch (ClassNotFoundException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBankException("不能正确地获得"+stateCityManageDAOJDBCImpleClassName+"类");}try {oneStateCityManageDAOJDBCImple =(StateCityManageDAOInterface)oneClass.newInstance();}catch (InstantiationException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBankException("不能正确地创建"+stateCityManageDAOJDBCImpleClassName+"类的对象实例");}catch (IllegalAccessException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBankException("不能正确地创建"+stateCityManageDAOJDBCImpleClassName+"类的对象实例");}return oneStateCityManageDAOJDBCImple;}}杨教授大学堂精心创作的优秀程序员职业提升必读系列资料4、修改classNameConfig.xml以添加对StateCityManageDAOJDBCImple类的定义<className><classNameID>stateCityManageDAOJDBCImple.className</classNameID> <classNamePath>com.px1987.webbank.dao.imple.StateCityManageDAOJDBCImple </classNamePath></className>杨教授大学堂,版权所有,盗版必究。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Struts+Spring+JDBC架构的课程设计实训教学示例项目——《网上银行账户管理系统》——构建项目数据库连接组件和测试(第2/6部分)1.1.1分离持久层中的数据库连接组件中的与环境有关的参数1、添加一个属性配置文件 classNameConfig.properties或者XML文件(1)为什么要采用配置文件?1)作用是什么?----灵活地满足变化!2)是采用*.properties还是*.xml格式3)如何对配置文件中的项目进行读写?----利用java.util.Properties类利用该配置文件,封装系统中的各个“可变的工作参数”——也就是“策略模式”中的“环境”。
(2)在项目中添加属性配置文件 classNameConfig.properties(3)目前的内容如下(连接MS SQLServer2000的数据库系统、MySQL数据库等)JDBC_DBDriver_ClassName =net.sourceforge.jtds.jdbc.DriverJDBC_DSN_URL = jdbc:jtds:sqlserver://127.0.0.1:1433/webbankJDBC_dbUserName =saJDBC_dbUserPassWord =1234JDBC_dbcp_maxActive =10JDBC_DBDriver_ClassName= com.mysql.jdbc.DriverJDBC_DSN_URL = jdbc:mysql://localhost:3306/webbankJDBC_dbUserName=rootJDBC_dbUserPassWord=rootJDBC_dbcp_maxActive=10JDBC_DBDriver_ClassName= sun.jdbc.odbc.JdbcOdbcDriverJDBC_DSN_URL = jdbc:odbc:webbankDSNJDBC_dbUserName=rootJDBC_dbUserPassWord=rootJDBC_dbcp_maxActive=10注意:也可以采用XML形式的配置文件。
2、添加一个获得配置属性的ClassNameConfig类(也就是策略模式中的环境类Context)(1)包名称为com.px1987.webbank.config(2)内容如下package com.px1987.webbank.config;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.Properties;import com.px1987.webbank.exception.WebBankException; public class ClassNameConfig {public ClassNameConfig()throws WebBankException {}static Properties oneProperties=null; //?static{oneProperties=new Properties();InputStream propertiesFileStream=ClassNameConfig.class.getResourceAsStream("/classNameConfig.properties");try {oneProperties.load(propertiesFileStream);} catch (IOException e) {System.out.println("在加载属性文件时程序出现了异常错误!");}}public static String getProperty (String propertiesName){return oneProperties.getProperty(propertiesName);}public static void setProperty (String propertiesName,String propertiesValue){ oneProperties.put(propertiesName, propertiesValue);}public void savePropertiesItem(String propertiesFileName)throws WebBankException{ OutputStream propertiesFileStream=null;try {propertiesFileStream = new FileOutputStream(propertiesFileName);} catch (FileNotFoundException e) {throw new WebBankException("在保存属性文件时程序出现了异常错误!");}try {oneProperties.store(propertiesFileStream, "这是修改后的属性文件内容");} catch (IOException e) {throw new WebBankException("在保存属性文件时程序出现了异常错误!");}}public void savePropertiesItemToXML(String xmlPropertiesFileName)throws WebBankException{OutputStream propertiesFileStream=null;try {propertiesFileStream = new FileOutputStream(xmlPropertiesFileName);} catch (FileNotFoundException e1) {throw new WebBankException("在保存属性文件时程序出现了异常错误!");}try {oneProperties.storeToXML(propertiesFileStream, "这是修改后的属性文件内容","gb2312");} catch (IOException e) {throw new WebBankException("在保存属性文件时程序出现了异常错误!");}}}(3)注意的问题1)其中的“private static Properties props=null;”为什么要设计为static ?(达到全局缓存)2)static语句块是在什么时候执行?3)static语句块也能够产生一种“单例”(单一对象,也就是单例设计模式)的效果(可以参考Hibernate框架所提供的HibernateUtil.java类代码)(4)Class类中的getResourceAsStream方法直接返回一个InputStream流对象getResourceAsStream方法是查找具有给定名称的资源,返回InputStream对象。
注意getResourceAsStream方法是相对与”/”根路径下的位置。
这样的路径是指定绝对路径,如果不以”/“开头,则路径是相对与这个class所在的包的(表示从当前classs下面的路径找文件)。
InputStreaminput=ClassNameConfig.class.getResourceAsStream("/classNameConfig.properties");(5)Class/ClassLoader类中的getResource()方法返回的是一个URL对象Class/ClassLoader类中的getResource方法是查找带有给定名称的资源路径并返回一个URL对象(其实Class.getResource()方法是委托装入该类的类装载器,并最后返回一个用于读取类文件资源的URL);当然,当指定的类名字不能在当前的classpath中找到时,Class.getResource()方法将返回null。
Class/ClassLoader类中的getResource()方法两者不同是Class类中的getResource()方法是从当前包路径查找资源,而ClassLoader类则是从系统的classpath的根查找;比如com.px1987.ClassA.getResource("a.gif")得到的是com/px1987/a.gif文件。
如果在根路径(classpath),使用com.px1987.ClassA.getResource("/a.gif")或getClass().getClassLoader().getResource("a.gif")。
(6)Thread类中的contextClassLoader属性代表线程的上下文 ClassLoader 每个运行中的线程都有一个成员contextClassLoader,用来在运行时动态地载入其它类,系统默认的contextClassLoader是systemClassLoader,所以一般而言java程序在执行时可以使用JVM自带的类、$ JA V A_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类,并且在程序中可以使用Thread.currentThread(). getContextClassLoader()方法获得当前线程的contextClassLoader。
因此,在某个线程中需要应用某个类,可以首先利用Thread.currentThread().getContextClassLoader()方法获得该线程的contextClassLoader;然后contextClassLoader请求它的父ClassLoader来完成该载入请求;但如果父ClassLoader无法载入类,则contextClassLoader试图自己来载入。
下面为JDK API帮助中对Thread类中的getContextClassLoader方法的说明。
InputStream input =Thread.currentThread().getContextClassLoader().getResource("classNameConfig.properties" ).openStream();其实等同于下面的代码:ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();URL oneURL = currentClassLoader.getResource("classNameConfig.properties");InputStream input = oneURL.openStream();补充资料:1、URI形式的绝对资源路径如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.bURL是URI的特例。