J2EE 课程设计实训项目——《蓝梦网上商城》——应用Spring JavaMail邮件抽象实现项目中的邮件自动发送功能
《J2EE系统架构和程序设计》课程设计实训项目——蓝梦网上商店系统概要设计说明书
《J2EE系统架构和程序设计》课程设计实训项目——蓝梦网上商店系统概要设计说明书1.1.1编写目的将软件系统需求转换为未来系统的设计,逐步开发强壮的系统构架,并使设计适合于实施环境,为提高性能而进行设计和为程序开发步骤配置提供指导。
因此,本设计说明书作为《蓝梦网上商店系统》项目开发的依据和规范,并作为开发任务及目标依据和规范系统开发操作,《蓝梦网上商店系统》网站的开发内容及达到的各项功能及性能指标以此设计说明书为准。
本设计文档描述了整个系统的架构以及业务逻辑实现时应遵循的步骤,文档的预期读者主要包括:项目管理人员、系统设计人员与程序编写人员、测试人员、用户手册编写人员、客户、系统维护人员和项目评审人员等。
1.1.2系统总体设计1、系统主要的特色(1)系统基于J2EE架构设计将界面表示、业务务逻辑和数据层相对分离,使系统结构更加合理;采用成熟的J2EE 架构,使系统具有较好的维护性。
(2)采用中间件的负载平衡、动态伸缩等功能为关键业务建立了最佳的运行环境,为应用提供了充分的扩展余地。
(3)以Browser(浏览器)为核心的客户端程序实现了真正意义上的“零维护”,从而使业务软件的更新、发布和维护更为容易。
(4)系统的外部接口采用XML数据交换格式降低系统间偶合度,确保数据交换与具体应用平台无关。
(5)系统采用个性化的权限管理和界面显示具体的用户只看到整个系统的一部分,即只有用户具有操作权限的模块,对该用户才是可见的,不具有操作权限的部分是不可见,因此,每个用户只看到整个界面树的一个子集,系统菜单动态生成。
2、系统运行环境(1)软件环境(2)硬件环境(3)开发环境1)服务器软件环境2)服务器硬件环境3)开发机器软件环境4)开发机器硬件环境3、系统功能层次结构4、系统中所应用的关键技术与算法(1)本系统采用JSP+JavaBeans实现JSP 即Java Server Pages,它是Serverlet的直接扩展,JSP框架的目标是将应用逻辑同表示分离,它旨在允许非JA V A开发人员用下列方式设计JSP 页面:1)HTML标记。
J2EE 课程设计实训项目——《蓝梦网上商城》——在Eclipse中构造出Struts Web课程设计实训项目
J2EE 课程设计实训项目——《蓝梦网上商城》——在Eclipse中构造出Struts Web课程设计实训项目1.1.1在Eclipse中构造出Struts Web项目1、在 Eclipse中创建出一个Struts的Web应用程序(1)Project的名称为WebShopProject(2)Web应用的(Context)名称为webshop(3)产生出该Struts的Web应用系统(4)并设置与Struts相关的一些配置参数(5)最后产生出下面的状态2、本项目的struts-config.xml配置文件的示例<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "/dtds/struts-config_1_2.dtd"><struts-config><data-sources /><form-beans ><form-bean name="userRegisterActionForm"type="erRegisterActionForm" > <form-property name="menuID" type="ng.String" /><form-property name="login_GetPassWord_ActionType"type="ng.String" initial="1" /><form-property name="aliaoName" type="ng.String" /><form-property name="confirmPassWord" type="ng.String" /><form-property name="passWordAnswer" type="ng.String" /><form-property name="passWordAsk" type="ng.String" /><form-property name="userImage" type="ng.String" /><form-property name="userMail" type="ng.String" /><form-property name="userName" type="ng.String" /><form-property name="userPassWord" type="ng.String" /><form-property name="userNewPassWord" type="ng.String" /><form-property name="userType" type="ng.String" initial="1" /><form-property name="userID" type="ng.String" /><form-property name="verifyCodeDigit" type="ng.String" /><form-property name="userSex" type="ng.String" initial="1" /><form-property name="userBirthDay" type="ng.String" /><form-property name="userComeFrom" type="ng.String" /><form-property name="userResume" type="ng.String" /><form-property name="type_User_Admin" type="ng.String" /><form-property name="userQQCode" type="ng.String" /><form-property name="userICQCode" type="ng.String" /><form-property name="userMSNCode" type="ng.String" /><form-property name="userSign" type="ng.String" /><form-property name="emailVisible" type="ng.Boolean" initial="false" /><form-property name="acceptAdvise" type="ng.Boolean" initial="false" /> <form-property name="workUnit" type="ng.String" /><form-property name="studyHistory" type="ng.String" /><form-property name="studySchool" type="ng.String" /><form-property name="idCardNo" type="ng.String" /></form-bean></form-beans><global-exceptions /><global-forwards><forward name="goGlobalException" path="/dealError/showWebAppError.jsp" /><forward name="goShowNoLoginError" path="/dealError/showNoLoginError.jsp" /></global-forwards><action-mappings ><action attribute="userRegisterActionForm" name="userRegisterActionForm"parameter="actionType" path="/userInfoManage" scope="request"type="org.springframework.web.struts.DelegatingActionProxy"><forward name="userLoginSuccess" path="/userACounter/showCounterInfo.jsp" /> <forward name="adminLoginSuccess" path="/systemManage/index.jsp" /><forward name="loginFailure" path="/dealError/showWebAppError.jsp" /><forward name="getPassWordSuccess" path="/userInfoManage/userLogin.jsp" /><forward name="getPassWordFailure" path="/dealError/showWebAppError.jsp" /><forward name="updateUserPassWordFailure" path="/dealError/showWebAppError.jsp" /> <forward name="updateUserPassWordSuccess" path="/userInfoManage/userLogin.jsp" /> <forward name="registerFailure" path="/dealError/showWebAppError.jsp" /><forward name="registerSuccess" path="/userInfoManage/userLogin.jsp" /><forward name="updateUserInfoSuccess" path="/userInfoManage/userLogin.jsp" /></action><action parameter="actionType" path="/pageForwordAction"type="org.springframework.web.struts.DelegatingActionProxy"><forward name="goUserRegisterRule" path="/userInfoManage/userRegisterRule.jsp" /> <forward name="goUserRegister" path="/userInfoManage/userRegister.jsp" /><forward name="goUserLogin" path="/userInfoManage/userLogin.jsp" /><forward name="goDoGetUserPassWord" path="/userInfoManage/getUserPassWord.jsp" /> <forward name="goDoUpdateUserInfo" path="/userInfoManage/updateUserInfo.jsp" /> <forward name="goDoUserLogout" path="/userInfoManage/userLogin.jsp" /><forward name="goDoUpdateUserPassWord"path="/userInfoManage/updateUserPassWord.jsp" /><forward name="goBBSIndex" path="/shopBBSInfo/bbsIndex.jsp" /><forward name="goAdvanceSearch" path="/goodsInfoManage/advanceSearchGoods.jsp" /> <forward name="goDefaultContentJSP" path="/images/defaultContent.jsp" /></action><action parameter="actionType" path="/searchGoodsURI"type="org.springframework.web.struts.DelegatingActionProxy"><forward name="showSearchAllGoodsInfo"path="/goodsInfoManage/showSearchAllGoodsInfo.jsp" /><forward name="showSearchAllBookInfo"path="/goodsInfoManage/showSearchAllBookInfo.jsp" /><forward name="showSearchAllCommDeviceInfo"<forward name="showSearchAllComputerInfo"path="/goodsInfoManage/showSearchAllComputerInfo.jsp" /><forward name="showSearchAllClothInfo"path="/goodsInfoManage/showSearchAllClothInfo.jsp" /><forward name="showSearchPartGoodsInfo"path="/goodsInfoManage/showSearchPartGoodsInfo.jsp" /><forward name="showSearchPartBookInfo"path="/goodsInfoManage/showSearchPartBookInfo.jsp" /><forward name="showSearchPartCommDeviceInfo"path="/goodsInfoManage/showSearchPartCommDeviceInfo.jsp" /><forward name="showSearchPartComputerInfo"path="/goodsInfoManage/showSearchPartComputerInfo.jsp" /><forward name="showSearchPartClothInfo"path="/goodsInfoManage/showSearchPartClothInfo.jsp" /><forward name="showSearchAdviceGoodsInfo"path="/goodsInfoManage/showSearchAdviceGoodsInfo.jsp" /><forward name="showSearchAdviceBookInfo"path="/goodsInfoManage/showSearchAdviceBookInfo.jsp" /><forward name="showSearchAdviceCommDeviceInfo"path="/goodsInfoManage/showSearchAdviceCommDeviceInfo.jsp" /> <forward name="showSearchAdviceComputerInfo"path="/goodsInfoManage/showSearchAdviceComputerInfo.jsp" /><forward name="showSearchAdviceClothInfo"path="/goodsInfoManage/showSearchAdviceClothInfo.jsp" /><forward name="showSearchNewGoodsInfo"path="/goodsInfoManage/showSearchNewGoodsInfo.jsp" /><forward name="showSearchNewBookInfo"path="/goodsInfoManage/showSearchNewBookInfo.jsp" /><forward name="showSearchNewCommDeviceInfo"<forward name="showSearchNewComputerInfo"path="/goodsInfoManage/showSearchNewComputerInfo.jsp" /><forward name="showSearchNewClothInfo"path="/goodsInfoManage/showSearchNewClothInfo.jsp" /><forward name="showSearchHotGoodsInfo"path="/goodsInfoManage/showSearchHotGoodsInfo.jsp" /><forward name="showSearchHotBookInfo"path="/goodsInfoManage/showSearchHotBookInfo.jsp" /><forward name="showSearchHotCommDeviceInfo"path="/goodsInfoManage/showSearchHotCommDeviceInfo.jsp" /><forward name="showSearchHotComputerInfo"path="/goodsInfoManage/showSearchHotComputerInfo.jsp" /><forward name="showSearchHotClothInfo"path="/goodsInfoManage/showSearchHotClothInfo.jsp" /><forward name="showSearchPayOffGoodsInfo"path="/goodsInfoManage/showSearchPayOffGoodsInfo.jsp" /><forward name="showSearchPayOffBookInfo"path="/goodsInfoManage/showSearchPayOffBookInfo.jsp" /><forward name="showSearchPayOffCommDeviceInfo"path="/goodsInfoManage/showSearchPayOffCommDeviceInfo.jsp" /> <forward name="showSearchPayOffComputerInfo"path="/goodsInfoManage/showSearchPayOffComputerInfo.jsp" /><forward name="showSearchPayOffClothInfo"path="/goodsInfoManage/showSearchPayOffClothInfo.jsp" /><forward name="showSearchSiteContent"path="/goodsInfoManage/showSearchSiteContent.jsp" /><forward name="showOneBookInfo" path="/goodsInfoManage/showOneBookInfo.jsp" /> <forward name="showOneComputerInfo"path="/goodsInfoManage/showOneComputerInfo.jsp" /><forward name="showOneCommDeviceInfo"path="/goodsInfoManage/showOneCommDeviceInfo.jsp" /> <forward name="showOneClothInfo" path="/goodsInfoManage/showOneClothInfo.jsp" /> <forward name="showOneGoodsInfo" path="/goodsInfoManage/showOneGoodsInfo.jsp" /> <forward name="searchFailure" path="/dealError/showWebAppError.jsp" /></action><actionparameter="actionType"path="/userCartAction"type="org.springframework.web.struts.DelegatingActionProxy"><forward name="goPayCartFee" path="/buyCartManage/PayCartFeeInfo.jsp" /><forward name="goCheckOrderInfo" path="/buyCartManage/CheckOrderInfo.jsp" /><forward name="goProduceOrderInfo" path="/buyCartManage/ProduceOrderInfo.jsp" /> <forward name="goShowCartInfo" path="/buyCartManage/showCartInfo.jsp" /><forward name="goUpdateOrderInfo" path="/buyCartManage/UpdateOrderInfo.jsp" /> </action></action-mappings><message-resources parameter="com.px1987.webshop.ApplicationResources" /><plug-in className="com.px1987.webshop.control.plugin.ParseXMLConfigPlugIn"> <set-property property="xmlPathnAndFileName"value="WEB-INF\config\information-config.xml"/></plug-in><plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"><set-property property="contextConfigLocation"value="/WEB-INF/classes/webShopUserInfoIoC.xml, /WEB-INF/classes/allActionIoC.xml"/> </plug-in></struts-config>。
J2EE 课程设计实训项目《蓝梦网上商城》——对系统业务处理层用户信息组件添加AOP ThrowsAdvice拦截器组件
J2EE 课程设计实训项目——《蓝梦网上商城》——对系统业务处理层的用户信息组件添加AOP ThrowsAdvice拦截器组件1.1.1对系统业务处理层中的相关组件添加AOP ThrowsAdvice拦截器组件1、org.springframework.aop.ThrowsAdvice接口(1)应用的目标若想要在业务组件(erInfoManageImple)中的某些方法出现com.px1987.webshop.service.ServiceException异常抛出时产生AOP通知并将异常信息以Log的形式记录下来,我们可以使用Throws Advice。
(2)要求在Spring中想要实现Throws Advice,必須实现org.springframework.aop.ThrowsAdvice接口,然而这个接口并沒有定义任何的方法,它只是一个标签(tag)。
(3)org.springframework.aop.ThrowsAdvice接口的定义2、定义的方式(1)afterThrowing方法的一般的定义方式因此,我们可以在代码中定义任意的方法名称,只要它是以下的形式就可以:public void afterThrowing(Method targetMethod, Object[] methodArgs, Object targetClass,Throwable exceptionClass);其中targetMethod、methodArgs与targetClass都是可以省略的,方法中必须要有的是exceptionClass,在异常发生时,会检验所设定的Throws Advice中是否有符合异常类型的响应方法afterThrowing,如果有的话就通知它执行。
(2)afterThrowing方法可以是下面的各种形式public void afterThrowing(Exception ex)public void afterThrowing(RemoteException)public void afterThrowing(Method method, Object[] args, Object target, Exception ex)public void afterThrowing(Method method, Object[] args, Object target, ServletException ex)所应该注意的是,我们只能通知方法,并传入异常对象,我们并不能在Throws Advice 中将异常处理掉,异常处理仍然是应用系统程序本身所要负责的。
J2EE 课程设计实训项目——《蓝梦网上商城》——系统UML用例图的设计
J2EE 课程设计实训项目——《蓝梦网上商城》——系统UML用例图的设计
“蓝梦网上商城”的UML用例图的设计
1、启动Rose
出现导包的过程-----如果我们在后面的类图和组件图需要应用JDK中的相关的类和接口,则需要进行导包。
最后出现下面的工作状态
2、新建一个Rose的文件
3、保存该Rose的文件
4、新建我们前台服务中的各个参与者(1)新建一个“各个参与者”包
(2)在该包中添加我们系统中的各个参与者
系统主要有下面的各种参与者:用户、Guest(未注册用户)、注册用户和管理员
(3)各个参与者之间的关系
5、新建我们前台服务中的各个用例
(1)新建各个用例所在的“前台的各个用例”包
(2)在该包中添加我们的各个用例
分别添加我们的各个用例
最后产生出各个用例。
6、新建我们前台服务中的各个用例图
(1)各种商品信息的显示(面向游客)的用例图
(2)决定各个用例之间的关系
(3)最后为下面的状态
7、各种信息的浏览操作(面向注册用户)的用例图-------具有Guest的所有用例
(1)在该用例图中分别添加各个用例,然后在决定各个用例之间的关系。
(2)最后为下面的状态
8、新建我们后台服务中的用例图(1)新建用例包
(2)在该用例包中分别添加各个用例
(3)创建出后台服务中的用例图
在该用例图中分别添加各个用例
然后再决定各个用例之间的关系。
J2EE 课程设计实训项目——《蓝梦网上商城》——应用Spring JavaMail邮件抽象实现项目中的邮件自动发送功能
J2EE 课程设计实训项目——《蓝梦网上商城》——应用Spring JavaMail 邮件抽象实现项目中的邮件自动发送功能1.1.1应用Spring JavaMail邮件抽象实现项目中的邮件自动发送功能1、Spring JavaMail概述E-mail是一个优秀的通知系统,也充当一个基本的工作流系统的角色。
Spring使发送邮件变得非常容易,它隐藏底层邮件系统的复杂性。
Spring邮件支持的主要接口叫做MailSender。
它还提供了一个SimpleMailMessage类来封装一条消息的公共属性(from, to, subject, message)。
如果我们想发送带附件的邮件,则可以用MimeMessagePreparator来创建和发送消息。
下面给出一个在本项目中的实现示例。
2、修改webShopUserInfoIoC.xml文件以添加与Spring邮件抽象实现相关的组件(1)定义一个org.springframework.mail.javamail.JavaMailSenderImpl组件对象<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"><property name="host" value=""/><property name="username" value="trainict"/><property name="password" value="6407"/></bean>(2)并将该组件对象注入到我们的Spring事件广播的响应的组件SpringActionEventResponse类中<bean id="springActionEventResponse" class="com.px1987.webshop.business.springevent.SpringActionEventResponse"> <property name="mailSender"><ref bean="mailSender"/></property></bean>(3)到目前为止的配置示例如下<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "/dtd/spring-beans-2.0.dtd"><beans><bean id="userInfoCRUDImple" class="erInfoCRUDImple" scope="prototype"> </bean><bean id="orderInfoCRUDImple" class="com.px1987.webshop.dao.crud.OrderInfoCRUDImple" scope="prototype"> </bean><bean id="goodsInfoCRUDImple" class="com.px1987.webshop.dao.crud.GoodsInfoCRUDImple" scope="prototype"> </bean><bean id="userInfoDAOServiceImple" class="erInfoDAOServiceImple" scope="prototype"> <property name="userInfoCRUDImple"><ref bean="userInfoCRUDImple"/></property><property name="orderInfoCRUDImple"><ref bean="orderInfoCRUDImple"/></property><property name="goodsInfoCRUDImple"><ref bean="goodsInfoCRUDImple"/></property></bean><bean id="orderInfoDAOServiceImple" class="com.px1987.webshop.service.OrderInfoDAOServiceImple" scope="prototype"> <property name="userInfoCRUDImple"><ref bean="userInfoCRUDImple"/></property><property name="orderInfoCRUDImple"><ref bean="orderInfoCRUDImple"/></property><property name="goodsInfoCRUDImple"><ref bean="goodsInfoCRUDImple"/></property></bean><bean id="goodsInfoDAOServiceImple" class="com.px1987.webshop.service.GoodsInfoDAOServiceImple" scope="prototype"> <property name="userInfoCRUDImple"><ref bean="userInfoCRUDImple"/></property><property name="orderInfoCRUDImple"><ref bean="orderInfoCRUDImple"/></property><property name="goodsInfoCRUDImple"><ref bean="goodsInfoCRUDImple"/></property></bean><bean id="userInfoManageImple" class="erInfoManageImple"scope="prototype"><property name="userInfoDAOServiceImple"><ref bean="userInfoDAOServiceImple"/></property><property name="springActionEventResponse"><ref bean="springActionEventResponse"/></property></bean><bean id="springActionEventResponse"class="com.px1987.webshop.business.springevent.SpringActionEventResponse"> <property name="mailSender"><ref bean="mailSender"/></property></bean><bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"><property name="host" value=""/><property name="username" value="trainict"/><property name="password" value="12345678"/></bean></beans>3、在我们的Spring事件广播的响应的组件SpringActionEventResponse类中增加一个名称为mailSender的JavaMailSenderImpl成员属性对象,并提供set方法import org.springframework.mail.javamail.JavaMailSender;…private JavaMailSender mailSender=null;public void setMailSender(JavaMailSender mailSender){this.mailSender = mailSender;}4、编程我们的邮件发送功能代码package com.px1987.webshop.business.springevent;import org.springframework.context.ApplicationListener;import org.springframework.context.ApplicationEvent;import org.springframework.mail.javamail.JavaMailSender;import org.springframework.mail.MailException;import org.springframework.mail.javamail.MimeMessagePreparator;import javax.mail.internet.MimeMessage;import javax.mail.MessagingException;import javax.mail.internet.InternetAddress;import javax.mail.Message;public class SpringActionEventResponse implements ApplicationListener { private JavaMailSender mailSender=null;public void setMailSender(JavaMailSender mailSender) {this.mailSender = mailSender;}String userMail=null;String userName=null;String userPassWord=null;public SpringActionEventResponse() {}public void onApplicationEvent(ApplicationEvent applicationEvent) {//识别事件源对象是否为指定的事件类型if (applicationEvent instanceof SpringActionEvent) {userMail=((SpringActionEvent)applicationEvent).getOneUserInfo().getUserMail();userName=((SpringActionEvent)applicationEvent).getOneUserInfo().getUserName();userPassWord=((SpringActionEvent)applicationEvent).getOneUserInfo().getUserPassWord();MimeMessagePreparator preparator = new MimeMessagePreparator() { public void prepare(MimeMessage mimeMessage) throws MessagingException{mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(userMail));mimeMessage.setFrom(new InternetAddress("trainict@"));mimeMessage.setText("您在本系统中的注册用户名称为:"+userName+ "密码为:"+userPassWord);}};try{mailSender.send(preparator);}catch (MailException ex) {System.err.println("邮件发送过程中出现了错误:"+ex.getMessage());return;}System.out.println("我们已经将您的ID及密码等信息发送到您的邮箱"+userMail);}}}。
J2EE 课程设计实训项目——《蓝梦网上商城》——在项目中应用Hibernate框架中的查询缓存管理技术
J2EE 课程设计实训项目——《蓝梦网上商城》——在项目中应用Hibernate框架中的查询缓存管理技术1.1.1在项目中应用Hibernate框架中的查询缓存管理技术1、启用查询缓存-------查询缓存在Hibernate同样是可配置的,默认是关闭的(1)启用查询缓存可以通过在hibernate.cfg.xml文件中添加e_ query_cache为true来打开查询缓存------查询缓存在数据发生任何变化的情况下都会被自动的清空。
<property name="e_query_cache"> true </property>该设置将会创建两个缓存区域:1)一个用于保存查询结果集(org.hibernate.cache.StandardQueryCache);2)另一个则用于保存最近查询的一系列表的时间戳(org.hibernate.cache.UpdateTimestampsCache)。
(2)请注意在查询缓存中,它并不缓存结果集中所包含的实体的确切状态;它只缓存这些实体的标识符属性的值、以及各值类型的结果。
所以查询缓存通常会和二级缓存一起使用。
(3)本项目中的查询缓存的配置如下<?xml version='1.0' encoding='gb2312'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN""/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><property name="dialect">org.hibernate.dialect.SQLServerDialect</property><property name="connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property> <property name="connection.url">jdbc:jtds:sqlserver://127.0.0.1:1433/NetShopDB</property> <property name="ername">sa</property><property name="connection.password">1234</property><property name="show_sql">true</property><!-- 将Hibernate发送给数据库的sql显示出来--><property name="e_query_cache"> true </property><property name = "hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> <property name=".hibernate.cache">debug</property><mapping resource="UserInfoPO.hbm.xml" /><mapping resource="AdminUserInfoPO.hbm.xml" /><mapping resource="GoodsInfoPO.hbm.xml" /><mapping resource="OrderInfoPO.hbm.xml" /></session-factory></hibernate-configuration>(4)Hibernate启动时,将能够看到下面的状态提示16:05:30,218 INFO SettingsFactory:209 - Second-level cache: enabled16:05:30,218 INFO SettingsFactory:213 - Query cache: enabled16:05:30,218 INFO SettingsFactory:325 - Cache provider: org.hibernate.cache.EhCacheProvider16:05:30,218 INFO SettingsFactory:228 - Optimize cache for minimal puts: disabled16:05:30,218 INFO SettingsFactory:237 - Structured second-level cache entries: disabled16:05:30,218 INFO SettingsFactory:312 - Query cache factory: org.hibernate.cache.StandardQueryCacheFactory2、如果用ehcache,则还需要配置ehcache.xml请见前面的ehcache.xml配置项目的内容。
J2EE 课程设计实训项目——《蓝梦网上商城》——构建用户信息管理相关的数据访问服务组件(第1部分)
J2EE 课程设计实训项目——《蓝梦网上商城》——构建用户信息管理相关的数据访问服务组件(第1/3部分)1.1.1构建用户信息管理相关的数据访问服务组件实际开发实现时,是将DAO服务组件细分为几个不同的组件。
这样能够更好地体现“单一职责”的设计原则。
1、添加一个ServiceException异常类(1)类名称为ServiceException,包名称为com.px1987.webshop.service,基类为ng.Exception(2)编程该异常类package com.px1987.webshop.service;public class ServiceException extends Exception{public ServiceException(){}public ServiceException(String message){super(message);}public ServiceException(Throwable cause){super(cause);}public ServiceException(String message, Throwable cause){ super(message, cause);}}2、添加一个CartServiceException异常类(1)类名称为CartServiceException,包名称为com.px1987.webshop.service,基类为ng.Exception(2)编程该异常类package com.px1987.webshop.service;public class CartServiceException extends Exception{//该异常类型为后面的购物车提供服务public CartServiceException() {}public CartServiceException(String message) {super(message);}public CartServiceException(Throwable cause) {super(cause);}public CartServiceException(String message, Throwable cause) { super(message, cause);}}3、添加我们的业务处理层的业务实体类等------用户信息管理所涉及的业务实体组件类(1)基类名称为UserInfoBaseVO,包名称为com.px1987.webshop.business.vobject(2)在该类中提供下面的各个属性,并且为这些属性提供get/set方法private String id;private String userName;private String userPassWord;private Integer userType;private String aliaoName;private String passWordAsk;private String userImage;private String registerTime;private String passWordAnswer;private String userMail;private String userResume;private Integer type_User_Admin; //该成员主要是区分用户的类型-----注册用户(=1)还是管理员(=2)(3)最后产生出下面的状态package com.px1987.webshop.business.vobject;public class UserInfoBaseVO {// 下面的属性来自于UserInfoBasePO类private String id;private String userName;private String userPassWord;private Integer userType;private String aliaoName;private String passWordAsk;private String userImage;private String registerTime;private String passWordAnswer;private String userMail;private String userResume;private Integer type_User_Admin; //该成员主要是区分用户的类型-----注册用户(=1)还是管理员(=2)public UserInfoBaseVO(){id="";userName="";userPassWord="";userType=new Integer(1);aliaoName="";passWordAsk="";userImage="";registerTime="";passWordAnswer="";userMail="";userResume="";type_User_Admin=new Integer(1);}public String getAliaoName() {return aliaoName;}public void setAliaoName(String aliaoName) { this.aliaoName = aliaoName;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getPassWordAnswer() {return passWordAnswer;}public void setPassWordAnswer(String passWordAnswer) { this.passWordAnswer = passWordAnswer;}public String getPassWordAsk() {return passWordAsk;}public void setPassWordAsk(String passWordAsk) { this.passWordAsk = passWordAsk;}public String getRegisterTime() {return registerTime;}public void setRegisterTime(String registerTime) { this.registerTime = registerTime;}public String getUserImage() {return userImage;}public void setUserImage(String userImage) { erImage = userImage;}public String getUserMail() {return userMail;}public void setUserMail(String userMail) {erMail = userMail;}public String getUserName() {return userName;}public void setUserName(String userName) {erName = userName;}public String getUserPassWord() {return userPassWord;}public void setUserPassWord(String userPassWord) {erPassWord = userPassWord;}public String getUserResume() {return userResume;}public void setUserResume(String userResume) {erResume = userResume;}public Integer getUserType() {return userType;}public void setUserType(Integer userType) {erType = userType;}public Integer getType_User_Admin() {return type_User_Admin;}public void setType_User_Admin(Integer type_User_Admin) {this.type_User_Admin = type_User_Admin;}}(2)类名称为UserInfoVO,包名称为com.px1987.webshop.business.vobject,基类为前面的erInfoBaseVO(3)在该类中定义下面的属性成员//下面的属性来自于UserInfoBasePO类private int userSex;private String userBirthDay;private String userComeFrom;// 下面的属性来自于UserInfoPO类private Map contactMethod = new HashMap();private String userSign;private int emailVisible;private int acceptAdvise;// 下面的属性来自于AdminUserInfoPO类private String workUnit;private String studyHistory;private String studySchool;private String idCardNo;(4)为上面的各个属性提供get/set方法(5)最后为下面的状态package com.px1987.webshop.business.vobject; import java.util.*;public class UserInfoVO extends UserInfoBaseVO{ //下面的属性来自于UserInfoBasePO类private int userSex;private String userBirthDay;private String userComeFrom;// 下面的属性来自于UserInfoPO类private Map contactMethod = new HashMap();private String userSign;private int emailVisible;private int acceptAdvise;// 下面的属性来自于AdminUserInfoPO类private String workUnit;private String studyHistory;private String studySchool;private String idCardNo;public UserInfoVO(){super();userSex=1;userBirthDay="";userComeFrom="";userSign="";emailVisible=1;acceptAdvise=1;workUnit="";studyHistory="";studySchool="";idCardNo="";}public int getAcceptAdvise() {return acceptAdvise;}public void setAcceptAdvise(int acceptAdvise) { this.acceptAdvise = acceptAdvise;}public int getEmailVisible() {return emailVisible;}public void setEmailVisible(int emailVisible) { this.emailVisible = emailVisible;}public String getIdCardNo() {return idCardNo;}public void setIdCardNo(String idCardNo) { this.idCardNo = idCardNo;}public String getStudyHistory() {return studyHistory;}public void setStudyHistory(String studyHistory) { this.studyHistory = studyHistory;}public String getStudySchool() {return studySchool;}public void setStudySchool(String studySchool) { this.studySchool = studySchool;}public String getUserBirthDay() {return userBirthDay;}public void setUserBirthDay(String userBirthDay) { erBirthDay = userBirthDay;}public String getUserComeFrom() {return userComeFrom;}public void setUserComeFrom(String userComeFrom) { erComeFrom = userComeFrom;}public int getUserSex() {return userSex;}public void setUserSex(int userSex) {erSex = userSex;}public String getUserSign() {return userSign;}public void setUserSign(String userSign) {erSign = userSign;}public String getWorkUnit() {return workUnit;}public void setWorkUnit(String workUnit) {this.workUnit = workUnit;}public String getUserICQCode() {return (String)contactMethod.get("userICQCode");}/** 下面的各个方法为“帮助方法”*/public void setUserICQCode(String userICQCode) { contactMethod.put("userICQCode", userICQCode);}public String getUserMSNCode() {return (String)contactMethod.get("userMSNCode");}public void setUserMSNCode(String userMSNCode) { contactMethod.put("userMSNCode", userMSNCode);}public String getUserQQCode() {return (String)contactMethod.get("userQQCode");}public void setUserQQCode(String userQQCode) {contactMethod.put("userQQCode", userQQCode);}public void addOneContactMethod(String oneContactMethodKey,String oneContactMethodValue) { //该方法为“帮助方法”contactMethod.put(oneContactMethodKey,oneContactMethodValue);}public String getOneContactMethod(String oneContactMethodKey){return (String)contactMethod.get(oneContactMethodKey);}public Map getContactMethod() {return contactMethod;}public void setContactMethod(Map contactMethod) {this.contactMethod = contactMethod;}}4、添加我们的业务处理层中针对订单信息管理的业务实体类等(1)订单信息管理所涉及的业务实体组件类类名称为OrderInfoVO,包名称为com.px1987.webshop.business.vobject(2)在该类中定义下面的属性成员private Integer id;private String createTime;private String userID;private boolean payFee;private int sendGoodsType;private String orderNumber;private String receivePersonName;private String receivePersonAddress;private String receivePersonTel;private String receivePersonMail; (3)为上面的各个属性提供get/set方法(4)最终的代码package com.px1987.webshop.business.vobject; public class OrderInfoVO{private Integer id;private String createTime;private String userID;private boolean payFee;private int sendGoodsType;private String orderNumber;private String receivePersonName;private String receivePersonAddress;private String receivePersonTel;private String receivePersonMail;public OrderInfoVO(){}public String getCreateTime() {return createTime;}public void setCreateTime(String createTime) { this.createTime = createTime;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getOrderNumber() {return orderNumber;}public void setOrderNumber(String orderNumber) {this.orderNumber = orderNumber;}public boolean isPayFee() {return payFee;}public void setPayFee(boolean payFee) {this.payFee = payFee;}public String getReceivePersonAddress() {return receivePersonAddress;}public void setReceivePersonAddress(String receivePersonAddress) { this.receivePersonAddress = receivePersonAddress;}public String getReceivePersonMail() {return receivePersonMail;}public void setReceivePersonMail(String receivePersonMail) { this.receivePersonMail = receivePersonMail;public String getReceivePersonName() {return receivePersonName;}public void setReceivePersonName(String receivePersonName) { this.receivePersonName = receivePersonName;}public String getReceivePersonTel() {return receivePersonTel;}public void setReceivePersonTel(String receivePersonTel) { this.receivePersonTel = receivePersonTel;}public int getSendGoodsType() {return sendGoodsType;}public void setSendGoodsType(int sendGoodsType) {this.sendGoodsType = sendGoodsType;}public String getUserID() {return userID;}public void setUserID(String userID) {erID = userID;}}5、添加我们的业务处理层针对商品信息管理组件的业务实体类等(1)商品信息管理所涉及的业务实体组件类类名称为GoodsInfoVO,包名称为com.px1987.webshop.business.vobject(2)在该类中定义下面的属性成员private Integer id;private String goodsName;private int goodsKind;private float goodsPrice;private float offPrice;private int hitNumber;private int buyNumber;private String imageFile;private String goodsDescriptor;private String goodsProductTime;private String goodFactoryName;private int totalNumber;private int onLibNumber;(3)为上面的各个属性提供get/set方法(4)最终的代码package com.px1987.webshop.business.vobject; public class GoodsInfoVO {private Integer id;private String goodsName;private int goodsKind;private float goodsPrice;private float offPrice;private int hitNumber;private int buyNumber;private String imageFile;private String goodsDescriptor;private String goodsProductTime;private String goodFactoryName;private int totalNumber;private int onLibNumber;public GoodsInfoVO(){}public int getBuyNumber() {return buyNumber;public void setBuyNumber(int buyNumber) {this.buyNumber = buyNumber;}public String getGoodFactoryName() {return goodFactoryName;}public void setGoodFactoryName(String goodFactoryName) { this.goodFactoryName = goodFactoryName;}public String getGoodsDescriptor() {return goodsDescriptor;}public void setGoodsDescriptor(String goodsDescriptor) { this.goodsDescriptor = goodsDescriptor;}public int getGoodsKind() {return goodsKind;}public void setGoodsKind(int goodsKind) {this.goodsKind = goodsKind;}public String getGoodsName() {return goodsName;}public void setGoodsName(String goodsName) {this.goodsName = goodsName;}public float getGoodsPrice() {return goodsPrice;public void setGoodsPrice(float goodsPrice) {this.goodsPrice = goodsPrice;}public String getGoodsProductTime() {return goodsProductTime;}public void setGoodsProductTime(String goodsProductTime) { this.goodsProductTime = goodsProductTime;}public int getHitNumber() {return hitNumber;}public void setHitNumber(int hitNumber) {this.hitNumber = hitNumber;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getImageFile() {return imageFile;}public void setImageFile(String imageFile) {this.imageFile = imageFile;}public float getOffPrice() {return offPrice;public void setOffPrice(float offPrice) { this.offPrice = offPrice;}public int getOnLibNumber() {return onLibNumber;}public void setOnLibNumber(int onLibNumber) { this.onLibNumber = onLibNumber;}public int getTotalNumber() {return totalNumber;}public void setTotalNumber(int totalNumber) { this.totalNumber = totalNumber;}}。
J2EE 课程设计实训项目——《蓝梦网上商城》——应用Spring框架中 的“Open Session in View模式”
J2EE 课程设计实训项目——《蓝梦网上商城》——应用Spring框架中的“Open Session in View模式”1.1.1在Spring框架与Hibernate框架相互整合的应用中应用Spring框架中的“OpenSession in View模式”(实现方式一)1、Spring提供了OpenSessionInViewerFilter和OpenSessionInViewInterceptor两种组件(1)功能使用它们中的任一个都能获得同样的功能。
(2)两者唯一不同点其中interceptor在Spring容器中运行,并且在web应用的上下文中配置(WebApplicationContext);而Fitler在Spring前就已经运行,并且需要在web.xml中配置。
不管使用哪一个,他们都会在请求绑定到Session的当前线程期间打开Hibernate Session。
(3)实现的原理Open Session In View在request把session绑定到当前thread期间一直保持hibernate session在open状态,使session在request的整个期间都可以使用,如在View层里PO也可以lazy loading数据。
当View 层逻辑完成后,才会通过Filter的doFilter方法或Interceptor的postHandle方法自动关闭session。
(4)HibernateDaoSupport透明地使用Hibernate 的Session一旦绑定到线程,打开的Hibernate 的Session能被DAO的实现类透明地使用。
Session 会持续打开允许延迟加载访问数据库。
一旦View逻辑完成,Hibernate 的Session会被关闭,无论是在Filter的doFilter方法中还是在Interceptor的postHandle方法中。
2、Interceptor配置示例此时可以使用Spring的AOP配置,将这个Interceptor配置到我们所需要的层次上去。
J2EE 课程设计实训项目《蓝梦网上商城》——在数据访问服务组件中应用Spring框架声明式事务技术(第1部分)
J2EE 课程设计实训项目——《蓝梦网上商城》——在数据访问服务组件中应用Spring框架的声明式事务技术(第1/5部分)1.1.1在数据访问服务组件中应用Spring框架的声明式事务技术1、为了能够应用Spring中的声明式事务,我们应该将Spring与Hibernate进行整合在本示例中,为了达到更大的灵活性。
我们采用相对松散的Spring与Hibernate整合方法----进行保留Hibernate中的Hibernate.cfg.xml文件。
<bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation"><!-- 在分层开发时使用<value>D:\AllInOneWebShop\WebShopProject\WebRoot\WEB-INF\classes\hibernate.cfg .xml</value>--><!-- 在Web集成时使用<value>WEB-INF/classes/hibernate.cfg.xml</value>--><value>WEB-INF/classes/hibernate.cfg.xml</value></property></bean>2、添加声明式事务所需要的其它的*.jar包文件(1)所需要的其它的*.jar包文件Spring的事务管理依赖于aopalliance.jar与cglib-nodep-2.1_3.jar。
因此,我们必须在Web应用的lib目录下增加对aopalliance.jar与cglib-nodep-2.1_3.jar的引用(2)aopalliance.jar在spring-framework-2.0.2\lib\aopalliance目录内(3)cglib-nodep-2.1_3.jar在\spring-framework-2.0.2\lib\cglib目录内(4)将它们加入到我们的lib目录中3、在此时的Spring 的IoC的*.xml配置中增加下面所示的内容<bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="configLocation"><!-- 在分层开发时使用--><value>D:\AllInOneWebShop\WebShopProject\WebRoot\WEB-INF\classes\hibernate.cf g.xml</value><!-- 在Web集成时使用<value>WEB-INF/classes/hibernate.cfg.xml</value>--></property></bean>注意:上面的文件的地址的表示方式在“在分层开发时使用”和“在Web集成时使用”时的不同4、使用Hibernate作为系统的事务资源管理器那么我们可以使用HibernateTransactionManager实现类,在此时的Spring 的IoC的*.xml配置中增加下面所示的内容:<bean id="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"><ref local="sessionFactory"/></property></bean>5、添加一个TransactionProxyFactoryBean的对象声明(1)针对UserInfoDAOServiceInterface的事务代理的定义<bean id="userInfoDAOServiceImpleProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="proxyInterfaces"><list><value>erInfoDAOServiceInterface</value></list></property><property name="transactionManager"><ref bean="transactionManager"/></property><property name="target"><ref bean="userInfoDAOServiceImple"/></property><property name="transactionAttributes"><props><prop key="Batch*">PROPAGATION_REQUIRED</prop></props></property></bean>(2)针对OrderInfoDAOServiceInterface的事务代理的定义<bean id="orderInfoDAOServiceImpleProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="proxyInterfaces"><list><value>com.px1987.webshop.service.OrderInfoDAOServiceInterface</value></list></property><property name="transactionManager"><ref bean="transactionManager"/></property><property name="target"><ref bean="orderInfoDAOServiceImple"/></property><property name="transactionAttributes"><props><prop key="Batch*">PROPAGATION_REQUIRED</prop></props></property></bean>(3)针对GoodsInfoDAOServiceInterface的事务代理的定义<bean id="goodsInfoDAOServiceImpleProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="proxyInterfaces"><list><value>com.px1987.webshop.service.GoodsInfoDAOServiceInterface</value> </list></property><property name="transactionManager"><ref bean="transactionManager"/></property><property name="target"><ref bean="goodsInfoDAOServiceImple"/></property><property name="transactionAttributes"><props><prop key="Batch*">PROPAGATION_REQUIRED</prop></props></property></bean>注意:Spring框架的事务回滚规则请注意Spring框架的事务基础架构代码将默认地只在抛出运行时和unchecked exceptions时才标识事务回滚。
J2EE 课程设计实训项目——《蓝梦网上商城》——实现系统项目中的用户信息业务处理功能组件
J2EE 课程设计实训项目——《蓝梦网上商城》——实现系统项目中的用户信息业务处理功能组件1.1.1实现系统项目中的用户信息业务处理功能组件1、添加与Spring相关的系统包(1)在Web-INF/lib目录下添加下面的各个文件spring.jar、aopalliance.jar、cglib-nodep-2.1_3.jar、spring-mock.jar、quartz-1.6.0.jar(定时器)、mail.jar和activation.jar(JMail相关的文件)而commons-logging.jar、log4j-1.2.14.jar已经在前面的Struts中添加过。
(2)实现过程如下2、用户信息管理的接口(1)接口名称为UserInfoManageInterface,包名称为er(2)设计该接口中的各个成员package er;import com.px1987.webshop.business.vobject.*;import com.px1987.webshop.service.*;import java.util.*;public interface UserInfoManageInterface{public boolean doUserLogin(UserInfoVO oneUserInfoVO) throws ServiceException;public boolean doUserRegister(UserInfoVO oneUserInfoVO) throws ServiceException;public boolean doUpdateOneUserInfo(UserInfoVO oneUserInfoVO) throws ServiceException;public boolean doUpdateOneRegisterUserPassWord(UserInfoVO oneUserInfoVO,String newPassWord) throws ServiceException;public boolean doUpdateOneAdminUserPassWord(UserInfoVO oneUserInfoVO,String newPassWord) throws ServiceException;public boolean doCheckUserNameExist(String userName,Integer type_User_Admin) throws ServiceException;public String doGetOneRegisterUserPassWord(UserInfoVO oneRegisterUserInfoVO) throws ServiceException;public String doGetOneAdminUserPassWord(UserInfoVO oneAdminUserInfoVO) throws ServiceException;public UserInfoVO doGetOneRegisterUserInfo(String registerUserID) throws ServiceException;public UserInfoVO doGetOneRegisterUserInfo(UserInfoVO oneRegisterUserInfoVO) throws ServiceException;public UserInfoVO doGetOneAdminUserInfo(String adminUserID) throws ServiceException;public UserInfoVO doGetOneAdminUserInfo(UserInfoVO oneAdminUserInfoVO) throws ServiceException;public UserInfoBaseVO doGetOneUserInfo(String userName,String userPassWord, Integer type_User_Admin) throws ServiceException;public ArrayList doGetAllUserNameInfo(String userName) throws ServiceException;public boolean doDeleteOneRegisterUserInfo(String registerUserID) throws ServiceException;public boolean doDeleteOneRegisterUserInfo(UserInfoVO oneRegisterUserInfoVO) throws ServiceException;public boolean doDeleteOneAdminUserInfo(String adminUserID) throws ServiceException;public boolean doDeleteOneAdminUserInfo(UserInfoVO oneAdminUserInfoVO) throws ServiceException;public ArrayList doGetAllRegisterUserInfo() throws ServiceException;public ArrayList doGetSomeRegisterUserInfo(Map registerUserInfos) throws ServiceException;public ArrayList doGetAllAdminUserInfo() throws ServiceException;public ArrayList doGetSomeAdminUserInfo(Map adminUserInfos) throws ServiceException;}3、用户信息管理的接口UserInfoManageInterface的实现类(1)用户信息管理的接口UserInfoManageInterface的实现类------类名称为UserInfoManageImple,包名称为er(2)将产生出下面的状态(3)并在其中提供一个“UserInfoDAOServiceInterface userInfoDAOServiceImple=null;”的对象声明,同时为它提供set方法。
J2EE 课程设计实训项目——《蓝梦网上商城》——对系统持久层中的DAO组件进行单元测试(第2部分)
J2EE 课程设计实训项目——《蓝梦网上商城》——对系统持久层中的DAO组件进行单元测试(第2/3部分)8、添加对DAO组件GoodsInfoCRUDImple类进行测试的TestCase类(1)新增一个测试用例,类名称为TestGoodsInfoCRUDImple,包名称为com.px1987.webshop.testdao,基类为junit.framework.TestCase,被测试的类选择为com.px1987.webshop.dao.crud.GoodsInfoCRUDImple(2)进入到下一步,并选择我们需要进行测试的方法(3)将产生出下面的结果(4)编程该测试用例类中的各个测试方法package com.px1987.webshop.testdao; import junit.framework.*;import com.px1987.webshop.dao.crud.*;import com.px1987.webshop.dao.exception.DAOException;import java.util.*;import com.px1987.webshop.dao.pobject.*;public class TestGoodsInfoCRUDImple extends TestCase{private GoodsInfoCRUDInterface goodsInfoCRUDImple = null;public TestGoodsInfoCRUDImple(String arg0){super(arg0);}protected void setUp() throws Exception{super.setUp();goodsInfoCRUDImple=new GoodsInfoCRUDImple();}protected void tearDown() throws Exception{goodsInfoCRUDImple=null;super.tearDown();}public void testInsertOneGoodsInfo() throws DAOException{GoodsInfoPO oneGoodsInfoPO=new GoodsInfoPO();//不需要设置该值,可以由Hibernate自动来实现添加// oneGoodsInfoPO.setId(new Integer(1));oneGoodsInfoPO.setGoodsName("海尔电冰箱");oneGoodsInfoPO.setGoodsKind(1);oneGoodsInfoPO.setGoodsPrice(1500.50f);oneGoodsInfoPO.setOffPrice(0.8f);oneGoodsInfoPO.setHitNumber(1000);oneGoodsInfoPO.setBuyNumber(1200);oneGoodsInfoPO.setImageFile("../webResource/goodsImage/goods.jpg");oneGoodsInfoPO.setGoodsDescriptor("海尔新一代的电冰箱。
《J2EE系统架构和程序设计》课程设计实训项目——蓝梦网上商店系统测试计划说明书
《J2EE系统架构和程序设计》课程设计实训项目——蓝梦网上商店系统测试计划说明书杨教授大学堂精心创作的优秀程序员职业提升必读系列资料《J2EE系统架构和程序设计》课程设计实训项目——蓝梦网上商店系统测试计划说明书1.1.1 引言1、编写目的本测试计划书的目的是为了描述蓝梦网上商店系统项目所要完成的测试,包括测试背景、测试目的、风险分析、所需资源、任务安排和进度等。
本计划的读者对象为项目经理,软件测试工程师以及软件测试人员。
2、参考资料(1)J2EE项目实训Hibernate框架技术(21世纪高等学校实用软件工程教育规划教材)杨少波编著清华大学出版社 2008 年5月(2)J2EE项目实训Spring框架技术(21世纪高等学校实用软件工程教育规划教材)杨少波编著清华大学出版社 2008 年5月(3)J2EE项目实训UML及设计模式(21世纪高等学校实用软件工程教育规划教材)杨少波编著清华大学出版社 2008 年5月(4)J2EE项目实训Struts框架技术(21世纪高等学校实用软件工程教育规划教材)杨少波编著清华大学出版社 2008 年10月(5)《JSP与数据库连接》刘瑞挺,高等教育出版社(6)《数据库原理与方法》郑若忠王鸿武,湖南科学技术出版社(7)《软件需求》(美) Karl E.Wiegers 著,刘伟琴刘洪涛译1.1.2 任务概述1、测试目标本测试计划的目标分为三个阶段,第一阶段测试本系统的各种功能的实现效果,分为管理员功能和用户购物功能两大部分;第二阶段测试本系统在各种平台下的兼容性;第三阶段测试系统的安全性和可扩展性。
本计划说明书主要针对第一阶段。
2、测试运行环境杨教授大学堂,版权所有,盗版必究。
1/9页杨教授大学堂精心创作的优秀程序员职业提升必读系列资料(1)硬件环境目前市场上出售的一般个人或商务电脑均可使用,机器配置要求如下:1)CPU: P3同类档次或更高档次以上。
2)内存: 256M以上内存。
《J2EE系统架构和程序设计》课程设计实训项目——蓝梦网上商店系统概要设计说明书
《J2EE系统架构和程序设计》课程设计实训项⽬——蓝梦⽹上商店系统概要设计说明书《J2EE系统架构和程序设计》课程设计实训项⽬——蓝梦⽹上商店系统概要设计说明书1.1.1编写⽬的将软件系统需求转换为未来系统的设计,逐步开发强壮的系统构架,并使设计适合于实施环境,为提⾼性能⽽进⾏设计和为程序开发步骤配置提供指导。
因此,本设计说明书作为《蓝梦⽹上商店系统》项⽬开发的依据和规范,并作为开发任务及⽬标依据和规范系统开发操作,《蓝梦⽹上商店系统》⽹站的开发内容及达到的各项功能及性能指标以此设计说明书为准。
本设计⽂档描述了整个系统的架构以及业务逻辑实现时应遵循的步骤,⽂档的预期读者主要包括:项⽬管理⼈员、系统设计⼈员与程序编写⼈员、测试⼈员、⽤户⼿册编写⼈员、客户、系统维护⼈员和项⽬评审⼈员等。
1.1.2系统总体设计1、系统主要的特⾊(1)系统基于J2EE架构设计将界⾯表⽰、业务务逻辑和数据层相对分离,使系统结构更加合理;采⽤成熟的J2EE 架构,使系统具有较好的维护性。
(2)采⽤中间件的负载平衡、动态伸缩等功能为关键业务建⽴了最佳的运⾏环境,为应⽤提供了充分的扩展余地。
(3)以Browser(浏览器)为核⼼的客户端程序实现了真正意义上的“零维护”,从⽽使业务软件的更新、发布和维护更为容易。
(4)系统的外部接⼝采⽤XML数据交换格式降低系统间偶合度,确保数据交换与具体应⽤平台⽆关。
(5)系统采⽤个性化的权限管理和界⾯显⽰具体的⽤户只看到整个系统的⼀部分,即只有⽤户具有操作权限的模块,对该⽤户才是可见的,不具有操作权限的部分是不可见,因此,每个⽤户只看到整个界⾯树的⼀个⼦集,系统菜单动态⽣成。
2、系统运⾏环境(1)软件环境(2)硬件环境(3)开发环境1)服务器软件环境2)服务器硬件环境3)开发机器软件环境4)开发机器硬件环境3、系统功能层次结构4、系统中所应⽤的关键技术与算法(1)本系统采⽤JSP+JavaBeans实现JSP 即Java Server Pages,它是Serverlet的直接扩展,JSP框架的⽬标是将应⽤逻辑同表⽰分离,它旨在允许⾮JA V A开发⼈员⽤下列⽅式设计JSP 页⾯:1)HTML标记。
J2EE 课程设计实训项目——《蓝梦网上商城》——对系统控制层中的用户信息管理的Action程序类进行单元测试
J2EE 课程设计实训项目——《蓝梦网上商城》——对系统控制层中的用户信息管理的Action程序类进行单元测试1.1.1对系统控制层中的各个Action程序类进行单元测试1、引用在控制层测试中所需要的各个*.jar包文件(1)将Strutstest和Junit所需要的*.jar包加入到本测试项目中(2)将J2EE Web技术中所需要的Servlet和JSP的*.jar包加入------因为,本测试用例所在的项目为Java项目1)servlet-api.jar和jsp-api.jar文件(在Tomcat中带有)2)commons-collections-2.1.1.jar包文件(在Struts的系统包中已经带有)2、在测试的Java项目中添加一个针对UserInfoManageAction类的TestCase类(1)新增加一个TestCase类(2)设置该TestCase的各个项目类名称为MockStrutsTestUserInfoManageAction,包名称为com.px1987.webshop.testcontrol,基类选择为servletunit.struts.MockStrutsTestCase。
被测试的类为erInfoManageAction。
(3)选择需要进行测试的各个方法(4)点击“完成”按钮,将产生出下面的状态5、编程该MockStrutsTestUserInfoManageAction测试用例类package com.px1987.webshop.testcontrol;import servletunit.struts.MockStrutsTestCase;import junit.framework.*;import java.io.*;import java.util.Date;import javax.servlet.http.HttpSession;public class MockStrutsTestUserInfoManageAction extends MockStrutsTestCase { public MockStrutsTestUserInfoManageAction(String arg0) {super(arg0);}protected void setUp() throws Exception{super.setUp();}protected void tearDown() throws Exception{super.tearDown();}public void testDoSuccessUserLogin(){/*下面的目录路径根据实际的状态,修改为对应的内容*/setContextDirectory(new File("D:/AllInOneWebShop/WebShopProject/WebRoot"));setConfigFile("/WEB-INF/struts-config.xml");setRequestPathInfo("/userInfoManage");HttpSession session=request.getSession();session.setAttribute("verifyCode","1234");addRequestParameter("verifyCodeDigit","1234");addRequestParameter("actionType","doLogin_GetPassWord");//代表目前为登录和找回密码的表单状态addRequestParameter("menuID","2");addRequestParameter("type_User_Admin","1");addRequestParameter("userName","张三");addRequestParameter("userPassWord","12345678");//代表目前为登录状态addRequestParameter("login_GetPassWord_ActionType","1");actionPerform();verifyForward("userLoginSuccess");}public void testDoFailureUserLogin(){/*下面的目录路径根据实际的状态,修改为对应的内容*/setContextDirectory(new File("D:/AllInOneWebShop/WebShopProject/WebRoot"));setConfigFile("/WEB-INF/struts-config.xml");setRequestPathInfo("/userInfoManage");HttpSession session=request.getSession();session.setAttribute("verifyCode","1234");addRequestParameter("verifyCodeDigit","1234");addRequestParameter("actionType","doLogin_GetPassWord");//代表目前为登录和找回密码的表单状态addRequestParameter("menuID","2");addRequestParameter("type_User_Admin","1");addRequestParameter("userName","张三");//将密码设置为错误的数据addRequestParameter("userPassWord","abcd");//代表目前为登录状态addRequestParameter("login_GetPassWord_ActionType","1");actionPerform();verifyForward("loginFailure");}public void testDoSuccessGetPassWord() {// 下面的目录路径根据实际的状态,修改为对应的内容setContextDirectory(new File("D:/AllInOneWebShop/WebShopProject/WebRoot"));setConfigFile("/WEB-INF/struts-config.xml");setRequestPathInfo("/userInfoManage");HttpSession session=request.getSession();session.setAttribute("verifyCode","1234");addRequestParameter("verifyCodeDigit","1234");addRequestParameter("actionType","doLogin_GetPassWord");//代表目前为登录和找回密码的表单状态addRequestParameter("menuID","2");addRequestParameter("type_User_Admin","1");addRequestParameter("userName","张三");addRequestParameter("passWordAsk","Who Are You?");addRequestParameter("passWordAnswer","zhang");//代表目前为找回密码状态addRequestParameter("login_GetPassWord_ActionType","2");actionPerform();verifyForward("getPassWordSuccess");}public void testDoFailureGetPassWord(){// 下面的目录路径根据实际的状态,修改为对应的内容setContextDirectory(new File("D:/AllInOneWebShop/WebShopProject/WebRoot"));setConfigFile("/WEB-INF/struts-config.xml");setRequestPathInfo("/userInfoManage");HttpSession session=request.getSession();session.setAttribute("verifyCode","1234");addRequestParameter("verifyCodeDigit","1234");addRequestParameter("actionType","doLogin_GetPassWord");//代表目前为登录和找回密码的表单状态addRequestParameter("menuID","2");addRequestParameter("type_User_Admin","1");addRequestParameter("userName","张三");addRequestParameter("passWordAsk","Who Are You?");//将答案设置为错误的数据addRequestParameter("passWordAnswer","1234");//代表目前为找回密码状态addRequestParameter("login_GetPassWord_ActionType","2");actionPerform();verifyForward("getPassWordFailure");}public void testDoRegister() {// 下面的目录路径根据实际的状态,修改为对应的内容setContextDirectory(new File("D:/AllInOneWebShop/WebShopProject/WebRoot"));setConfigFile("/WEB-INF/struts-config.xml");setRequestPathInfo("/userInfoManage");HttpSession session=request.getSession();session.setAttribute("verifyCode","1234");addRequestParameter("verifyCodeDigit","1234");addRequestParameter("actionType","doRegister");//代表目前为注册的表单状态addRequestParameter("menuID","1");addRequestParameter("userName","张三");addRequestParameter("userPassWord","12345678");addRequestParameter("confirmPassWord","12345678");addRequestParameter("aliaoName","网上张飞");addRequestParameter("type_User_Admin","1");addRequestParameter("passWordAsk","Who Are You?");addRequestParameter("passWordAnswer","zhang");addRequestParameter("userMail","trainict@"); addRequestParameter("userImage","../webResource/PersonImage/Chang.gif");addRequestParameter("userSex","1");addRequestParameter("userBirthDay","2007-01-25");addRequestParameter("userComeFrom","北京");addRequestParameter("userResume","我是网络飞人");addRequestParameter("userType","1");addRequestParameter("userQQCode","QQ1234567890");addRequestParameter("userICQCode","ICQ1234567890");addRequestParameter("userMSNCode","MSN1234567890");addRequestParameter("userSign","12345678900");addRequestParameter("emailVisible",new Boolean(true).toString());addRequestParameter("acceptAdvise",new Boolean(true).toString());actionPerform();verifyForward("registerSuccess");}public void testDoUpdateUserPassWord(){// 下面的目录路径根据实际的状态,修改为对应的内容setContextDirectory(new File("D:/AllInOneWebShop/WebShopProject/WebRoot"));setConfigFile("/WEB-INF/struts-config.xml");setRequestPathInfo("/userInfoManage");HttpSession session=request.getSession();session.setAttribute("verifyCode","1234");addRequestParameter("verifyCodeDigit","1234");//代表目前为修改密码的表单状态addRequestParameter("menuID","3");addRequestParameter("actionType","doUpdateUserPassWord");addRequestParameter("type_User_Admin","1");addRequestParameter("userName","张三");addRequestParameter("userPassWord","12345678");addRequestParameter("userNewPassWord","1234");actionPerform();verifyForward("updateUserPassWordSuccess");}public void testDoUpdateUserInfo(){// 下面的目录路径根据实际的状态,修改为对应的内容setContextDirectory(new File("D:/AllInOneWebShop/WebShopProject/WebRoot"));setConfigFile("/WEB-INF/struts-config.xml");setRequestPathInfo("/userInfoManage");HttpSession session=request.getSession();session.setAttribute("verifyCode","1234");addRequestParameter("verifyCodeDigit","1234");//代表目前为修改用户的信息的表单状态addRequestParameter("menuID","1");addRequestParameter("actionType","doUpdateUserInfo");//应该根据数据库表中的实际的数据值来决定String registerUserId="402880681071d7ed011071d7f24b0002";addRequestParameter("userID",registerUserId);addRequestParameter("userName","张三");addRequestParameter("userPassWord","12345678");addRequestParameter("confirmPassWord","12345678");addRequestParameter("aliaoName","网上张飞");addRequestParameter("type_User_Admin","1");addRequestParameter("passWordAsk","Who Are You?");addRequestParameter("passWordAnswer","zhang");addRequestParameter("userMail","trainict@");addRequestParameter("userImage","../webResource/PersonImage/Chang.gif");addRequestParameter("userSex","1");addRequestParameter("userBirthDay","2007-01-25");addRequestParameter("userComeFrom","北京");addRequestParameter("userResume","我是网络飞人");addRequestParameter("userType","1");addRequestParameter("userQQCode","QQ1234567890");addRequestParameter("userICQCode","ICQ1234567890");addRequestParameter("userMSNCode","MSN1234567890");addRequestParameter("userSign","12345678900");addRequestParameter("emailVisible",new Boolean(true).toString());addRequestParameter("acceptAdvise",new Boolean(true).toString());actionPerform();verifyForward("updateUserInfoSuccess");}}6、执行该MockStrutsTestUserInfoManageAction测试用例类(1)执行该测试用例类杨教授大学堂精心创作的优秀程序员职业提升必读系列资料(2)将产生出下面的结果杨教授大学堂,版权所有,盗版必究。
J2EE 课程设计实训项目《蓝梦网上商城》——应用J2EE Filter实现Spring框架中“Open Session in View模式”
J2EE 课程设计实训项目——《蓝梦网上商城》——应用J2EE Filter过滤器组件实现Spring框架中的“Open Session in View模式”1.1.1应用J2EE Filter过滤器组件实现Spring框架中的“Open Session in View模式”由于本项目是Struts +Spring +Hibernate三者相互整合,同时由于Struts中的ContextLoaderPlugIn组件与OpenSessionInViewFilter组件之间产生了冲突,因此在本项目中放弃了OpenSessionInViewFilter组件,而采用标准的Filter组件来实现“Open Session in View”。
1、对本项目中的HibernateUtil.java代码进行修改(1)添加下面的黑体部分的代码package com.px1987.webshop.dao.util;import org.hibernate.*;import org.hibernate.cfg.*;public class HibernateUtil{private static final SessionFactory sessionFactory;/* 静态初始器,当JVM(Java虚拟机)加载HibernateUtil类时,会执行该静态代码块。
*/static{try{ // Create the SessionFactorysessionFactory = new Configuration().configure().buildSessionFactory();/*也可以采用下面的方式Configuration hibernateConfiguration=new Configuration();sessionFactory = hibernateConfiguration.configure().buildSessionFactory();*/}catch (Throwable ex){throw new ExceptionInInitializerError(ex);}}public static final ThreadLocal threadLocal = new ThreadLocal(); public static final ThreadLocal tLocaltx = new ThreadLocal(); public static Session currentSession(){Session currentSession = (Session) threadLocal.get();if (currentSession == null){currentSession = sessionFactory.openSession();threadLocal.set(currentSession);}return currentSession;}public static void closeSession(){Session currentSession = (Session) threadLocal.get();if (currentSession != null){currentSession.close();}threadLocal.set(null);}public static void beginTransaction(){Transaction tx = (Transaction) tLocaltx.get();try{if (tx == null) {tx = currentSession().beginTransaction();tLocaltx.set(tx);}}catch (HibernateException e) {throw e;}}public static void commitTransaction(){Transaction tx = (Transaction) tLocaltx.get();try{if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack())mit();tLocaltx.set(null);}catch (HibernateException e){throw e;}}public static void rollbackTransaction(){Transaction tx = (Transaction) tLocaltx.get();try{tLocaltx.set(null);if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()){tx.rollback();}}catch (HibernateException e){throw e;}}}(2)目的提供完整的事务实现的控制。
J2EE 课程设计实训项目——《蓝梦网上商城》——应用J2EE Listener监听器组件显示在线用户总数
J2EE 课程设计实训项目——《蓝梦网上商城》——应用J2EE Listener 监听器组件显示在线用户总数1.1.1应用J2EE Listener组件显示在线用户数1、添加一个在线用户计数的组件(1)类名称为OnLineCounter,包名称为com.px1987.webshop.control.bean(2)编程该OnLineCounter组件package com.px1987.webshop.control.bean;import java.util.*;import erInfoVO;import com.px1987.webshop.control.listener.CounterOnLineVisitorListener;public class OnLineCounter{private static int onLine = 0;public static int getOnLine(){return onLine;}public static void addOneUser(){onLine++;}public static void reduceOneUser(){onLine--;}public static List getOnLineUserNameList(){Iterator onLineUserList=CounterOnLineVisitorListener.getOnLineUserList().iterator();List onLineUserNameList=new ArrayList();while(onLineUserList.hasNext()){UserInfoVO oneLoginUserInfoVO=(UserInfoVO)onLineUserList.next();onLineUserNameList.add(oneLoginUserInfoVO.getUserName());}return onLineUserNameList;}public static int getOnLineMemberUserNumber(){return CounterOnLineVisitorListener.getOnLineUserList().size();}}2、添加CounterOnLineVisitorListener监听器组件(1)类名称为CounterOnLineVisitorListener,包名称为com.px1987.webshop.control.listener,并且实现javax.servlet.http.HttpSessionListener和HttpSessionAttributeListener等接口(2)部署该CounterOnLineVisitorListener监听器组件<listener><listener-class>com.px1987.webshop.control.listener.CounterOnLineVisitorListener </listener-class></listener>(3)编程该Listener监听器组件package com.px1987.webshop.control.listener;import javax.servlet.http.HttpSessionAttributeListener;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;import com.px1987.webshop.control.bean.OnLineCounter;import erInfoVO;import java.util.*;public class CounterOnLineVisitorListener implementsHttpSessionAttributeListener, HttpSessionListener{private static List onLineUserList=new ArrayList();public void sessionCreated(HttpSessionEvent se){OnLineCounter.addOneUser();}public void sessionDestroyed(HttpSessionEvent se){OnLineCounter.reduceOneUser();}public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent){//识别该用户是否已经登录if(httpSessionBindingEvent.getName().equals("oneUserInfoVO")){UserInfoVO nowLoginUserInfo=(UserInfoVO)httpSessionBindingEvent.getValue();onLineUserList.add(nowLoginUserInfo);}}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;}}3、添加对Cookie进行操作的JavaBean组件(1)类名称为ReadWriteCookie,包名称为com.px1987.webshop.control.bean(2)编程该组件package com.px1987.webshop.control.bean;import javax.servlet.*;import javax.servlet.jsp.*;import javax.servlet.http.*;import java.util.*;import com.px1987.webshop.business.vobject.*;public class ReadWriteCookie {private PageContext pageContext=null;Cookie lastAccessCookie=null;HttpServletRequest request=null;HttpServletResponse response=null;HttpSession session=null;ServletContext application=null;String nowDateString=null;UserInfoBaseVO oneUserInfoVO=null;String lastAccessDateString=null;String nowBrowseingUserName=null;String onLineGuestCounter="0";public ReadWriteCookie(){}public ReadWriteCookie(PageContext pageContext) {this.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年。
《J2EE系统架构和程序设计》课程设计实训项目——蓝梦网上商店系统需求分析和建模实例
《J2EE系统架构和程序设计》课程设计实训项目——蓝梦网上商店系统需求分析和建模实例1.1.1引言1、编写目的本网上书店系统需求分析说明书旨在完整、系统地描述蓝梦网上书店系统网上售书系统的功能性和非功能性需求。
本说明书将作为蓝梦网上书店系统项目验收的主要依据,并作为后续的系统概要设计、详细设计、编码实现、系统测试的基础性文档。
预期读者为蓝梦网上书店系统相关负责人及蓝梦网上书店系统项目组成员。
2、背景蓝梦网上书店系统旨在依托成熟的网络技术,达到简化售书流程,节约时间及成本的目的。
蓝梦网上书店系统目前以北京地区为主要的市场,目标将业务扩展到整个中国境内。
3、定义(1)需求用户解决问题或达到目标所需的条件或功能;系统或系统部件要满足合同、标准,规范或其它正式规定文档所需具有的条件或权能。
(2)需求分析包括提炼,分析和仔细审查已收集到的需求,以确保所有的风险承担者都明其含义并找出其中的错误,遗憾或其它不足的地方。
(3)模块的独立性是指软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其他的模块的接口是简单的。
4、运行环境(1)服务器设备——SUN Fire V240(2)支持软件1)操作系统:Sun Solaris 102)Web服务器:Sun App Server 9.13)JDK:JDK 6 U74)数据库:Oracle数据库系统(3)客户端——各种版本的浏览器5、参考资料(1)J2EE项目实训Hibernate框架技术(21世纪高等学校实用软件工程教育规划教材)杨少波编著清华大学出版社 2008 年5月(2)J2EE项目实训Spring框架技术(21世纪高等学校实用软件工程教育规划教材)杨少波编著清华大学出版社 2008 年5月(3)J2EE项目实训UML及设计模式(21世纪高等学校实用软件工程教育规划教材)杨少波编著清华大学出版社 2008 年5月(4)J2EE项目实训Struts框架技术(21世纪高等学校实用软件工程教育规划教材)杨少波编著清华大学出版社2008 年10月(5)《JSP与数据库连接》刘瑞挺,高等教育出版社(6)《数据库原理与方法》郑若忠王鸿武,湖南科学技术出版社(7)《软件需求》(美)Karl E.Wiegers 著,刘伟琴刘洪涛译1.1.2系统功能性需求规定1、系统功能性需求(1)用户通过前台订书系统下订书单,由订单处理中心进行订单的分类、处理。
J2EE 课程设计实训项目——《蓝梦网上商城》——实现系统项目的总装配和集成测试部署
J2EE 课程设计实训项目——《蓝梦网上商城》——实现系统项目的总装配和集成测试部署1.1.1装配系统中的表示层组件1、将本项目作一个项目的备份,其目的是保留未装配前的状态,并将它作为总装配的目标项目2、装配表示层组件(1)将表示层中的各个页面及对应的目录完整地拷贝到该WebShopProject项目中的WebRoot目录中(2)结果如下(3)在Eclipse中打开该总装配后的项目,并刷新一下项目(4)将能够看到我们的各个页面的内容1.1.2对系统进行部署和集成测试的实现过程1、修改我们的Spring中的*.xml文件中的hibernate.cfg.xml文件的定位<bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="configLocation"><!-- 在分层开发时使用<value>D:\AllInOneWebShop\WebShopProject\WebRoot\WEB-INF\classes\hibernate.cfg.xml</ value>--><!-- 在Web集成时使用<value>WEB-INF/classes/hibernate.cfg.xml</value>--><value>WEB-INF/classes/hibernate.cfg.xml</value></property></bean>否则在Web应用在启动时,将出现错误。
2、部署本总装配后的Web项目(1)为本项目配置出Tomcat服务器(2)产生出一个部署配置项目(3)部署本项目到Tomcat中(4)并查看一下所部署的结果2、启动Tomcat服务器-----由于本Web项目是基于JDK1.5的,因此最好要求Tomcat应该为Tomcat5.5及以上版本(1)在Tomcat服务器所在的\conf\server.xml文件中为本Web应用建一个Context的配置项目(2)启动Tomcat服务器3、在浏览器中输入http://127.0.0.1:8080/webshop/index.htm (1)将出现下面的页面内容(2)对系统进行集成测试(3)输入用户名称“yang”和密码“123456”注意:应该保证用户的信息是数据库表存在的数据,然后将出现用户登录成功的页面信息的内容。
J2EE 课程设计实训项目——《蓝梦网上商城》——实现系统表示层中的各个JSP页面
J2EE 课程设计实训项目——《蓝梦网上商城》——实现系统表示层中的各个JSP页面1.1.1实现系统表示层中的各个JSP页面1、在Macromedia Dreamweaver MX 2004中针对该Struts的WebApp新建一个Web站点该Web 站点所在的目录为我们磁盘中的某个目录。
2、在该Web站点所在的目录中添加或者新建我们的各个资源目录(1)images和webImages(2)flash(3)css(4)webResource(5)javascript(6)database3、在Macromedia Dreamweaver MX 2004中针对本Web系统新建一个页面模板文件(1)新建一个模板页面(2)将产生出一个空的页面(3)保存该模板页面为一个模板文件pageTemplate.dwt(4)输入模板文件的名称(5)将自动地产生出一个Template的目录,并在该目录中保存我们的模板文件4、设计该模板页面中的内容(1)对该模板页面进行页面设计------该过程由于比较多,在此省略(2)在该模板页面中定义可编辑区(3)输入可编辑区的名称为:pageContent(4)最后再次保存该模板页面文件。
5、依此相同的方法再新建一个模板页面pageTemplateTwo.dwt6、根据模板页面新建出本系统的各个表示层的页面文件(1)根据模板页面新建各个页面(2)选择该页面所依赖的模板页面,并点击“创建”按钮,将出现一个与模板页面一样的空的页面(3)根据应用的要求设计该页面的内容7、本系统的表示表示层的页面目录如下8、在模板页面中设计全局导航条,将各个超链接连接各个功能页面上9、对各个功能页面中的页面内容(包括表单)进行设计,并且进一步细化!10、系统首页面index.jsp页面的代码示例<%@ page contentType="text/html;charset=gb2312" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"<HEAD><title>蓝梦网上商城</title><html:base/><META http-equiv=Content-Type content="text/html; charset=gb2312"><LINK href="images/style.css" type="text/css" rel="stylesheet"><SCRIPT language="javascript" type="text/javascript">if (top.location != self.location)top.location=self.location; //避免别人把网页放在框架中</SCRIPT></HEAD><FRAMESET border=0 frameSpacing=0 frameBorder=NO cols=*><FRAMESET border=0 name=fst frameSpacing=0 frameBorder=NO cols=140,9,*> <FRAME name=leftFrame src="images/leftMenu.htm" noResize><FRAME name=midFrame src="images/switch.htm" frameBorder=0 scrolling=no><FRAME name=mainFrame src="images/defaultContent.jsp"></FRAMESET><NOFRAMES><body><font color=red style=font-size:14px><b>你的浏览器不支持帧页面,请升级!</b></font></body></NOFRAMES></FRAMESET></HTML>11、用户进行系统登录的userLogin.jsp页面代码示例<%@ page contentType="text/html;charset=gb2312"errorPage="/dealError/showSystemError.jsp"%><%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %><%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><!-- InstanceBegin template="/Templates/pageTemplate.dwt" codeOutsideHTMLIsLocked="false" --><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><html:base/><SCRIPT language="javascript" type="text/javascript" src="../javascript/commonCode.js"></SCRIPT><!-- InstanceBeginEditable name="doctitle" --><script language="javascript" type="text/javascript" src="../javascript/commonCode.js"></script><title>蓝梦网上商城</title><!-- InstanceEndEditable --><!-- InstanceBeginEditable name="head" --><!-- InstanceEndEditable --><link href="../css/pageStyle.css" rel="stylesheet" type="text/css" /></head><body background="../webImages/contentbg.jpg" ><TABLE width="100%" border=0 align="center" cellPadding=0 cellSpacing=0 class="smalltxt"><TR><TD ><TABLE width="100%" border=0 align="center" cellPadding=0 cellSpacing=0> <TR ><TD width="77"><div onclick="history.back()"><div align="center" style="cursor:hand">《--后退</div></div></TD><TD width="77"><div onclick="history.forward()"><div align="center" style="cursor:hand">向前--》</div></div></TD><TD width="835" ><a href="../images/defaultContent.jsp">首页</a>|<a href="../userACounter/showCounterInfo.jsp">我的帐户</a> |<a href="../buyCartManage/showCartInfo.jsp"><IMG height=16 alt="Cart"src="../webImages/buycart.gif" width=19 border=0>购物车</a> |<a href="../shopGuide/showHelpInfo.htm">帮助中心</a> |<a href="../shopGuide/stepBystep.htm"> 新手上路</a>|<a href="../aboutThis/privateText.htm"> 隐私声明</a>|<a name="home" onclick="defaul_home();" href="#" >设为首页</a>|<a href="#" onclick="javascript:window.external.addFavorite('/','蓝梦网上商城');return false;" >收藏本站</a>|<a href="../aboutThis/aboutTheSite.htm"> 关于本站</a></TD></TR></TABLE></TD></TR><TR><TD ><FORM name="searchBrick"action="/webshop/searchGoodsURI.do?actionType=doSearchBrick" method="post"><TABLE width="100%" border=0 align=center cellPadding=0 cellSpacing=0><TR ><TD width=186> <span class="smalltxt">商品搜索</span><SELECT name="searchType"onchange="changeSearchKind(options[selectedIndex].value);" ><OPTION value="0" selected>所有类别</OPTION><OPTION value=1>图书</OPTION><OPTION value=2>计算机</OPTION><OPTION value=3>通讯设备</OPTION><OPTION value=4>服装</OPTION><OPTION value=5>全文搜索</OPTION><OPTION value=6>高级搜索</OPTION></SELECT></TD><TD width=189><INPUT id="searchWord" size="25" name="searchWord"value="请输入商品的名称"></TD><TD width="39" align=right><div align="left"><INPUT name="Go" type="image" alt="查找"src="../webImages/az-go-orange-trans.gif"></div></TD><TD width="575" ><DIV id="searchKindArea"></DIV></TD></TR></TABLE></FORM></TD></TR><tr ><td><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"codebase=/pub/shockwave/cabs/flash/swflash.cab#version =6,0,29,0 width="100%" height="2"><param name="movie" value="../flash/lightLine.swf" /><param name="quality" value="high" /></object></td></tr></TABLE><!-- InstanceBeginEditable name="pageContent" --><html:form action="/userInfoManage.do?actionType=doLogin_GetPassWord" method="post" > <html:hidden property="menuID" value="2"/><table width="426" border="1" align="center" class="smalltxt"><tr><td colspan="2"><div align="center">选择操作方式:<html:radio property="login_GetPassWord_ActionType"onclick="userLogin_showUserLoginInput(this.value)" value="1">登陆系统</html:radio> <html:radio property="login_GetPassWord_ActionType"onclick="userLogin_showGetUserPassWordInput(this.value)" value="2">找回密码</html:radio></div></td></tr><tr><td colspan="2" align="center">输入右面的认证码:<html:text property="verifyCodeDigit" onblur="checkIfDigit(this.value);"/><img border="0" src="verifyCodeImage.jsp" alt="verifyCodeImage" /></td></tr><tr><td colspan="2" align="center">用户类型:<html:select property="type_User_Admin"><html:option value="1">前台用户</html:option><html:option value="2">后台管理员</html:option></html:select></td></tr><tr><td colspan="2" align="center">您的名称:<html:text property="userName" /></td></tr><tr style="display:inline" id="userLoginTableRow"><td colspan="2"><table width="100%" border="0"><tr><td><div align="center">您的密码:<html:password property="userPassWord" /></div></td></tr></table></tr><tr style="display:none" id="getUserPassWordTableRow"><td colspan="2"><table width="100%" border="0"><tr><td><div align="center">取回密码的问题:<html:text property="passWordAsk" /></div></td></tr><tr><td><div align="center">取回密码问题的答案:<html:password property="passWordAnswer" /></div></td></tr></table></td></tr><tr id="showErrorInfo" style="background-color:#FF9900;display:none"><td colspan="2" align="center" id="errorInfoPosition"></td></tr><tr><td colspan="2" align="center"><html:submit value="提交" property="submitButton" disabled="" onclick="this.value='正在提交请求,请稍候'"></html:submit> <html:reset value="取消" /></td></tr></html:form><!-- InstanceEndEditable --> </body><!-- InstanceEnd --></html>。
J2EE 课程设计实训项目——《蓝梦网上商城》——对系统中的用户信息业务处理功能组件进行单元测试
J2EE 课程设计实训项目——《蓝梦网上商城》——对系统中的用户信息业务处理功能组件进行单元测试1.1.1对系统中的用户信息业务处理功能组件进行单元测试1、在测试项目中引入与Spring相关的*.jar包文件(1)引入与Spring相关的*.jar包文件(log4j-1.2.14.jar、spring.jar和commons-logging.jar)(2)实现的过程如下(3)注意:log4j-1.2.14.jar和commons-logging.jar已经在前面添加过,在此可以不再需要重复。
2、添加log4j的属性配置文件(1)新建log4j.properties文件(2)log4j.properties文件的内容如下# For JBoss: Avoid to setup Log4J outside $JBOSS_HOME/server/default/deploy/log4j.xml! # For all other servers: Comment out the Log4J listener in web.xml to activate Log4J.log4j.rootLogger=INFO, stdout, logfilelog4j.appender.stdout=org.apache.log4j.ConsoleAppenderyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d %p [%c] - <%m>%nlog4j.appender.logfile=org.apache.log4j.RollingFileAppenderlog4j.appender.logfile.File=mylog.loglog4j.appender.logfile.MaxFileSize=512KB# Keep three backup files.log4j.appender.logfile.MaxBackupIndex=3# Pattern to output: date priority [category] - messageyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d %p [%c] - %m%n3、针对UserInfoManageImple类提供对应的测试用例类(1)添加测试用例类(2)设置该测试用例的各个名称类名称为TestUserInfoManageImple,包名称为com.px1987.webshop.testbusiness,基类为junit.framework.TestCase,被测试的类选择为erInfoManageImple(3)选择我们业务组件类中的各个被测试方法(4)将产生出下面的状态4、编程该TestUserInfoManageImple类(1)引入与ApplicationContext相关的各个包import org.springframework.context.ApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;(2)在setUp方法中获得我们的被测试类的对象protected void setUp() throws Exception{super.setUp();//根据实际来决定String springXMLPath="E:/NetShopProject/SpringBusiness/webShopUserInfoIoC.xml";ApplicationContext applicationContext =new FileSystemXmlApplicationContext(springXMLPath);userInfoManageImple=(UserInfoManageInterface) applicationContext.getBean("userInfoManageImple");}(3)编程各个测试方法---如下面的testDoUserLogin方法public void testDoUserLogin() throws Exception{String userName="张三"; //根据实际数据库表中的数据来决定String userPassWord="1234"; //根据实际数据库表中的数据来决定int type_User_Admin=1; //表示现在是前台用户在登录UserInfoVO oneLoginUserInfo=new UserInfoVO();oneLoginUserInfo.setUserName(userName);oneLoginUserInfo.setUserPassWord(userPassWord);oneLoginUserInfo.setType_User_Admin(type_User_Admin);boolean actualReturn=userInfoManageImple.doUserLogin(oneLoginUserInfo);this.assertTrue(actualReturn);}(4)最后的代码如下package com.px1987.webshop.testbusiness;import java.util.*;import junit.framework.*;import org.springframework.context.ApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;import er.*;import com.px1987.webshop.business.vobject.*;import com.px1987.webshop.service.*;public class TestUserInfoManageImple extends TestCase{UserInfoManageInterface userInfoManageImple=null;public TestUserInfoManageImple(String arg0) {super(arg0);}protected void setUp() throws Exception{super.setUp();//根据实际来决定String springXMLPath="D:/ WebShopProject/WebRoot/WEB-INF/classes/webShopUserInfoIoC.xml";ApplicationContext applicationContext =new FileSystemXmlApplicationContext(springXMLPath);/* 没有应用AOP Throws Advice或者应用了Spring中的“自动代理”功能时* userInfoManageImple=(UserInfoManageInterface)applicationContext.getBean("userInfoManageImple");*//** 下面是应用ProxyFactoryBean来实现AOP Throws Advice时* userInfoManageImple=(UserInfoManageInterface) applicationContext.getBean("userInfoManageImpleProxy");*/userInfoManageImple=(UserInfoManageInterface)applicationContext.getBean("userInfoManageImple");}protected void tearDown() throws Exception {userInfoManageImple=null;super.tearDown();}public void testDoUserLogin() throws ServiceException{String userName="张三"; //根据实际数据库表中的数据来决定String userPassWord="1234"; //根据实际数据库表中的数据来决定int type_User_Admin=1; //表示现在是前台用户在登录UserInfoVO oneLoginUserInfo=new UserInfoVO();oneLoginUserInfo.setUserName(userName);oneLoginUserInfo.setUserPassWord(userPassWord);oneLoginUserInfo.setType_User_Admin(new Integer(type_User_Admin));boolean actualReturn=userInfoManageImple.doUserLogin(oneLoginUserInfo);this.assertTrue(actualReturn);}public void testDoGetOneUserInfo() throws ServiceException{UserInfoBaseVO oneUserInfoBaseVO=null;int type_User_Admin=1;String userName="张三";String userPassWord="1234";oneUserInfoBaseVO=userInfoManageImple.doGetOneUserInfo(userName,userPassWord, type_User_Admin);this.assertNotNull(oneUserInfoBaseVO);String returnUserName=oneUserInfoBaseVO.getUserName();this.assertNotNull(returnUserName);}public void testDoUserRegister() throws ServiceException{UserInfoVO oneRegisterUserInfoVO=new UserInfoVO();oneRegisterUserInfoVO.setUserName("张三");oneRegisterUserInfoVO.setUserPassWord("1234");oneRegisterUserInfoVO.setUserType(new Integer(1));oneRegisterUserInfoVO.setAliaoName("网上张飞");oneRegisterUserInfoVO.setPassWordAsk("Who Are You?");oneRegisterUserInfoVO.setUserImage("zhang.gif");oneRegisterUserInfoVO.setRegisterTime(new Date().toLocaleString());oneRegisterUserInfoVO.setPassWordAnswer("zhang");oneRegisterUserInfoVO.setUserMail("trainict@");oneRegisterUserInfoVO.setUserSex(1);oneRegisterUserInfoVO.setUserBirthDay("2007-01-25");oneRegisterUserInfoVO.setUserComeFrom("北京");oneRegisterUserInfoVO.setUserResume("我是网络飞人");oneRegisterUserInfoVO.addOneContactMethod("userQQCode","QQ1234567890");oneRegisterUserInfoVO.addOneContactMethod("userICQCode","ICQ1234567890");oneRegisterUserInfoVO.addOneContactMethod("userMSNCode","MSN1234567890");oneRegisterUserInfoVO.setUserSign("12345678900");oneRegisterUserInfoVO.setEmailVisible(1);oneRegisterUserInfoVO.setAcceptAdvise(1);//代表前台用户在进行注册oneRegisterUserInfoVO.setType_User_Admin(new Integer(1));boolean actualReturn=userInfoManageImple.doUserRegister(oneRegisterUserInfoVO);this.assertTrue(actualReturn);}public void testDoCheckUserNameExist() throws ServiceException{String userName="张三"; //根据实际选择数据int type_User_Admin=1;boolean actualReturn=userInfoManageImple.doCheckUserNameExist(userName,type_User_Admin);this.assertTrue(actualReturn);}/*public void testDoDeleteOneRegisterUserInfoString() throws ServiceException{ String registerUserID="4028806810723e1a0110723e1f660002"; //根据实际选择数据boolean actualReturn=userInfoManageImple.doDeleteOneRegisterUserInfo(registerUserID);this.assertTrue(actualReturn);}public void testDoDeleteOneRegisterUserInfoUserInfoVO() throws ServiceException{ String registerUserID="40288068107200f101107200f91a0003"; //根据实际选择数据UserInfoVO oneRegisterUserInfoVO=new UserInfoVO();oneRegisterUserInfoVO.setId(registerUserID);boolean actualReturn=userInfoManageImple.doDeleteOneRegisterUserInfo(oneRegisterUserInfoVO);this.assertTrue(actualReturn);}public void testDoDeleteOneAdminUserInfoString() throws ServiceException { String adminUserID="4028806810723e1a0110723e1eca0001"; //根据实际选择数据boolean actualReturn=userInfoManageImple.doDeleteOneAdminUserInfo(adminUserID);this.assertTrue(actualReturn);}public void testDoDeleteOneAdminUserInfoUserInfoVO() throws ServiceException{ String adminUserID="40288068107200f101107200f8eb0002"; //根据实际选择数据UserInfoVO oneAdminUserInfoVO=new UserInfoVO();oneAdminUserInfoVO.setId(adminUserID);boolean actualReturn=userInfoManageImple.doDeleteOneAdminUserInfo(adminUserID);this.assertTrue(actualReturn);}*/public void testDoGetAllAdminUserInfo() throws ServiceException{ArrayList allAdminUserInfos=userInfoManageImple.doGetAllAdminUserInfo();this.assertNotNull(allAdminUserInfos);Iterator allItem=allAdminUserInfos.iterator();while(allItem.hasNext()){UserInfoVO oneAdminUserInfoVO=(UserInfoVO)allItem.next();this.assertNotNull(oneAdminUserInfoVO);String adminUserName=oneAdminUserInfoVO.getUserName();this.assertNotNull(adminUserName);}}public void testDoGetAllRegisterUserInfo() throws ServiceException{ArrayList allRegisterUserInfos=userInfoManageImple.doGetAllRegisterUserInfo();this.assertNotNull(allRegisterUserInfos);Iterator allItem=allRegisterUserInfos.iterator();while(allItem.hasNext()){UserInfoVO oneRegisterUserInfoVO=(UserInfoVO)allItem.next();this.assertNotNull(oneRegisterUserInfoVO);String adminUserName=oneRegisterUserInfoVO.getUserName();this.assertNotNull(adminUserName);}}public void testDoGetAllUserNameInfo() throws ServiceException{String userName="张";String oneUserNameReturned=null;ArrayList allUserNameInfo=userInfoManageImple.doGetAllUserNameInfo(userName);this.assertNotNull(allUserNameInfo);Iterator allItem=allUserNameInfo.iterator();while(allItem.hasNext()){oneUserNameReturned=(String)allItem.next();this.assertNotNull(oneUserNameReturned);}}public void testDoGetOneRegisterUserInfoString() throws ServiceException{ String registerUserID="402880681071d7ed011071d7f24b0002"; //根据实际选择数据UserInfoVO oneRegisterUserInfoVOReturned=null;oneRegisterUserInfoVOReturned=userInfoManageImple.doGetOneRegisterUserInfo(registerUserID);this.assertNotNull(oneRegisterUserInfoVOReturned);String oneUserNameReturned=oneRegisterUserInfoVOReturned.getUserName();this.assertNotNull(oneUserNameReturned);}public void testDoGetOneRegisterUserInfoUserInfoVO() throws ServiceException{ String registerUserID="402880681071d7ed011071d7f24b0002"; //根据实际选择数据UserInfoVO oneRegisterUserInfoVO=new UserInfoVO();oneRegisterUserInfoVO.setId(registerUserID);UserInfoVO oneRegisterUserInfoVOReturned=null;oneRegisterUserInfoVOReturned=userInfoManageImple.doGetOneRegisterUserInfo(oneRegisterUserInfoVO);}public void testDoGetOneAdminUserInfoString() throws ServiceException{ String adminUserID="402880681071d7ed011071d7f20d0001"; //根据实际选择数据UserInfoVO oneAdminUserInfoVO=null;oneAdminUserInfoVO=userInfoManageImple.doGetOneAdminUserInfo(adminUserID);this.assertNotNull(oneAdminUserInfoVO);String oneUserNameReturned=oneAdminUserInfoVO.getUserName();this.assertNotNull(oneUserNameReturned);}public void testDoGetOneAdminUserInfoUserInfoVO() throws ServiceException{ String adminUserID="402880681071d7ed011071d7f20d0001"; //根据实际选择数据UserInfoVO oneAdminUserInfoVO=new UserInfoVO();oneAdminUserInfoVO.setId(adminUserID);UserInfoVO oneAdminUserInfoVOReturned=null;oneAdminUserInfoVOReturned=userInfoManageImple.doGetOneAdminUserInfo(oneAdminUserInfoVO);}public void testDoGetOneRegisterUserPassWord() throws ServiceException{ UserInfoVO oneRegisterUserInfoVO=null;String userName="张三";String passWordAsk="Who Are You?";String passWordAnswer="zhang";oneRegisterUserInfoVO=new UserInfoVO();oneRegisterUserInfoVO.setUserName(userName);oneRegisterUserInfoVO.setPassWordAsk(passWordAsk);oneRegisterUserInfoVO.setPassWordAnswer(passWordAnswer);String userPassWordReturned=userInfoManageImple.doGetOneRegisterUserPassWord(oneRegisterUserInfoVO);this.assertNotNull(userPassWordReturned);}public void testDoGetOneAdminUserPassWord() throws ServiceException{ UserInfoVO oneAdminUserInfoVO=null;String userName="张三";String passWordAsk="Who Are You?";String passWordAnswer="zhang";oneAdminUserInfoVO=new UserInfoVO();oneAdminUserInfoVO.setUserName(userName);oneAdminUserInfoVO.setPassWordAsk(passWordAsk);oneAdminUserInfoVO.setPassWordAnswer(passWordAnswer);String userPassWordReturned=userInfoManageImple.doGetOneAdminUserPassWord(oneAdminUserInfoVO);this.assertNotNull(userPassWordReturned);}public void testDoGetSomeAdminUserInfo() throws ServiceException{}public void testDoGetSomeRegisterUserInfo() throws ServiceException{}public void testDoUpdateOneUserInfo() throws ServiceException{UserInfoVO oneRegisterUserInfoVO=new UserInfoVO();//应该根据数据库表中的实际的数据值来决定String registerUserId="402880681071d7ed011071d7f24b0002";//设置需要修改的某个用户的ID以定位其记录oneRegisterUserInfoVO.setId(registerUserId);oneRegisterUserInfoVO.setUserName("张三");//本测试的数据只是对原来的数据改变了此值oneRegisterUserInfoVO.setUserPassWord("12345678"); oneRegisterUserInfoVO.setUserType(new Integer(1)); oneRegisterUserInfoVO.setAliaoName("网上张飞"); oneRegisterUserInfoVO.setPassWordAsk("Who Are You?"); oneRegisterUserInfoVO.setUserImage("zhang.gif"); oneRegisterUserInfoVO.setRegisterTime(new Date().toLocaleString()); oneRegisterUserInfoVO.setPassWordAnswer("zhang"); oneRegisterUserInfoVO.setUserMail("trainict@"); oneRegisterUserInfoVO.setUserSex(1);oneRegisterUserInfoVO.setUserBirthDay("2007-01-25"); oneRegisterUserInfoVO.setUserComeFrom("北京"); oneRegisterUserInfoVO.setUserResume("我是网络飞人"); oneRegisterUserInfoVO.setUserSign("12345678900"); oneRegisterUserInfoVO.setEmailVisible(1);oneRegisterUserInfoVO.setAcceptAdvise(1);Map newContactMethod = new HashMap(); //可以在此改变用户的联系方式newContactMethod.put("userQQCode","QQ1234567890"); newContactMethod.put("userICQCode","ICQ1234567890"); newContactMethod.put("userMSNCode","MSN1234567890"); oneRegisterUserInfoVO.setContactMethod(newContactMethod);int type_User_Admin=1;oneRegisterUserInfoVO.setType_User_Admin(type_User_Admin);boolean actualReturn=userInfoManageImple.doUpdateOneUserInfo(oneRegisterUserInfoVO);this.assertTrue(actualReturn);}}5、执行该测试用例(1)右击我们的的测试用例类,并选择运行方式为JUnit测试用例。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
J2EE 课程设计实训项目——《蓝梦网上商城》——应用Spring JavaMail 邮件抽象实现项目中的邮件自动发送功能1.1.1应用Spring JavaMail邮件抽象实现项目中的邮件自动发送功能1、Spring JavaMail概述E-mail是一个优秀的通知系统,也充当一个基本的工作流系统的角色。
Spring使发送邮件变得非常容易,它隐藏底层邮件系统的复杂性。
Spring邮件支持的主要接口叫做MailSender。
它还提供了一个SimpleMailMessage类来封装一条消息的公共属性(from, to, subject, message)。
如果我们想发送带附件的邮件,则可以用MimeMessagePreparator来创建和发送消息。
下面给出一个在本项目中的实现示例。
2、修改webShopUserInfoIoC.xml文件以添加与Spring邮件抽象实现相关的组件(1)定义一个org.springframework.mail.javamail.JavaMailSenderImpl组件对象<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"><property name="host" value=""/><property name="username" value="trainict"/><property name="password" value="6407"/></bean>(2)并将该组件对象注入到我们的Spring事件广播的响应的组件SpringActionEventResponse类中<bean id="springActionEventResponse" class="com.px1987.webshop.business.springevent.SpringActionEventResponse"> <property name="mailSender"><ref bean="mailSender"/></property></bean>(3)到目前为止的配置示例如下<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "/dtd/spring-beans-2.0.dtd"><beans><bean id="userInfoCRUDImple" class="erInfoCRUDImple" scope="prototype"> </bean><bean id="orderInfoCRUDImple" class="com.px1987.webshop.dao.crud.OrderInfoCRUDImple" scope="prototype"> </bean><bean id="goodsInfoCRUDImple" class="com.px1987.webshop.dao.crud.GoodsInfoCRUDImple" scope="prototype"> </bean><bean id="userInfoDAOServiceImple" class="erInfoDAOServiceImple" scope="prototype"> <property name="userInfoCRUDImple"><ref bean="userInfoCRUDImple"/></property><property name="orderInfoCRUDImple"><ref bean="orderInfoCRUDImple"/></property><property name="goodsInfoCRUDImple"><ref bean="goodsInfoCRUDImple"/></property></bean><bean id="orderInfoDAOServiceImple" class="com.px1987.webshop.service.OrderInfoDAOServiceImple" scope="prototype"> <property name="userInfoCRUDImple"><ref bean="userInfoCRUDImple"/></property><property name="orderInfoCRUDImple"><ref bean="orderInfoCRUDImple"/></property><property name="goodsInfoCRUDImple"><ref bean="goodsInfoCRUDImple"/></property></bean><bean id="goodsInfoDAOServiceImple" class="com.px1987.webshop.service.GoodsInfoDAOServiceImple" scope="prototype"> <property name="userInfoCRUDImple"><ref bean="userInfoCRUDImple"/></property><property name="orderInfoCRUDImple"><ref bean="orderInfoCRUDImple"/></property><property name="goodsInfoCRUDImple"><ref bean="goodsInfoCRUDImple"/></property></bean><bean id="userInfoManageImple" class="erInfoManageImple"scope="prototype"><property name="userInfoDAOServiceImple"><ref bean="userInfoDAOServiceImple"/></property><property name="springActionEventResponse"><ref bean="springActionEventResponse"/></property></bean><bean id="springActionEventResponse"class="com.px1987.webshop.business.springevent.SpringActionEventResponse"> <property name="mailSender"><ref bean="mailSender"/></property></bean><bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"><property name="host" value=""/><property name="username" value="trainict"/><property name="password" value="12345678"/></bean></beans>3、在我们的Spring事件广播的响应的组件SpringActionEventResponse类中增加一个名称为mailSender的JavaMailSenderImpl成员属性对象,并提供set方法import org.springframework.mail.javamail.JavaMailSender;…private JavaMailSender mailSender=null;public void setMailSender(JavaMailSender mailSender){this.mailSender = mailSender;}4、编程我们的邮件发送功能代码package com.px1987.webshop.business.springevent;import org.springframework.context.ApplicationListener;import org.springframework.context.ApplicationEvent;import org.springframework.mail.javamail.JavaMailSender;import org.springframework.mail.MailException;import org.springframework.mail.javamail.MimeMessagePreparator;import javax.mail.internet.MimeMessage;import javax.mail.MessagingException;import javax.mail.internet.InternetAddress;import javax.mail.Message;public class SpringActionEventResponse implements ApplicationListener { private JavaMailSender mailSender=null;public void setMailSender(JavaMailSender mailSender) {this.mailSender = mailSender;}String userMail=null;String userName=null;String userPassWord=null;public SpringActionEventResponse() {}public void onApplicationEvent(ApplicationEvent applicationEvent) {//识别事件源对象是否为指定的事件类型if (applicationEvent instanceof SpringActionEvent) {userMail=((SpringActionEvent)applicationEvent).getOneUserInfo().getUserMail();userName=((SpringActionEvent)applicationEvent).getOneUserInfo().getUserName();userPassWord=((SpringActionEvent)applicationEvent).getOneUserInfo().getUserPassWord();MimeMessagePreparator preparator = new MimeMessagePreparator() { public void prepare(MimeMessage mimeMessage) throws MessagingException{mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(userMail));mimeMessage.setFrom(new InternetAddress("trainict@"));mimeMessage.setText("您在本系统中的注册用户名称为:"+userName+ "密码为:"+userPassWord);}};try{mailSender.send(preparator);}catch (MailException ex) {System.err.println("邮件发送过程中出现了错误:"+ex.getMessage());return;}System.out.println("我们已经将您的ID及密码等信息发送到您的邮箱"+userMail);}}}。