副标题#e#
一.媒介:
连年来,跟着互联网业务的迅猛成长,企业间、企业与消费者间实现电子商 务已经成为大概,成立企业级的电子商务平台不只可以拓宽企业的营销渠道,而 且对晋升企业品牌形象等方面有重要的计谋意义。
本文将以今朝海内最大处事生意业务平台如易网(http://www.routease.com/) 为例,来深入分解一个电子商务生意业务平台搭建的全进程。
《筹备篇》
一个项目标实施首先确定项目方针、项目需求与开拓情况(为利便领略,将 如易网作为项目来描写)。本篇主要接头这三个方面:
一.实施方针
如易网的开办方针:建树为海内最大的处事类生意业务平台和在线事情平台。由 于本篇以技能讲授为主,如要相识更多的配景资料,可以会见: http://www.routease.com/AboutUs.htm 。
二.实施需求
方针抉择需求,定制清晰明晰的项目需求是整个项目成败的要害。可以利用 Rose东西来成立项目工具实体图,这里就不再赘述了,以下就几个重要工具做一 些描写:(可以比较http://www.routease.com/来欣赏下面内容):
TotradeEntity:生意业务实体工具。该工具为焦点工具,标识生意业务的处事工具。 好比翻译处事,开锁处事等。
ServiceRequirement:处事需求工具。该工具标识用户需求。好比需要电脑 维修的信息等。
SHOP:店肆工具。该工具为中小企业可能小我私家开的网店,一个店肆对应多个交 易实体。
USER:用户工具。该工具标识从事网站的正当注册用户,它保存用户信息。
Account:帐户工具。该工具标识用户的帐户信息。
Message:动静工具。该工具标识用户之间交换的信息。
Credit:诺言工具。该工具标识用户生意业务的诺言品级信息,为生意业务提供有力 参考。
#p#副标题#e#
三.开拓/运行情况
基于以上需求阐明,本站回收J2EE/Structs应用架构,处事器主机回收 WIN2003 SERVER+APACHE2.0.54+TOMCAT 5.5.4的系统情况,开拓情况: Eclipse+JDK1.5,数据库DAO回收的著名的ORM东西TopLink9.0.4.5。以下对相应 开拓技能及其东西做一个扼要先容:
1.Structs技能
Web应用的开拓经验了一个由P2P(Page to Page)到MVC(model view controller)的成长进程。早期的Web应用对用户请求的处理惩罚和响应均是在页面上 完成的,如图1-1所示,即所的JSP1.0。这样的Web架构最大的长处就是开拓效率 较高,然后近几年跟着互联网的迅猛成长,网站成果日益加强,而这种P2P的网 站架构(因为其业务法则代码与页面代码混为一团,倒霉于维护)已经不再适应 大局限应用的成长要求,取而代之的是基于MVC的Web架构。MVC的焦点思想是将 应用分为模子、视图和节制器三部门。模子是指应用措施的数据,以及对这些数 据的操纵;视图是指用户界面;controller认真用户界面和措施数据之间的同步 ,也就是完成两个偏向的行动:a.在按照用户界面(view)的操纵完成对措施数据 (model)的更新,b.将措施数据(model)的改变实时回响到用户界面(view)上 。通过MVC的Web架构,可以弱化各个部门的耦合干系,并将业务逻辑处理惩罚与页面 以及数据分分开来,这样当个中一个模块的代码产生改变时,并不影响其他模块 的正常运行,所以基于MVC的Web架构更适应于大局限软件应用开拓的潮水。
图1
图2
今朝基于MVC的开拓框架主要有Structs、Spring等。本站选用个中的Structs 作为开拓框架,回收Structs应用框架开拓应用措施,将开拓人员从繁琐的代码 体例中解放出来,取而代之的是设置一些含有对应干系的XML文件,这样当应用 情况产生变革时,不需从头编译措施即可运行,而且使得应用越发机动、高效, 并且重费用高。
从开拓角度,Struts主要有如下的成果:
·包括一个controller servlet,能将用户的请求发送到相应的Action工具 。通过Web.xml文件来设置其相关参数。
·tag库,而且在controller servlet中提供关联支持,辅佐开拓人员建设交 互式表单应用。
·通过设置Structs-config.xml文件,将Action工具与用户请求以及请求结 果页面关联起来。
如需更多相识Structs的相关信息,请其官方网站: http://jakarta.apache.org/struts
2.TopLink技能
已往,对模子数据的存取会见往往是直接是应用通过ODBC这样的数据库接口 会见数据库。可是这样处理惩罚并不切合OOP的精力,并且应用开拓人员必需熟悉后 台数据库的模子结构,这就加大开拓的难度。为此,ORM(Object Relational Mapping)技能应运而生.ORM技能实际是一个工具耐久化的框架,其焦点思想是 成立了Java工具与靠山数据库之间的映射干系。这样对这些Java工具的会见实际 就是对靠山数据库的会见,从而屏蔽了数据库会见的细节,开拓人员甚至可以在 不相识靠山数据库的环境下举办开拓事情。另外,Toplink在数据缓存优化上也 有很好的表示。本项目回收著名的ORM东西Toplink举办开拓。
《实施篇》
本篇主要先容该平台的详细实现进程。按照软件工程的相关理论,团结笔者 多年的开拓履历,网站开拓一般尊循以下六步调:
1.收集、整理网站需求。
2.按照网站需求,构思网页的交互情景(即USE CASE),并设计出网站的原 形(Prototype)。
3.设计出实例化工具以及靠山数据库布局。
4.回收ORM东西,成立实例化工具与靠山数据库之间的映射干系。
5.按照网站交互需求,定制靠山Action,以处理惩罚用户行动。
6.修改网站原形(Prototype)为动态页面(JSP文件),将Action处理惩罚功效 嵌入到动态页面中返回给客户端。
在这六个步调中,第一步实际已经在《筹备篇》里已经给出了,下面重点讲 解后头几个步调。
1.网站原形(Prototype)
#p#分页标题#e#
网站原形是对一个网站成果的页面级描写,即看到网站原形就比如看到一个 真实的网站一样,只是网站原形并没有嵌入动态代码,并且页面之间也缺乏关联 罢了。
网站原形的开拓为纯静态页面的开拓,建造网站原形的要害在于将网站成果 需求转化为人机界面。
如易网的网站原形建造下载地点: http://www.routease.com/download/ruyinew924.rar
2.OOP设计与靠山数据库设计
借助强大的ORM开拓东西,可以将OOP与数据库的设计同时举办(即可以同时 实施上面步调的3,4步),这也是ORM东西最大特点。本项目回收Oracle公司的 Toplink作为ORM开拓东西。以下扼要先容Toplink开拓进程。
1) 打开Toplink的Mapping Workbench组件,然后新建一个Mapping 工程。
2) 设置工程的属性,即在"选项"面板上配置工程路径以及Java工具源代码 的路径。
3) 设置数据库登岸参数,包罗应用会见数据库的URL、用户名、暗码等。
完成以上三步,就可以按照应用的需求来开拓Java类。在Mapping Workbench 里新建一个描写符(实际就是有一个Java类),按照需求来添加属性,并自动生 成Set/Get要领。一旦完成Java类的开拓后,选择"自动映射到数据库"的选项, 即可实现数据库表的自动建设。(Toplink的最大优势就是在定制好Java类之后 可以自动生成数据库的表布局)。
鉴于海内Toplink方面的资料较少,这里先容一下Toplink生成的工程文件 RouteaseMappingProject,该工程文件在web处事器启动的时候装载,可以领略为 客户措施对数据库会见的接口措施,他有三类要领:
·结构函数
主要是挪用oracle.toplink.sessions.Project的addDescriptor要领,其作 用是将数据库和Java工具之间的映射干系插手到Project 中。代码示范如下:
public RouteaseMappingProject() {
addDescriptor(buildAccountDescriptor());
addDescriptor(buildPhoneDescriptor());
…….
}
·applyLogin要领
它处理惩罚客户措施登岸数据,并设置一些存取数据库的参数,好比缓冲池等。 代码示范为:
public void applyLogin() {
//设置数据库会见参数
DatabaseLogin login = new DatabaseLogin();
login.usePlatform(new oracle.toplink.oraclespecific.Oracle9Platform());
login.setDriverClassName("oracle.jdbc.driver.OracleDriver"); login.setConnectionString(ApplicationConfiguration.get (ConfigurationConstants.DB_CON_STR)); login.setUserName (ApplicationConfiguration.get(ConfigurationConstants.DB_USER)); login.setPassword(ApplicationConfiguration.get (ConfigurationConstants.DB_ENCRYPTED_PASSWORD));
// 配置数据库参数
login.setUsesNativeSequencing(true);
login.setSequencePreallocationSize(1);
login.setShouldBindAllParameters(false);
login.setShouldCacheAllStatements(false);
login.setUsesByteArrayBinding(true);
login.setUsesStringBinding(false);
if (login.shouldUseByteArrayBinding()) { // Can only be used with binding.
login.setUsesStreamsForBinding(false);
}
login.setShouldForceFieldNamesToUpperCase(false);
login.setShouldOptimizeDataConversion(true);
login.setShouldTrimStrings(true);
login.setUsesBatchWriting(false);
if (login.shouldUseBatchWriting()) { // Can only be used with batch writing.
login.setUsesJDBCBatchWriting(true);
}
login.setUsesExternalConnectionPooling(false);
login.setUsesExternalTransactionController(false);
setLogin(login);
}
成立映射干系
Toplink通过雷同于builXXXDescriptor要领来成立Java工具与数据库表字段 之间的对应干系,示范代码如下:
#p#分页标题#e#
public Descriptor buildAccountDescriptor() {
Descriptor descriptor = new Descriptor();
descriptor.descriptorIsAggregate();
descriptor.setJavaClass (com.routease.db.vo.user.Account.class);
descriptor.setAlias("Account");
// Mappings.
//成立Account 工具的deposit属性与数据库表的DEPOSIT字段的对应干系
DirectToFieldMapping depositMapping = new DirectToFieldMapping ();
depositMapping.setAttributeName("deposit");
depositMapping.setFieldName("DEPOSIT");
descriptor.addMapping(depositMapping);
…
return descriptor;
}
3.定制靠山Action
按照MVC的精力,View和Model设计好之后应该是将开拓重点转移到节制器的 开拓上。节制器是按照用户行为举办响应的处理惩罚模块,好比用户通过首页的搜索 条对处事信息举办检索,这时,web处事中的SearchToTradeEntityAction(对应 SearchToTradeEntityAction.java文件)会对用户这一行动举办处理惩罚。以下对这 一Action举办具体阐明:
package com.routease.action.totradeentity;
import java.util.Collection;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.routease.action.PagingAction;
import com.routease.action.helper.UserHelper;
import com.routease.db.dao.DataSource;
import com.routease.db.dao.totradeentity.SearchingCriteria;
import com.routease.db.dao.totradeentity.ToTradeEntityDAO;
import com.routease.db.util.Constants;
import com.routease.db.util.Page;
public class SearchToTradeEntityAction extends PagingAction {
public SearchToTradeEntityAction()
{
super();
}
// executeWithDataSource要领为该Action默认执行的要领
public ActionForward executeWithDataSource(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response, DataSource ds) throws Exception {
//首先接管用户提交的表单数据
String objective = (String) PropertyUtils.getSimpleProperty (actionForm, "objective");
String keyWords = (String) PropertyUtils.getSimpleProperty (actionForm, "keyWords");
String keyWordsRange = (String) PropertyUtils.getSimpleProperty(actionForm, "keyWordsRange");
if (StringUtils.isEmpty(keyWordsRange)) {
keyWordsRange = SearchingCriteria.KEY_WORDS_RANGE_NAME;
}
String industryLevel1 = (String) PropertyUtils.getSimpleProperty(actionForm, "industryLevel1");
String industryLevel2 = (String) PropertyUtils.getSimpleProperty(actionForm, "industryLevel2");
String startingPrice = (String) PropertyUtils.getSimpleProperty(actionForm, "startingPrice");
String endingPrice = (String) PropertyUtils.getSimpleProperty (actionForm, "endingPrice");
String city = (String) PropertyUtils.getSimpleProperty (actionForm, "city");
String province = (String) PropertyUtils.getSimpleProperty (actionForm, "province");
String startNoStr = (String) PropertyUtils.getSimpleProperty (actionForm, "startNumber");
String lengthStr = (String) PropertyUtils.getSimpleProperty (actionForm, "length");
if (StringUtils.isEmpty(startNoStr)) {
startNoStr = "1";
}
//按照用户提交的数据,建设查询表达式工具SC
int startNumber = Integer.parseInt(startNoStr);
int length = UserHelper.getPagingLength(ds, request);
ToTradeEntityDAO serviceDAO = new ToTradeEntityDAO(ds);
SearchingCriteria sc = new SearchingCriteria();
sc.setCity(city);
sc.setProvince(province);
sc.setEndingPrice(endingPrice);
sc.setIndustryLevel1(industryLevel1);
sc.setIndustryLevel2(industryLevel2);
sc.setKeyWords(keyWords);
sc.setKeyWordsRange(keyWordsRange);
sc.setObjective(objective);
sc.setStartingPrice(startingPrice);
if (Constants.IS_TEST) {
System.out.println("start of page:" + startNumber);
}
//提交查询工具SC,并得到查询功效集,将其功效集放入Request工具中 ,便于返回
Page result = serviceDAO.searchToTradeEntities(sc, startNumber, length);
Collection industries = serviceDAO.findIndustryDistribution (sc);
result.setSizePerPage(length);
request.setAttribute(Constants.TO_TRADE_ENTITY, result);
request.setAttribute("MY_INDUSTRIES",industries);
request.setAttribute("MY_PAGE", result);
//业务逻辑处理惩罚完毕之后,返回乐成页面
return actionMapping.findForward("SUCCESS_PAGE");
}
}
SearchToTradeEntityAction是一个典范的Action,由前面注解不丢脸出,一 般Action分为三部门:
a. 接管用户表单数据
b. 处理惩罚用户表单数据
c. 返回处理惩罚功效及页面
4.修改页面为JSP文件
#p#分页标题#e#
每每涉及到与用户状态相关的页面均应改革为动态页面(JSP文件),改革是 在前面静态文件的基本长举办的,用处事器端返回的数据(存放在Request工具 里)替换静态文本,由于这部门相对技能性不强,所以不再具体赘述了。
通过前面四部门的先容,根基概述了如易网技能实施的主要进程,在下面的 一章里先容网站技能中的几个重要能力。
《完结篇》
本篇主要先容网站实施进程中的几个重要能力和思路,最后还将先容网站维 护方面的内容。
一. 加速网站速度
只管以静态html文件为主,由于静态文件不需要WEB处事器理会而直接返回给 客户端,所以速度更快。
对网站及时性不强的动态文件可以回收靠山按期刷新的机制来转化为静态文 件可能js文件,如易网首页中的"推荐处事"栏目实际就是回收这种机制,可是对 及时性要求较强的生意业务环节是不适适用这种方法的。
别的一种加速网站速度的要领就是将频繁会见数据库的信息放在内存中,在 web处事器启动的时候加载进来,这种觉得空间换时间的思路也值得警惕。
二.处事器监测打点流程
一般企业级处事器都是回收独立处事器,需要专人维护,可是这样本钱较高 ,有须要开拓一套靠山监控措施来对系统资源,数据/措施备份做监测,用技能 手段来低落本钱。
如易网靠山监控措施实现思路是:分两个线程,一个历程监测处事器的内存 、磁盘资源以及数据库、Web处事等相关应用的状态,一旦发明有异常,将以 Email或短信的形式通知系统打点员;别的一个历程主要对数据举办周期性的备 份,并将备份通过ftp上传至指定备用处事器。
本系统打点措施在网站运行期间起到重要的安详保障浸染,并且也根基不需 要人工过问,淘汰了人力本钱,值得中小企业警惕。
三.自助营销平台
对企业电子商务平台,营销尤为重要。通过差异路径收集营销数据库,并定 期给用户发送企业产物信息,这一切进程回收措施的方法实现,利便,省事。
最后,扼要先容一下网站维护的事宜。网站一旦运营起来,必需担保其7*24 小时的全天候正常运行。所以,网站后期的维护极为重要。按照笔者履历,主要 需要做好以下几个方面:
1.按期做好数据备份和措施备份。
2.做好网站安详防护事情,对重要文件和目次配置会见权限,架设防火墙, 封锁不消的端口。按期变动处事器的暗码,防备黑客入侵。
3.任何措施级的修改必需颠末测试情况的验证之后才气宣布到出产情况,要 有套严格的宣布流程。
做好以上三个方面,网站的正常运行根基可以担保。
竣事语:
本文重点先容了网站实施进程中的技能框架和实现要领,并团结实例阐明白 个中运用到的相关技能。实践证明,这套思路成立起来的网站架构不变高效,具 有很高的应用代价。