J2EE课程设计实训项目——《BBS论坛系统》——实现项目中的Struts2框架与Spring框架进行整合(第2部分)
- 格式:pdf
- 大小:212.40 KB
- 文档页数:19
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——对Struts中的Action组件类进行STC单元测试1.1.1对控制层中的各个Action类进行测试1、将Strutstest所需要的*.jar包加入到本测试项目中(1)将Strutstest所需要的*.jar包strutstest-2.1.3.jar文件加入到本测试项目中,定位到我们的目标*.jar包的目录下,最后将产生出下面的状态。
(2)将J2EE Web技术中所需要的Servlet和JSP的*.jar包加入当然也可以直接使用在Tomcat中带有的servlet-api.jar和jsp-api.jar文件。
(3)再添加commons-collections.jar包文件2、添加log4J的属性配置文件和对应的Jar包文件(1)添加log4J的属性配置文件(2)添加log4j的jar包文件3、在测试的Java项目中添加一个针对UserManagerAction类的TestCase类(1)TestCase类为MockStrutsTestUserManagerAction(2)类名称为MockStrutsTestUserManagerAction,包名称为com.px1987.webbbs.actiontest,基类选择为servletunit.struts.MockStrutsTestCase,被测试的类为erManagerAction(3)然后选择被测试的方法(4)最后产生出下面的状态package com.px1987.webbbs.actiontest;import servletunit.struts.MockStrutsTestCase;public class MockStrutsTestUserManagerAction extends MockStrutsTestCase { public MockStrutsTestUserManagerAction(String arg0) {super(arg0);}protected void setUp() throws Exception {super.setUp();}protected void tearDown() throws Exception {super.tearDown();}public void testGoUpdateAdminInfo() {fail("尚未实现");}public void testGoUpdateUserInfo() {fail("尚未实现");}public void testGoLoginOrGetPassWord() {fail("尚未实现");}public void testGoUserLogin() {fail("尚未实现");}public void testGoGetPassWord() {fail("尚未实现");}public void testGoUserRegister() {fail("尚未实现");}}(5)编程MockStrutsTestUserManagerAction程序类中的相关方法的功能实现package com.px1987.webbbs.actiontest;import servletunit.struts.MockStrutsTestCase;import junit.framework.*;import java.io.*;public class MockStrutsTestUserManagerAction extends MockStrutsTestCase { public MockStrutsTestUserManagerAction(String arg0) {super(arg0);}protected void setUp() throws Exception {super.setUp();}protected void tearDown() throws Exception {super.tearDown();}public void testGoUserLogin() {// 下面的目录路径根据实际的状态,修改为对应的内容setContextDirectory(new File("D:/aaa/StrutsWebBBS+Spring/WebBBS/WebRoot"));setConfigFile("/WEB-INF/struts-config_userManage.xml");setRequestPathInfo("/userManagerAction");addRequestParameter("formType","1");addRequestParameter("login_GetPassWord_ActionType","1");addRequestParameter("type_User_Admin","1");addRequestParameter("userName","admin");addRequestParameter("userPassword","admin");actionPerform();verifyForward("showAllBBSClassInfo");verifyNoActionErrors();}}4、由于erInfoActionForm类为DynaActionForm类并且对其进行validate需要在struts-config_userManage.xml文件中添加userName和userPassWord的初始值,否则validate不能通过。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——在项目中应用Hibernate中的监听器和拦截器等组件技术1.1.1应用Hibernate中的监听器(事件)1、Hibernate中的监听器(1)主要的作用该事件系统可以用来替代拦截器,也可以作为拦截器的补充来使用;而且Session接口的每个方法都有相对应的事件。
比如 LoadEvent,FlushEvent等等(可以查阅XML配置文件的DTD,以及org.hibernate.event包来获得所有已定义的事件的列表)。
因此,可以应用Hibernate中的监听器来生成审计日志,审计主要是对数据库中重要数据的更新历史进行记录。
数据库系统所提供的触发器技术也可以用于生成审计日志,但是它不支持跨数据库平台,所以一般用Hibernate中的监听器。
(2)org.hibernate.event包中所定义的各个事件类(3)事件的产生和激活当某个方法被调用时,Hibernate Session会生成一个相对应的事件并激活所有配置好的事件监听器。
系统预设的监听器实现的处理过程就是被监听的方法要做的(被监听的方法所做的其实仅仅是激活监听器,“实际”的工作是由监听器完成的)。
当然,开发者也可以自由地选择实现一个自己定制的监听器(比如,实现并注册用来处理处理LoadEvent的LoadEventListener接口),来负责处理所有的调用Session的load()方法的请求。
(4)对事件监听器的编程要求事件监听器应该被看作是单例(singleton)对象,也就是说,所有同类型的事件的处理共享同一个事件监听器实例,因此在事件监听器类中不应该保存有任何状态(也就是不应该使用成员变量)。
(5)事件监听器的编程方法1)用户定制的监听器应该实现与所要处理的事件相对应的接口,或者从一个合适的基类继承(甚至是从Hibernate自带的默认事件监听器类继承)。
J2EE课程设计及项目实训教学中的项目需求分析——《BBS论坛系统》的需求说明1.1.1BBS论坛需求说明1、该网站建设包含以下子系统2、用户脚色划分(1)普通用户普通用户以游客身份登录,只具有察看帖子的功能,不能留言。
(2)注册用户具备普通用户所有的能力。
并且是已经注册了的用户,可以登录、修改个人信息,并且可以发表留言。
(3)管理员管理员登录以后可以对论坛系统进行管理,包括论坛的基本信息、用户设置,还可以修改管理员密码。
3、前台服务系统修改帖子(from Use Case View)3.1、注册主要是指除管理员以外的用户角色,在网上在线填写一些会员的注册信息。
注册后即可成为BBS论坛会员。
会员注册信息如下:注册确认用户通过网上在线注册后,由系统管理员收集相应的资料,核实后,进行用户注册确认,确认后用户成为会员正式生效,可以享受网站提供的各种服务。
3.2、登录用户输入登录信息,如用户名、密码、验证码,以会员的身份进入本论坛。
或者以游客身份登录,不需要输入任何信息即可。
3.3、修改信息会员登录成功后,可以修改自己的信息,如密码等。
3.4、留言管理会员有发布,回复帖子的功能。
但只有注册并且登录成功的会员才具有这一功能。
会员可以修改自己的留言和查看、删除、自己的帖子。
4、后台管理系统(1)各个子模块(2)系统管理员及其职责5、后台管理系统系统管理员登陆: 系统管理员提交用户名和密码,系统验证用户名和密码的合法性,系统显示系统管理员管理页面(包含管理员的信息)6、论坛基本信息管理:对网站参数、通行证设置、COOKIE设置、公告设置进行管理。
7、管理用户:管理员设置一些用户的信息,如:用户权限、封锁用户、用户级别设置等等。
8、发帖设置:对用户的帖子设置、上传文件设置、全文检索设置、缓存设置进行管理。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——实现项目中的Struts2框架与Spring框架进行整合(第1/3部分)1.1.1实现项目中的Struts2框架与Spring框架进行整合1、在项目中添加与Struts2有关的各个系统包(1)Struts2本身所需要的Jar包1)commons-logging-1.0.4.jar(已经在项目中存在了)2)freemarker-2.3.4.jar3)ognl-2.6.7.jar4)struts2-core-2.0.1.jar5)xwork-2.0-beta-1.jar(2)Struts2与Spring相互整合所需要的Jar包1)spring.jar(已经在项目中存在了)2)struts2-spring-plugin-2.0.11.2.jar(由Struts2提供)2、添加Struts2本身的系统环境配置----web.xml文件(1)在web.xml中添加Struts2的Filter(前端控制器)的部署项目(2)主要的内容<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、添加Struts2本身的系统环境配置----struts.xml文件(1)在项目中添加struts.xml文件以实现对项目中的各个Action组件类进行配置(2)设计该文件的内容(目前为下面的内容)<?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 ="sshwebbbs_Common" extends ="struts-default" ></package ></struts>该文件中的内容是随着开发的进度不断地进行调整和添加的。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——构建控制层中实现BBS信息管理的Action类1.1.1添加实现BBS信息管理的Action类1、用户信息管理的Action类BBSManagerAction(1)设置其配置参数1)/bbsManagerAction2)org.apache.struts.actions.DispatchAction3)com.px1987.webbbs.action.BBSManagerAction4)bbsInfoActionForm5)/showValidatorError.do(2)在parameter中输入action(3)最后将产生出下面的状态2、编程该Action类package com.px1987.webbbs.action;import java.io.UnsupportedEncodingException; import java.util.ArrayList;import java.util.Date;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.webbbs.actionform.BBSInfoActionForm;import com.px1987.webbbs.constant.WebBankAllConstants;import com.px1987.webbbs.exception.WebBBSException;import com.px1987.webbbs.model.BBSInfoManageInterface;import com.px1987.webbbs.model.BBSInfoVO;import com.px1987.webbbs.model.BBSReplyInfoVO;import com.px1987.webbbs.model.BBSTitleVO;import erInfoManageInterface;import erInfoVO;public class BBSManagerAction extends DispatchAction {BBSInfoManageInterface bbsInfoManagerBean=null;UserInfoManageInterface userInfoManageBean=null;public BBSManagerAction(){//本构造方法是在利用Spring IOC获得目标对象时被应用super();}/*String bbsInfoManageBeanClassName=null;String userInfoManageBeanClassName=null;public BBSManagerAction() throws WebBBSException{//本构造方法是在利用可配置化的工厂时被应用super();newUserAndBBSManageBean();}public void newUserAndBBSManageBean() throws WebBBSException{bbsInfoManageBeanClassName=ClassNameConfig.getProperty("bbsInfoManageImple.className");bbsInfoManagerBean=BBSInfoManageFactory.newBBSInfoManageBean(bbsInfoManageBeanClassName);userInfoManageBeanClassName=ClassNameConfig.getProperty("userInfoManageImple.className");userInfoManageBean=UserInfoManageFactory.newUserInfoManageBean(userInfoManageBeanClassName);}*/public void setBbsInfoManagerBean(BBSInfoManageInterface bbsInfoManagerBean) { this.bbsInfoManagerBean = bbsInfoManagerBean;}public void setUserInfoManageBean(UserInfoManageInterface userInfoManageBean) { erInfoManageBean = userInfoManageBean;}public ActionForward goSendOrPreView(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response){ActionForward targetActionForward=null;BBSInfoActionForm bbsInfoActionForm = (BBSInfoActionForm) form;int preViewState =Integer.parseInt((String)bbsInfoActionForm.get("preViewState"));switch(preViewState) {case 0:targetActionForward=goSendOneBBSInfo(mapping, form,request, response);break;case 1:targetActionForward=goPreViewOneBBSInfo(mapping,form,request, response);break;}return targetActionForward;}public ActionForward goSendOneBBSInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {boolean OkOrNot = false;BBSInfoActionForm bbsInfoActionForm = (BBSInfoActionForm) form;int bbsTitleID =Integer.parseInt((String)bbsInfoActionForm.get("bbsTitleID"));String userID =(String)bbsInfoActionForm.get("userID");String bbsTitleText =(String) bbsInfoActionForm.get("bbsTitleText"); String bbsAuther =(String) bbsInfoActionForm.get("bbsAuther");String mailtoAuthorString=(String)bbsInfoActionForm.get("mailtoAuthor"); if(mailtoAuthorString==null||mailtoAuthorString.equals("")) {mailtoAuthorString ="0";}int mailtoAuthor =Integer.parseInt(mailtoAuthorString);String bbsTypeIDString=(String)bbsInfoActionForm.get("bbsTypeID");if(bbsTypeIDString==null||bbsTypeIDString.equals("")){bbsTypeIDString ="0";}int bbsTypeID = Integer.parseInt(bbsTypeIDString);String bbsSubject =(String) bbsInfoActionForm.get("bbsSubject");String bbsAbstractText =(String) bbsInfoActionForm.get("bbsAbstractText"); String bbsIconIDString=(String)bbsInfoActionForm.get("bbsIconID");if(bbsIconIDString==null||bbsIconIDString.equals("")){bbsIconIDString ="0";}int bbsIconID =Integer.parseInt(bbsIconIDString);String bbsMessage =(String) bbsInfoActionForm.get("content");java.util.Date rightNow=new java.util.Date();String sendInfoTime=rightNow.toLocaleString();String lastUpdateTime=sendInfoTime;int replay=0;int hits=0;BBSInfoVO oneBbsInfoVO = new BBSInfoVO();Date nowDate=new Date();//不需要设置该值,可以由Hibernate自动来实现添加oneBbsInfoVO.setBbsID((int)nowDate.getTime());oneBbsInfoVO.setBbsTitleID(bbsTitleID);oneBbsInfoVO.setAuthor(bbsAuther);oneBbsInfoVO.setMailto(mailtoAuthor);oneBbsInfoVO.setBbsTypeID(bbsTypeID);oneBbsInfoVO.setTitle(bbsSubject);oneBbsInfoVO.setAbstractText(bbsAbstractText);oneBbsInfoVO.setBbsIconID(bbsIconID);oneBbsInfoVO.setContent(bbsMessage);oneBbsInfoVO.setSendInfoTime(sendInfoTime);oneBbsInfoVO.setLastUpdateTime(lastUpdateTime);oneBbsInfoVO.setReplay(replay);oneBbsInfoVO.setHits(hits);oneBbsInfoVO.setUserID(userID);oneBbsInfoVO.setBbsID((int)new Date().getTime());// newUserAndBBSManageBean(); //创建用户和BBS信息管理业务类的对象实例try{OkOrNot = bbsInfoManagerBean.doSaveBBSInfo(oneBbsInfoVO);}catch(WebBBSException e){request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}if (!OkOrNot) {request.setAttribute("errorText", "您的BBS留言信息没有正确地被保存!");return mapping.findForward("showWebAppError");}//***发表成功时,重新获得该分类中的各个BBS信息并跳转到显示该分类的页面中******* ArrayList allBBSInfoVOList = null;int totalBBSInfoCounter, totalBBSInfoPageCounter;// newUserAndBBSManageBean(); //创建用户和BBS信息管理业务类的对象实例try { //获得总数totalBBSInfoCounter = bbsInfoManagerBean.doGetPageTotalBBSInfoCounterByTitleID(bbsTitleID);}catch (WebBBSException e) {request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}int currentPage = 1; //当前正在显示的页数目int firstResult = (currentPage - 1) * WebBankAllConstants.objectCounterPerPageDigit; //根据当前的页数计算出的开始的行号(从0 计数)totalBBSInfoPageCounter = (totalBBSInfoCounter +WebBankAllConstants.objectCounterPerPageDigit - 1) /WebBankAllConstants.objectCounterPerPageDigit;int actualHotBBSCounterPerPageDigit=WebBankAllConstants.hotBBSCounterPerPageDigit;if (totalBBSInfoCounter < WebBankAllConstants.hotBBSCounterPerPageDigit){ actualHotBBSCounterPerPageDigit = totalBBSInfoCounter;}try {allBBSInfoVOList =bbsInfoManagerBean.doGetPageBBSInfoByTitleID(bbsTitleID,firstResult,actualHotBBSCounterPerPageDigit);}catch (WebBBSException e){request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}// 下面的代码是获得该分类的完整信息(也包括版主信息)BBSTitleVO oneBBSTitleVO = null;try {oneBBSTitleVO =bbsInfoManagerBean.doGetBBSTitleInfoByTitleID(bbsTitleID);}catch (WebBBSException e) {request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}request.setAttribute("allBBSInfoVOList", allBBSInfoVOList);request.setAttribute("bbsTitleID", bbsTitleID);request.setAttribute("bbsTitleText", bbsTitleText);System.out.println("bbsTitleText="+bbsTitleText);request.setAttribute("oneBBSTitleVO", oneBBSTitleVO);request.setAttribute("totalBBSInfoPageCounter",new Integer(totalBBSInfoPageCounter).toString());request.setAttribute("currentPage", new Integer(currentPage).toString());//发表成功,则跳转到“BBS某个分类”显示页中return mapping.findForward("showAllBBSInClass");}public ActionForward goPreViewOneBBSInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response){BBSInfoActionForm bbsInfoActionForm = (BBSInfoActionForm) form;int bbsTitleID =Integer.parseInt((String)bbsInfoActionForm.get("bbsTitleID"));String userID =(String)bbsInfoActionForm.get("userID");String bbsAuther =(String) bbsInfoActionForm.get("bbsAuther");String mailtoAuthorString=(String)bbsInfoActionForm.get("mailtoAuthor");if(mailtoAuthorString==null||mailtoAuthorString.equals("")) {mailtoAuthorString ="0";}int mailtoAuthor =Integer.parseInt(mailtoAuthorString);String bbsTypeIDString=(String)bbsInfoActionForm.get("bbsTypeID");if(bbsTypeIDString==null||bbsTypeIDString.equals("")){bbsTypeIDString ="0";}int bbsTypeID = Integer.parseInt(bbsTypeIDString);String bbsSubject =(String) bbsInfoActionForm.get("bbsSubject");String bbsAbstractText =(String) bbsInfoActionForm.get("bbsAbstractText"); String bbsIconIDString=(String)bbsInfoActionForm.get("bbsIconID");if(bbsIconIDString==null||bbsIconIDString.equals("")){bbsIconIDString ="0";}int bbsIconID =Integer.parseInt(bbsIconIDString);String bbsMessage =(String) bbsInfoActionForm.get("content");String bbsTitleText =(String) bbsInfoActionForm.get("bbsTitleText"); java.util.Date rightNow=new java.util.Date();String sendInfoTime=rightNow.toLocaleString();String lastUpdateTime=sendInfoTime;int replay=0;int hits=0;BBSInfoVO oneBbsInfoVO = new BBSInfoVO();oneBbsInfoVO.setBbsTitleID(bbsTitleID);oneBbsInfoVO.setAuthor(bbsAuther);oneBbsInfoVO.setMailto(mailtoAuthor);oneBbsInfoVO.setBbsTypeID(bbsTypeID);oneBbsInfoVO.setTitle(bbsSubject);oneBbsInfoVO.setAbstractText(bbsAbstractText);oneBbsInfoVO.setBbsIconID(bbsIconID);oneBbsInfoVO.setContent(bbsMessage);oneBbsInfoVO.setSendInfoTime(sendInfoTime);oneBbsInfoVO.setLastUpdateTime(lastUpdateTime);oneBbsInfoVO.setReplay(replay);oneBbsInfoVO.setHits(hits);oneBbsInfoVO.setUserID(userID);oneBbsInfoVO.setBbsID((int)new Date().getTime());/** 注意:由于在“在线编辑器”中已经将字符进行转换,所以不再需要进行转换oneBbsInfoVO.setContent(TransferSpecialCharToHTMLEntity.FilterCharToHTMLEntity(oneBbsInfoVO.getContent()));oneBbsInfoVO.setAbstractText(TransferSpecialCharToHTMLEntity.FilterCharToHTMLEntity(oneBbsInfoVO.getAbstractText()));*/request.setAttribute("oneBBSInfoVO",oneBbsInfoVO);// ******************下面的代码是根据userID获得该留言者的其它信息**** UserInfoVO oneUserInfoVO=null;// newUserAndBBSManageBean(); //创建用户和BBS信息管理业务类的对象实例try {oneUserInfoVO=userInfoManageBean.doGetOneRegisterUserInfo(oneBbsInfoVO.getUserID());}catch (WebBBSException e) {request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}request.setAttribute("userImage", oneUserInfoVO.getUserImage());request.setAttribute("userID", new Integer(oneUserInfoVO.getId()).toString());return mapping.findForward("showPreViewTopic");}public ActionForward goReplyOrPreView(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {ActionForward targetActionForward=null;BBSInfoActionForm bbsInfoActionForm = (BBSInfoActionForm) form;int preViewState =Integer.parseInt((String)bbsInfoActionForm.get("preViewState"));switch(preViewState) {case 0:targetActionForward=goReplyOneBBSInfo(mapping, form,request, response);break;case 1:targetActionForward=goPreViewReplyBBSInfo(mapping,form,request, response);break;}return targetActionForward;}public ActionForward goReplyOneBBSInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {boolean OkOrNot = false;BBSInfoActionForm bbsInfoActionForm = (BBSInfoActionForm) form;int bbsTitleID =Integer.parseInt((String)bbsInfoActionForm.get("bbsTitleID"));int userID =Integer.parseInt((String)bbsInfoActionForm.get("userID"));String bbsTitleText =(String) bbsInfoActionForm.get("bbsTitleText");int bbsID =Integer.parseInt((String)bbsInfoActionForm.get("bbsID"));String author =(String) bbsInfoActionForm.get("bbsAuther");String replyTitle =(String)bbsInfoActionForm.get("bbsSubject");String abstractText =(String)bbsInfoActionForm.get("bbsAbstractText");String bbsIconIDString=(String)bbsInfoActionForm.get("bbsIconID");if(bbsIconIDString==null||bbsIconIDString.equals("")){bbsIconIDString ="0";}int bbsReplyIconID =Integer.parseInt(bbsIconIDString);String content =(String)bbsInfoActionForm.get("content");java.util.Date rightNow=new java.util.Date();String replytime=rightNow.toLocaleString();BBSReplyInfoVO oneBBSReplyInfoVO=new BBSReplyInfoVO();oneBBSReplyInfoVO.setId(new Integer((int)new Date().getTime()));oneBBSReplyInfoVO.setBbsID(bbsID);oneBBSReplyInfoVO.setAuthor(author);oneBBSReplyInfoVO.setContent(content);oneBBSReplyInfoVO.setReplytime(replytime);oneBBSReplyInfoVO.setAbstractText(abstractText);oneBBSReplyInfoVO.setReplyTitle(replyTitle);oneBBSReplyInfoVO.setBbsReplyIconID(bbsReplyIconID);// newUserAndBBSManageBean(); //创建用户和BBS信息管理业务类的对象实例try{OkOrNot = bbsInfoManagerBean.doSaveBBSReplyInfo(oneBBSReplyInfoVO);}catch(WebBBSException e){request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}if (OkOrNot){//回复成功,则跳转到“显示某个BBS信息”显示页中BBSInfoVO oneBBSInfoVO = null;ArrayList allBBSReplyInfoListByOneBBS = null;// newUserAndBBSManageBean(); //创建用户和BBS信息管理业务类的对象实例try {oneBBSInfoVO = bbsInfoManagerBean.doGetOneBBSInfoByBBSID(bbsID);}catch (WebBBSException e) {request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}//获得该BBS的各个回复的ArrayList对象allBBSReplyInfoListByOneBBS = oneBBSInfoVO.getAllBBSReplyInfoList();request.setAttribute("oneBBSInfoVO", oneBBSInfoVO);request.setAttribute("allBBSReplyInfoListByOneBBS",allBBSReplyInfoListByOneBBS);request.setAttribute("bbsTitleText",bbsTitleText);// **********下面的代码是根据userID获得该留言者的其它信息********UserInfoVO oneUserInfoVO=null;// newUserAndBBSManageBean(); //创建用户和BBS信息管理业务类的对象实例try {oneUserInfoVO=userInfoManageBean.doGetOneRegisterUserInfo(oneBBSInfoVO.getUserID());}catch (WebBBSException e){request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}request.setAttribute("userImage", oneUserInfoVO.getUserImage());return mapping.findForward("showOneBBSInfo");}else {request.setAttribute("errorText", "您的BBS回复信息没有正确地被保存!");return mapping.findForward("showWebAppError");}}public ActionForward goPreViewReplyBBSInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {BBSInfoActionForm bbsInfoActionForm = (BBSInfoActionForm) form;int bbsTitleID =Integer.parseInt((String)bbsInfoActionForm.get("bbsTitleID"));String userID =(String)bbsInfoActionForm.get("userID");String bbsTitleText =(String) bbsInfoActionForm.get("bbsTitleText");int bbsID =Integer.parseInt((String)bbsInfoActionForm.get("bbsID"));String author =(String) bbsInfoActionForm.get("bbsAuther");String replyTitle =(String)bbsInfoActionForm.get("bbsSubject");String abstractText =(String)bbsInfoActionForm.get("bbsAbstractText");String bbsIconIDString=(String)bbsInfoActionForm.get("bbsIconID");if(bbsIconIDString==null||bbsIconIDString.equals("")){bbsIconIDString ="0";}int bbsReplyIconID =Integer.parseInt(bbsIconIDString);String content =(String)bbsInfoActionForm.get("content");try{/**由于bbsTitleText参数是通过get方法传递来的,因此ActionServlet无法进行正确递编码转换,需要手动转换*/bbsTitleText=new String(bbsTitleText.getBytes("ISO-8859-1"),"gb2312");author=new String(author.getBytes("ISO-8859-1"),"gb2312");replyTitle=new String(replyTitle.getBytes("ISO-8859-1"),"gb2312");abstractText=new String(abstractText.getBytes("ISO-8859-1"),"gb2312");content=new String(content.getBytes("ISO-8859-1"),"gb2312");}catch (UnsupportedEncodingException e) {request.setAttribute("errorText", "在BBSManagerAction类中goPreViewReplyBBSInfo方法出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}java.util.Date rightNow=new java.util.Date();String replytime=rightNow.toLocaleString();BBSReplyInfoVO oneBBSReplyInfoVO=new BBSReplyInfoVO();oneBBSReplyInfoVO.setId(new Integer((int)new Date().getTime()));oneBBSReplyInfoVO.setBbsID(bbsID);oneBBSReplyInfoVO.setAuthor(author);oneBBSReplyInfoVO.setContent(content);oneBBSReplyInfoVO.setReplytime(replytime);oneBBSReplyInfoVO.setAbstractText(abstractText);oneBBSReplyInfoVO.setReplyTitle(replyTitle);oneBBSReplyInfoVO.setBbsReplyIconID(bbsReplyIconID);request.setAttribute("oneBBSReplyInfoVO",oneBBSReplyInfoVO);// ****************下面的代码是根据userID获得该回复者的其它信息********** UserInfoVO oneUserInfoVO=null;// newUserAndBBSManageBean(); //创建用户和BBS信息管理业务类的对象实例try{oneUserInfoVO=userInfoManageBean.doGetOneRegisterUserInfo(userID);}catch (WebBBSException e) {request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}request.setAttribute("userImage", oneUserInfoVO.getUserImage());request.setAttribute("userID", new Integer(userID).toString());return mapping.findForward("showPreViewReplyTopic");}}3、添加与该Action类相关的Forward。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——实现项目中的数据库连接组件及对应的单元测试用例(第1/4部分)1.1.1构造基于JDBC技术实现的数据访问层中的数据库连接组件1、添加一个属性配置文件 classNameConfig.properties(1)为什么要采用配置文件?作用是什么?----灵活地满足变化!如何对配置文件中的项目进行读写?(2)在项目中添加属性配置文件 classNameConfig.properties目前的内容如下JDBC_DBDriver= com.mysql.jdbc.DriverJDBC_URL = jdbc:mysql://localhost:3306/bbsdatabasedbUserName=rootdbUserPassWord=rootdbcp_maxActive=10dbcp_maxActive=10connectDBBean.className=com.px1987.webbbs.dao.ConnectDBBean注意:也可以采用XML形式的配置文件。
3、添加一个获得配置属性的类ClassNameConfig(1)类名称为ClassNameConfig,包名称为com.px1987.webbbs.config(2)代码如下package com.px1987.webbbs.config;import java.util.Properties;import java.io.*;public class ClassNameConfig {public ClassNameConfig() {}private static Properties props=null;static {props= new Properties();try{InputStream input =Thread.currentThread().getContextClassLoader().getResource("classNameConfig.properties").openStream();props.load(input);}catch(Exception e){e.printStackTrace();}}public static String getProperty(String propName){return props.getProperty(propName);}public static void setProperty(String propName,String propValue){ props.setProperty(propName, propValue);}}其中的getResourceAsStream方法是查找具有给定名称的资源,返回 InputStream对象;而getResource方法是查找带有给定名称的资源路径。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——构建系统数据库连接组件及对应的单元测试用例(第2/4部分)1.1.1对前面的ConnectDBBean组件进行单元测试(JUnit Test)1、单元测试(1)单元测试有关的概念(2)为什么要应用它(3)如何应用它2、添加一个测试项目----测试项目和被测试项目应该分离!(1)添加一个Java测试项目(2)项目的名称为TestWebBBS(3)最后为下面的状态3、添加对应用项目的引用4、添加测试用例(TestCase)类(测试类)(1)添加测试用例:什么是测试用例?编程要点?(2)添加Junit的系统包(3)设置测试用例类测试用例类名称为TestConnectDBBean类,包名称为com.px1987.webbbs.daotest,被测试的目标程序类选择为com.px1987.webbbs.dao.ConnectDBBean。
(4)选择被测试的方法4、编程该测试用例类(1)类的代码package com.px1987.webbbs.daotest;import junit.framework.TestCase;import com.px1987.webbbs.config.ClassNameConfig;import com.px1987.webbbs.dao.*;import java.sql.*;import com.px1987.webbbs.exception.*;import com.px1987.webbbs.util.*;public class TestConnectDBBean extends TestCase {ConnectDBInterface connectDBBean=null;String connectDBBeanClassName=null;protected void setUp() throws Exception {super.setUp();connectDBBeanClassName=ClassNameConfig.getProperty("connectDBBean.className");connectDBBean=ConnectDBFactory.newConnectDBBean(connectDBBeanClassName);}protected void tearDown() throws Exception {connectDBBean=null;super.tearDown();}public void testCloseDBCon() throws WebBBSException {connectDBBean.closeDBCon();Connection returnDBCon=connectDBBean.getConnection();this.assertNull(returnDBCon); //断言}public void testGetConnection() throws WebBBSException {Connection returnDBCon=connectDBBean.getConnection();this.assertNotNull(returnDBCon); //断言}}注意:也可以采用的是JUnit4.0系统库,现在改变为“Java标注”的方式实现---其中的@Before、@After和@Test等符号。
目录1.1BBS论坛系统项目完整实现实例——构建项目中的表示层(第2部分) (2)1.1.1在项目中应用验证码防止暴力破解 (2)1.1.2设置Web应用中的缺省的首页 (11)1.1.3设置浏览器中的Http返回码的错误显示页面 (14)1.1BBS论坛系统项目完整实现实例——构建项目中的表示层(第2部分)1.1.1在项目中应用验证码防止暴力破解1、添加一个实现验证码功能的JavaBean组件类(1)类名称为VerifyCodeBean,包名称为com.px1987.webbbs.util(2)编程该JavaBeanpackage com.px1987.webbbs.util;import java.awt.*;import java.awt.image.*;import java.util.*;import javax.imageio.*;public class VerifyCodeBeanRandom random = null;int width, height;String randVerifyCode; //存储随机产生的认证码(4位数字)public VerifyCodeBean(){width=60;height=20;randVerifyCode="";random = new Random(); //生成随机类}public void setWidth(int newWidth){width=newWidth;}public int getWidth(){return width;}public void setHeight(int newHeight){height=newHeight;}public int getHeight(){return height;}Color getRandColor(int foregroundColor,int backgroundColor){//给定范围获得随机颜色if(foregroundColor>255){foregroundColor=255;}if(backgroundColor>255){backgroundColor=255;}int r=foregroundColor+random.nextInt(backgroundColor-foregroundColor);int g=foregroundColor+random.nextInt(backgroundColor-foregroundColor);int b=foregroundColor+random.nextInt(backgroundColor-foregroundColor);return new Color(r,g,b);}public BufferedImage getCreateVerifyImage(){//创建一个BufferedImage绘制你的动态图像BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//创建完一个BufferedImage后,你需要得到图形环境进行绘制,一个Graphics或者Graphics2D 对象Graphics g = image.getGraphics(); // 获取图形上下文Graphics2D g2d=(Graphics2D)g;/*生成有4个随机数字和杂乱背景的图片,数字和背景颜色会改变,服务器端刷新(用history.go(-1)也会变)*/g2d.setColor(getRandColor(180,250));g2d.fillRect(0, 0, width, height);g2d.setFont(new Font("Times New Roman",Font.PLAIN,18)); //设定字体g2d.setColor(Color.BLUE);g2d.drawRect(0,0,width-1,height-1); //画边框/*随机产生155条干扰线,使图象中的认证码不易被其它程序探测到*/g2d.setColor(getRandColor(160,200));for (int i=0;i<155;i++){int x = random.nextInt(width);int y = random.nextInt(height);int xl = random.nextInt(12);int yl = random.nextInt(12);g2d.drawLine(x,y,x+xl,y+yl);}for (int i=0;i<4;i++){String rand=String.valueOf(random.nextInt(10));randVerifyCode+=rand; // 取随机产生的认证码(4位数字) /*将认证码显示到图象中*/g2d.setColor(newColor(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));g2d.drawString(rand,13*i+6,16);}/*上面为绘制图像内容,对图形环境绘制就会画到BufferedImage。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——在项目中应用J2EE Struts框架中的安全性组件技术1.1.1面向不同的角色提供不同功能的菜单系统应用Logic标签区分用户登录前后显示的不同内容,来区别游客与登录用户的不同权限。
当然管理员登陆后的显示页面,跟普通用户登录后的显示页面也不相同。
1、用户没有登陆系统时,只提供基本的菜单2、用户登陆系统后,并识别是否为前台用户3、用户登陆系统后,并识别是否为后台管理员用户4、下面是利用Logic标签来进行控制实现的部分代码<logic:empty name="oneUserInfoVO"><A href="<%=webContext%>/goUserRgister.do" title="点击我可以在本系统注册您的信息">注册</A>|<A href="<%=webContext%>/goUserLogin.do" title="点击我可以进行系统登录">登录</A> |</logic:empty><logic:notEmpty name="oneUserInfoVO"><A href="<%=webContext%>/pageForwordAction.do?action=showUserLogout" title="点击我可以在线注销">注销</A> |<A href="<%=webContext%>/pageForwordAction.do?action=showUpdateUserInfo" title="点击我可以修改您的注册信息">修改</A>|<A href="<%=webContext%>/pageForwordAction.do?action=doShowOnLineUserInfo" title="点击我可以查看您的在线信息">信息</A> |<logic:equal name="oneUserInfoVO" property="type_User_Admin" value="2" ><a href="<%=webContext%>/pageForwordAction.do?action=doSystemManage">后台管理</a> |</logic:equal></logic:notEmpty>1.1.2对项目中的用户权限的访问控制org.apache.struts.action.RequestProcessor类是做ActionServlet的助手类,ActionServlet的主要功能都是用 RequestProcessor来完成的。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——实现项目中的Struts2框架与Spring框架进行整合(第3/3部分)1.1.1在项目中应用Struts2框架的拦截器组件技术1、添加一个拦截器组件类(1)类名称为CheckAdminUserLogin Interceptor,包名称为com.px1987.webbbs.interceptor,并且从com.opensymphony.xwork2.interceptor.AbstractInterceptor基类进行继承。
(2)编程该拦截器组件类其中返回的“showNoLoginError”是在struts.xml中定义的全局名称。
package com.px1987.webbbs.interceptor;import java.util.Map;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;import erInfoVO;import com.px1987.webbbs.constant.WebBankAllConstants;public class CheckAdminUserLoginInterceptor extends AbstractInterceptor { public CheckAdminUserLoginInterceptor() {}@Overridepublic String intercept(ActionInvocation actionInvocation) throws Exception { Map sessionMap= actionInvocation.getInvocationContext().getSession();UserInfoVO oneUserInfoVO = (UserInfoVO) sessionMap.get("oneUserInfoVO" ); if (oneUserInfoVO ==null) { //识别用户是否正常进行登陆return "showNoLoginError";}Integer type_User_Admin=oneUserInfoVO.getType_User_Admin();if(type_User_Admin.intValue()!=WebBankAllConstants.Type_User_Admin_Admin){ //进一步识别用户是否以后台管理员的身份进行系统登陆return "showNoLoginError";}return actionInvocation.invoke();}}2、在struts.xml中配置定义出该CheckAdminUserLoginInterceptor组件本项目通过定义一个名称为sshwebbbsStack的拦截器栈来包含该CheckAdminUserLoginInterceptor拦截器组件。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——将项目中的Struts框架与Spring框架进行整合1.1.1将项目中的Struts框架与Spring框架进行整合1、Struts框架与Spring框架进行整合的主要实现方法(1)方法一采用普通Spring Web技术进行整合-----org.springframework.web.context.ContextLoaderListener该方法主要的缺点:无法监控控制层中的有关的组件。
(2)方法二采用Struts Plug技术。
下面介绍采用Struts Plug技术实现Struts框架与Spring框架进行整合的实现过程。
2、添加DBCP的驱动程序由于在项目中需要应用Apache的DBCP数据库连接池,因此需要添加对应的DBCP的系统包文件。
3、在struts-config.xml中添加Struts PlugIn组件(1)保证引用了spring-webmvc-struts.jar(2)具体的配置如下<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation"value="/WEB-INF/WebBBSContext.xml"/> </plug-in>4、新建WebBBSContext.xml配置文件(1)添加一个WebBBSContext.xml文件(2)目前状态下的内容如下<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN""/dtd/spring-beans-2.0.dtd"><beans><bean name="/bbsSearchInfoAction"class="com.px1987.webbbs.action.BBSSearchInfoAction"> <property name="bbsInfoManagerBean"><ref bean="bbsInfoManagerBean"></ref></property></bean>//其它的对象定义</beans>5、修改项目中的各个 Action程序类的配置定义(1)应用DelegatingActionProxy代理组件将每个Action的定义由原来的类名称改变为:type="org.springframework.web.struts.DelegatingActionProxy"(2)分别修改各个配置文件中的Action类的定义,修改后的具体的结果如下6、修改各个控制组件Action类的功能实现代码(1)将其中的各个new直接创建目标对象的语句改变为根据IoC来获得。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——实现项目中的数据库连接组件及对应的单元测试用例(第2/4部分)1.1.1应用Struts DataSource为项目中的数据库提供数据库连接池功能1、在Eclipse开发工具中配置出数据库连接池(DataSource)Key:webDataSourceType:mons.dbcp.BasicDataSourceDriver Class:net.sourceforge.jtds.jdbc.DriverURL:jdbc:jtds:sqlserver://127.0.0.1:1433/BBSDataBaseUser:saPassWord:1234Min Count:10Max Count:10将产生出下面的DataSource的配置项目<data-source key="webDataSource"type="mons.dbcp.BasicDataSource"><set-property property="password" value="1234" /><set-property property="minCount" value="10" /> <!- - 没有该属性项目- -> <set-property property="maxCount" value="10" /><set-property property="user" value="sa" /><set-property property="driverClass"value="net.sourceforge.jtds.jdbc.Driver" /><set-property property="url"value="jdbc:jtds:sqlserver://127.0.0.1:1433/BBSDataBase" /> <set-property property="readOnly" value="false" /><set-property property="autoCommit" value="true" /></data-source>正确的项目如下:<data-source key="webDataSource"type="mons.dbcp.BasicDataSource"><set-property property="password" value="1234" /><set-property property="maxActive" value="10" /><set-property property="username" value="sa" /><set-property property="driverClassName"value="net.sourceforge.jtds.jdbc.Driver" /><set-property property="url"value="jdbc:jtds:sqlserver://127.0.0.1:1433/BBSDataBase" /><set-property property="defaultReadOnly" value="false" /><set-property property="defaultAutoCommit" value="true" /></data-source>2、在Action类中获得该DataSource数据库连接对象1.1.2应用DBCP组件为系统提供数据库连接池功能(优化数据库连接,并体验面向接口编程所带来的优点)1、JDBC直接连接的主要问题是什么?什么是数据库连接池(Pool)的连接?----缓存已经存在的数据库连接对象,为什么要应用?数据库连接池(Connection Pool)池是一个很普遍的概念,和缓冲存储有机制相近的地方,都是缩减了访问的环节,但它更注重于资源的共享。
在项目中构建出Struts2框架的应用开发环境1、在项目中添加Struts2.3的系统库文件(1)主要的文件如下1)commons-fileupload-1.2.2.jar2)commons-io-1.3.2.jar3)commons-lang-2.5.jar4)commons-logging-1.1.1.jar5)freemarker-2.3.18.jar6)javassist-3.11.0.GA.jar(Javassist是一个开源的分析、编辑和创建Java字节码的类库。
通过使用Javassist对字节码操作为Struts2实现动态AOP框架)7)ognl-3.0.4.jar8)struts2-core-2.3.1.2.jar9)xwork-core-2.3.1.2.jarOGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
它使用相同的表达式去存取对象的属性。
(2)结果如下2、在项目的web.xml中配置出前端过滤器<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>3、在项目中添加struts.xml文件<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "/dtds/struts-2.1.dtd"><struts><include file="struts-default.xml"/>下面的package配置标签是自己的配置包,项目组统一为sshchims --><package name ="loginPackage" extends ="struts-default" ></package><!--下面的配置标签是解决表单中的中文乱码--><constant name="struts.i18n.encoding" value="GBK">constant</constant></struts>4、再测试目前的配置是否有问题从而检查Struts2的开发环境是否配置正确再执行前面的http://127.0.0.1:8080/sshchims/userLogin.jsp页面,仍然能够看到下面的内容。
1.1BBS论坛系统项目完整实现实例(持久层中的BBSInfo相关功能类——第2部分)1.1.1构建项目中的BBS信息相关的DAO组件接口的各个实现类1、构建BBSInfoManageDAOInterface接口的实现类(1)类名称为BBSInfoManageDAOJDBCImple,包名称为com.px1987.webbbs.dao(2)编程该实现类package com.px1987.webbbs.dao;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.sql.DataSource;import com.px1987.webbbs.exception.WebBBSException;public class BBSInfoManageDAOJDBCImple implements BBSInfoManageDAOInterface{private DataSource dataSource=null;public void setDataSource(DataSource dataSource){this.dataSource = dataSource;}private java.sql.Connection con=null;ConnectDBInterface connectDBBean=null;public BBSInfoManageDAOJDBCImple() throws WebBBSException{// connectDBBean=new ConnectDBBean();// con=connectDBBean.getConnection();// con=dataSource.getConnection();}public boolean DeleteOneBBSInfo(int bbsID) throws WebBBSException { return false;}public boolean DeleteOneBBSReplyInfo(int replyID) throws WebBBSException { return false;}public boolean DeleteOneBBSTitleInfo(int bbsTitleID) throws WebBBSException { return false;}public boolean DeleteOneRoleInfo(int roleID) throws WebBBSException {return false;}public boolean DeleteOneUserInfo(int userID) throws WebBBSException { return false;}public boolean InsertBBSInfo(BBSInfoPO oneBBSInfoPO) throws WebBBSException {String insertSql="insert into BBS values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)";try{con=dataSource.getConnection();java.sql.PreparedStatement pstmt = con.prepareStatement(insertSql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);pstmt.setInt(1,oneBBSInfoPO.getId());pstmt.setString(2,oneBBSInfoPO.getAuthor());pstmt.setString(3,oneBBSInfoPO.getTitle());pstmt.setInt(4,oneBBSInfoPO.getReplay());pstmt.setInt(5,oneBBSInfoPO.getHits());pstmt.setString(6,oneBBSInfoPO.getSendInfoTime());pstmt.setString(7,oneBBSInfoPO.getContent());pstmt.setShort(8,(short)oneBBSInfoPO.getMailto());pstmt.setString(9,oneBBSInfoPO.getAbstractText());pstmt.setString(10,oneBBSInfoPO.getLastUpdateTime());pstmt.setInt(11,oneBBSInfoPO.getBbsIconID());pstmt.setInt(12,oneBBSInfoPO.getBbsTypeID());pstmt.setInt(13,oneBBSInfoPO.getBbsTitleID());pstmt.setInt(14,oneBBSInfoPO.getUserID());pstmt.executeUpdate();}catch(SQLException e){throw new WebBBSException("在插入数据库表时出现错误!,异常的详细内容为:"+e.getMessage());}finally{try{con.close();}catch(SQLException e){throw new WebBBSException("不能正确地关闭数据库连接!,异常的详细内容为:"+e.getMessage());}}return true;}public ArrayList getSomeBbsTitleInfos(int titleCounter) throws WebBBSException {ResultSet rs=null;BBSTitlePO oneBBSTitlePO=null;String select_SqlStatement=null;ArrayList allBBSTitlePOArrayList=null;allBBSTitlePOArrayList=new ArrayList();/** “set rowcount n”SQL Server中有一个Set Rowcount的的设置,它的意思是使命令的处理在响应指定的行数之后停止处理命令,利用这个特点,我们可以借用它来在一个千万行级数据表中实现高性能分页查询。
基于J2EE Struts框架的课程设计实训项目《BBS论坛系统》系统详细设计说明书(第5/5部分)文档信息目录引言................................................................................................................... 错误!未定义书签。
1.1编写目的............................................................................................. 错误!未定义书签。
1.2背景..................................................................................................... 错误!未定义书签。
1.3定义..................................................................................................... 错误!未定义书签。
1.4参考资料............................................................................................. 错误!未定义书签。
系统结构设计................................................................................................... 错误!未定义书签。
2.1 MVC中各层组件设计....................................................................... 错误!未定义书签。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——实现项目中的Struts2框架与Spring框架进行整合(第2/3部分)1.1.1构建后台管理控制层中用户信息显示中的AdminUserManageActionForm实体组件1、AdminUserManageActionForm类(包名称为com.px1987.webbbs.struts2form)(1)类名称为AdminUserManageActionForm类、包名称为com.px1987.webbbs.struts2form(2)在该类中添加各个成员属性(由于Struts2具有自动地进行数据类型的转换功能,因此可以直接将数据定义为某个目标类型)String submitButton=null;String userInfoCheckBox[]=null;String someOnePage=null;String userType=null;String registerYear=null;String userSex=null;String userComeFrom=null;String currentPageNumber=null;并为它们提供get/set方法最后产生出下面的结果package com.px1987.webbbs.struts2form; public class AdminUserManageActionForm { String submitButton=null;String userInfoCheckBox[]=null;String someOnePage=null;String userType=null;String registerYear=null;String userSex=null;String userComeFrom=null;String currentPageNumber=null;String targetPage=null;public AdminUserManageActionForm() {}public String getCurrentPageNumber() {return currentPageNumber;}public void setCurrentPageNumber(String currentPageNumber) { this.currentPageNumber = currentPageNumber;}public String getRegisterYear() {return registerYear;}public void setRegisterYear(String registerYear) { this.registerYear = registerYear;}public String getSomeOnePage() {return someOnePage;}public void setSomeOnePage(String someOnePage) {this.someOnePage = someOnePage;}public String getSubmitButton() {return submitButton;}public void setSubmitButton(String submitButton) { this.submitButton = submitButton;}public String getUserComeFrom() {return userComeFrom;}public void setUserComeFrom(String userComeFrom) {erComeFrom = userComeFrom;}public String[] getUserInfoCheckBox() {return userInfoCheckBox;}public void setUserInfoCheckBox(String[] userInfoCheckBox) { erInfoCheckBox = userInfoCheckBox;}public String getUserSex() {return userSex;}public void setUserSex(String userSex) {erSex = userSex;}public String getUserType() {return userType;}public void setUserType(String userType) {erType = userType;}public String getTargetPage() {return targetPage;}public void setTargetPage(String targetPage) {this.targetPage = targetPage;}}1.1.2构建后台管理控制层中用户信息管理的Action组件1、添加AdminUserManageAction组件(1)包名称为com.px1987.webbbs.struts2action并继承于com.opensymphony.xwork2.ActionSupport类、并且实现com.opensymphony.xwork2.ModelDriven接口。
(2)编程该AdminUserManageAction组件中的各个控制方法package com.px1987.webbbs.struts2action;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;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.webbbs.constant.WebBankAllConstants;import com.px1987.webbbs.exception.WebBBSException;import com.px1987.webbbs.model.PageStateVO_Prototype;import erInfoManageInterface;import com.px1987.webbbs.struts2form.AdminUserManageActionForm;public class AdminUserManageAction extends ActionSupport implements ModelDriven<AdminUserManageActionForm> {private HttpServletRequest request = null;private HttpServletResponse response=null;private HttpSession session =null;UserInfoManageInterface userInfoManageBean=null;public void setUserInfoManageBean(UserInfoManageInterface userInfoManageBean) { erInfoManageBean = userInfoManageBean;}public void initServletContextObject() {request = ServletActionContext.getRequest();response=ServletActionContext.getResponse();session = request.getSession();}private AdminUserManageActionForm oneAdminManageActionForm=new AdminUserManageActionForm();public AdminUserManageActionForm getModel() {return oneAdminManageActionForm;}public AdminUserManageAction() {}public String doShowAllUserInfo() {initServletContextObject();PageStateVO_Prototype onePageStateVO_Prototype=null;try {onePageStateVO_Prototype=new PageStateVO_Prototype();onePageStateVO_Prototype.setThisPageNumber(1);onePageStateVO_Prototype.setPageSize(WebBankAllConstants.systemManage_pageSize);onePageUserInfoVOArrayList=userInfoManageBean.doGetOnePageAllUserInfo(onePageStateVO_Prototype);}catch (WebBBSException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}//未找到目标数据时,则显示错误if(onePageUserInfoVOArrayList.size()==0){request.setAttribute("errorText","没有找到满足条件的用户信息");return "showWebAppError";}request.setAttribute("onePageUserInfoVOArrayList",onePageUserInfoVOArrayList);request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype);request.setAttribute("currentPageNumber",new Integer(onePageStateVO_Prototype.getThisPageNumber()).toString());return "forwardShowAllUserInfo";}public String doShowAllUserInfoTargetPage() {initServletContextObject();String targetPageNumber=request.getParameter("targetPage");PageStateVO_Prototype onePageStateVO_Prototype=null;try {onePageStateVO_Prototype=new PageStateVO_Prototype();onePageStateVO_Prototype.setThisPageNumber(Integer.parseInt(targetPageNumber));onePageStateVO_Prototype.setPageSize(WebBankAllConstants.systemManage_pageSize);onePageUserInfoVOArrayList=userInfoManageBean.doGetOnePageAllUserInfo(onePageStateVO_Prototype);}catch (WebBBSException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}//未找到目标数据时,则显示错误if(onePageUserInfoVOArrayList.size()==0){request.setAttribute("errorText","没有找到满足条件的用户信息");return "showWebAppError";}request.setAttribute("onePageUserInfoVOArrayList",onePageUserInfoVOArrayList);request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype);request.setAttribute("currentPageNumber",new Integer(onePageStateVO_Prototype.getThisPageNumber()).toString());return "forwardShowAllUserInfo";}public String doQueryRegisterUserInfo(){PageStateVO_Prototype onePageStateVO_Prototype=null; initServletContextObject();String registerTime=getModel().getRegisterYear();Map registerUserInfos=new HashMap();registerUserInfos.put("registerTime",registerTime);try {onePageStateVO_Prototype=new PageStateVO_Prototype();onePageStateVO_Prototype.setThisPageNumber(1);onePageStateVO_Prototype.setPageSize(WebBankAllConstants.systemManage_pageSize);onePageUserInfoVOArrayList=userInfoManageBean.doGetOnePageRegisterUserInfo(onePageStateVO_Prototype, erType_PlainRegisterUser,registerUserInfos); }catch (WebBBSException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}//未找到目标数据时,则显示错误if(onePageUserInfoVOArrayList.size()==0){request.setAttribute("errorText","没有找到满足条件的用户信息");return "showWebAppError";}request.setAttribute("onePageUserInfoVOArrayList",onePageUserInfoVOArrayList); request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype); request.setAttribute("currentPageNumber",new Integer(onePageStateVO_Prototype.getThisPageNumber()).toString());request.setAttribute("registerYear",registerTime);return "forwardShowQueryRegisterUserInfoResult";}public String doQueryRegisterUserInfoTargetPage() {ArrayList onePageUserInfoVOArrayList=null;PageStateVO_Prototype onePageStateVO_Prototype=null;initServletContextObject();String targetPageNumber=request.getParameter("targetPage");String registerTime=request.getParameter("registerYear");Map registerUserInfos=new HashMap();registerUserInfos.put("registerTime",registerTime);try {onePageStateVO_Prototype=new PageStateVO_Prototype();onePageStateVO_Prototype.setThisPageNumber(Integer.parseInt(targetPageNumber));onePageStateVO_Prototype.setPageSize(WebBankAllConstants.systemManage_pageSize);onePageUserInfoVOArrayList=userInfoManageBean.doGetOnePageRegisterUserInfo(onePageStateVO_Prototype, erType_PlainRegisterUser,registerUserInfos);}catch (WebBBSException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}//未找到目标数据时,则显示错误if(onePageUserInfoVOArrayList.size()==0){request.setAttribute("errorText","没有找到满足条件的用户信息");return "showWebAppError";request.setAttribute("onePageUserInfoVOArrayList",onePageUserInfoVOArrayList);request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype);request.setAttribute("currentPageNumber",new Integer(onePageStateVO_Prototype.getThisPageNumber()).toString());request.setAttribute("registerYear",registerTime);return "forwardShowQueryRegisterUserInfoResult";}public String doShowDeleteRegisterUserInfo() {ArrayList onePageUserInfoVOArrayList=null;PageStateVO_Prototype onePageStateVO_Prototype=null;initServletContextObject();String registerTime=getModel().getRegisterYear();Map registerUserInfos=new HashMap();registerUserInfos.put("registerTime",registerTime);try {onePageStateVO_Prototype=new PageStateVO_Prototype();onePageStateVO_Prototype.setThisPageNumber(1);onePageStateVO_Prototype.setPageSize(WebBankAllConstants.systemManage_pageSize);onePageUserInfoVOArrayList=userInfoManageBean.doGetOnePageRegisterUserInfo(onePageStateVO_Prototype, erType_PlainRegisterUser,registerUserInfos);}catch (WebBBSException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";//未找到目标数据时,则显示错误if(onePageUserInfoVOArrayList.size()==0){request.setAttribute("errorText","没有找到满足条件的用户信息");return "showWebAppError";}request.setAttribute("onePageUserInfoVOArrayList",onePageUserInfoVOArrayList);request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype);request.setAttribute("currentPageNumber",new Integer(onePageStateVO_Prototype.getThisPageNumber()).toString());request.setAttribute("registerYear",registerTime);return "forwardShowDeleteRegisterUserInfoResult";}public String doDeleteRegisterUserInfoTargetPage() {ArrayList onePageUserInfoVOArrayList=null;PageStateVO_Prototype onePageStateVO_Prototype=null;initServletContextObject();String targetPageNumber=request.getParameter("targetPage");String registerTime=request.getParameter("registerYear");Map registerUserInfos=new HashMap();registerUserInfos.put("registerTime",registerTime);try {onePageStateVO_Prototype=new PageStateVO_Prototype();onePageStateVO_Prototype.setThisPageNumber(Integer.parseInt(targetPageNumber));onePageStateVO_Prototype.setPageSize(WebBankAllConstants.systemManage_pageSize);onePageUserInfoVOArrayList=userInfoManageBean.doGetOnePageRegisterUserInfo(onePageStateVO_Prototype, erType_PlainRegisterUser,registerUserInfos);}catch (WebBBSException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}//未找到目标数据时,则显示错误if(onePageUserInfoVOArrayList.size()==0){request.setAttribute("errorText","没有找到满足条件的用户信息");return "showWebAppError";}request.setAttribute("onePageUserInfoVOArrayList",onePageUserInfoVOArrayList);request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype);request.setAttribute("currentPageNumber",new Integer(onePageStateVO_Prototype.getThisPageNumber()).toString());request.setAttribute("registerYear",registerTime);return "forwardShowDeleteRegisterUserInfoResult";}public String doQueryVIPUserInfo() {ArrayList onePageUserInfoVOArrayList=null;PageStateVO_Prototype onePageStateVO_Prototype=null;initServletContextObject();String registerTime=getModel().getRegisterYear();Map registerUserInfos=new HashMap();registerUserInfos.put("registerTime",registerTime);try {onePageStateVO_Prototype=new PageStateVO_Prototype();onePageStateVO_Prototype.setThisPageNumber(1);onePageStateVO_Prototype.setPageSize(WebBankAllConstants.systemManage_pageSize);onePageUserInfoVOArrayList=userInfoManageBean.doGetOnePageRegisterUserInfo(onePageStateVO_Prototype, erType_VIPRegisterUser,registerUserInfos);}catch (WebBBSException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}//未找到目标数据时,则显示错误if(onePageUserInfoVOArrayList.size()==0){request.setAttribute("errorText","没有找到满足条件的用户信息");return "showWebAppError";}request.setAttribute("onePageUserInfoVOArrayList",onePageUserInfoVOArrayList);request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype);request.setAttribute("currentPageNumber",new Integer(onePageStateVO_Prototype.getThisPageNumber()).toString());request.setAttribute("registerYear",registerTime);return "forwardShowQueryVIPUserInfoResult";}public String doQueryVIPUserInfoTargetPage() {ArrayList onePageUserInfoVOArrayList=null;PageStateVO_Prototype onePageStateVO_Prototype=null;initServletContextObject();String targetPageNumber=request.getParameter("targetPage");String registerTime=request.getParameter("registerYear");Map registerUserInfos=new HashMap();registerUserInfos.put("registerTime",registerTime);try {onePageStateVO_Prototype=new PageStateVO_Prototype();onePageStateVO_Prototype.setThisPageNumber(Integer.parseInt(targetPageNumber));onePageStateVO_Prototype.setPageSize(WebBankAllConstants.systemManage_pageSize);onePageUserInfoVOArrayList=userInfoManageBean.doGetOnePageRegisterUserInfo(onePageStateVO_Prototype, erType_VIPRegisterUser,registerUserInfos); }catch (WebBBSException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}//未找到目标数据时,则显示错误if(onePageUserInfoVOArrayList.size()==0){request.setAttribute("errorText","没有找到满足条件的用户信息");return "showWebAppError";}request.setAttribute("onePageUserInfoVOArrayList",onePageUserInfoVOArrayList); request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype);request.setAttribute("currentPageNumber",new Integer(onePageStateVO_Prototype.getThisPageNumber()).toString());request.setAttribute("registerYear",registerTime);return "forwardShowQueryVIPUserInfoResult";}public String doShowDeleteVIPUserInfo() {ArrayList onePageUserInfoVOArrayList=null;PageStateVO_Prototype onePageStateVO_Prototype=null;initServletContextObject();String registerTime=getModel().getRegisterYear();Map registerUserInfos=new HashMap();registerUserInfos.put("registerTime",registerTime);try {onePageStateVO_Prototype=new PageStateVO_Prototype();onePageStateVO_Prototype.setThisPageNumber(1);onePageStateVO_Prototype.setPageSize(WebBankAllConstants.systemManage_pageSize);onePageUserInfoVOArrayList=userInfoManageBean.doGetOnePageRegisterUserInfo(onePageStateVO_Prototype, erType_VIPRegisterUser,registerUserInfos);}catch (WebBBSException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}//未找到目标数据时,则显示错误if(onePageUserInfoVOArrayList.size()==0){request.setAttribute("errorText","没有找到满足条件的用户信息");return "showWebAppError";}request.setAttribute("onePageUserInfoVOArrayList",onePageUserInfoVOArrayList);request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype);request.setAttribute("currentPageNumber",new Integer(onePageStateVO_Prototype.getThisPageNumber()).toString());request.setAttribute("registerYear",registerTime);return "forwardShowDeleteVIPUserInfoResult";}public String doDeleteVIPUserInfoTargetPage() {ArrayList onePageUserInfoVOArrayList=null;PageStateVO_Prototype onePageStateVO_Prototype=null;initServletContextObject();String targetPageNumber=request.getParameter("targetPage");String registerTime=request.getParameter("registerYear");Map registerUserInfos=new HashMap();registerUserInfos.put("registerTime",registerTime);try {onePageStateVO_Prototype=new PageStateVO_Prototype();onePageStateVO_Prototype.setThisPageNumber(Integer.parseInt(targetPageNumber));onePageStateVO_Prototype.setPageSize(WebBankAllConstants.systemManage_pageSize);onePageUserInfoVOArrayList=userInfoManageBean.doGetOnePageRegisterUserInfo(onePageStateVO_Prototype, erType_VIPRegisterUser,registerUserInfos);}catch (WebBBSException e) {request.setAttribute("errorText", e.getMessage());return "showWebAppError";}//未找到目标数据时,则显示错误if(onePageUserInfoVOArrayList.size()==0){request.setAttribute("errorText","没有找到满足条件的用户信息");return "showWebAppError";}request.setAttribute("onePageUserInfoVOArrayList",onePageUserInfoVOArrayList);request.setAttribute("onePageStateVO_Prototype",onePageStateVO_Prototype);request.setAttribute("currentPageNumber",new Integer(onePageStateVO_Prototype.getThisPageNumber()).toString());request.setAttribute("registerYear",registerTime);return "forwardShowDeleteVIPUserInfoResult";}}2、在struts-adminUserManageAction.xml中配置该Action组件类(1)在项目中新建该struts-adminUserManageAction.xml文件(2)在struts.xml中引用并包含该文件(3)在struts-adminUserManageAction.xml中配置该Action组件类注意:在<result>标签中不能采用这样形式的目标/adminForwordAction!forwardShowUserInfo.action。