|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
他们对jsp,servlet,javabean进行封装就是为了展示他们的某个思想,与java的开发并没有必然的关系,也不见得在所以情况下,别人使用起来会简单。j2ee|电子商务 择要:本文以实例来具体剖析使用J2EE手艺架构来搭建企业级电子商务网站的全历程,并对关头部件的完成和相干手艺举行详细分析,同时分离笔者履历,提出良多有代价的思绪和办法。
一.媒介:
最近几年来,跟着互联网营业的迅猛开展,企业间、企业与消耗者间完成电子商务已成为大概,创建企业级的电子商务平台不但能够拓宽企业的营销渠道,并且对提拔企业品牌抽象等方面有主要的计谋意义。
本文将以今朝国际最年夜服务买卖平台如易网(http://www.routease.com/)为例,来深切分析一个电子商务买卖平台搭建的全历程。
《筹办篇》
一个项目标实行起首断定项目方针、项目需求与开辟情况(为便利了解,将如易网作为项目来形貌)。本篇次要会商这三个方面:
一.实行方针
如易网的兴办方针:建立为国际最年夜的服务类买卖平台和在线事情平台。因为本篇以手艺解说为主,如要懂得更多的背景材料,能够会见:http://www.routease.com/AboutUs.htm。
二.实行需求
方针决意需求,定制明晰明白的项目需求是全部项目成败的关头。可使用Rose工具来创建项目对象实体图,这里就不再赘述了,以下就几个主要对象做一些形貌:(能够对比http://www.routease.com/来扫瞄上面内容):
TotradeEntity:买卖实体对象。该对象为中心对象,标识买卖的服务对象。好比翻译服务,开锁服务等。
ServiceRequirement:服务需求对象。该对象标识用户需求。好比必要电脑维修的信息等。
SHOP:商号对象。该对象为中小企业大概团体开的网店,一个商号对应多个买卖实体。
USER:用户对象。该对象标识处置网站的正当注册用户,它保存用户信息。
Account:帐户对象。该对象标识用户的帐户信息。
Message:动静对象。该对象标识用户之间交换的信息。
Credit:信用对象。该对象标识用户买卖的信用品级信息,为买卖供应无力参考。
三.开辟/运转情况
基于以上需求剖析,本站接纳J2EE/Structs使用架构,服务器主机接纳WIN2003SERVER+APACHE2.0.54+TOMCAT5.5.4的体系情况,开辟情况:Eclipse+JDK1.5,数据库DAO接纳的出名的ORM工具TopLink9.0.4.5。以下对响应开辟手艺及其工具做一个扼要先容:
1.Structs手艺
Web使用的开辟履历了一个由P2P(PagetoPage)到MVC(modelviewcontroller)的开展历程。初期的Web使用对用户哀求的处置和呼应均是在页面上完成的,如-1所示,即所的JSP1.0。如许的Web架构最年夜的优点就是开辟效力较高,然后近几年跟着互联网的迅猛开展,网站功效日趋加强,而这类P2P的网站架构(由于其营业划定规矩代码与页面代码混为一团,倒霉于保护)已不再顺应年夜范围使用的开展请求,取而代之的是基于MVC的Web架构。MVC的中心头脑是将使用分为模子、视图和把持器三部分。模子是指使用程序的数据,和对这些数据的操纵;视图是指用户界面;controller卖力用户界面和程序数据之间的同步,也就是完成两个偏向的举措:a.在依据用户界面(view)的操纵完成对程序数据(model)的更新,b.将程序数据(model)的改动实时反响到用户界面(view)上。经由过程MVC的Web架构,能够弱化各个部分的耦合干系,并将营业逻辑处置与页面和数据分别开来,如许当个中一个模块的代码产生改动时,其实不影响其他模块的一般运转,以是基于MVC的Web架构更顺应于年夜范围软件使用开辟的潮水。
今朝基于MVC的开辟框架次要有Structs、Spring等。本站选用个中的Structs作为开辟框架,接纳Structs使用框架开辟使用程序,将开辟职员从烦琐的代码体例中束缚出来,取而代之的是设置一些含有对应干系的XML文件,如许当使用情况产生变更时,不需从头编译程序便可运转,而且使得使用加倍天真、高效,并且重费用高。
从开辟角度,Struts次要有以下的功效:
・包括一个controllerservlet,能将用户的哀求发送到响应的Action对象。经由过程Web.xml文件来设置其相干参数。
・tag库,而且在controllerservlet中供应联系关系撑持,匡助开辟职员创立交互式表单使用。
・经由过程设置Structs-config.xml文件,将Action对象与用户哀求和哀求了局页面联系关系起来。
如需更多懂得Structs的相干信息,请其官方网站:http://jakarta.apache.org/struts
2.TopLink手艺
已往,对模子数据的存取会见常常是间接是使用经由过程ODBC如许的数据库接口会见数据库。可是如许处置其实不切合OOP的精力,并且使用开辟职员必需熟习背景数据库的模子机关,这就加年夜开辟的难度。为此,ORM(ObjectRelationalMapping)手艺应运而生.ORM手艺实践是一个对象耐久化的框架,其中心头脑是创建了Java对象与背景数据库之间的映照干系。如许对这些Java对象的会见实践就是对背景数据库的会见,从而屏障了数据库会见的细节,开辟职员乃至能够在不懂得背景数据库的情形下举行开辟事情。别的,Toplink在数据缓存优化上也有很好的体现。本项目接纳出名的ORM工具Toplink举行开辟。
<P> 《实行篇》
本篇次要先容该平台的详细完成历程。依据软件工程的相干实际,分离笔者多年的开辟履历,网站开辟一样平常尊循以下六步骤:
1.搜集、收拾网站需求。
2.依据网站需求,构思网页的交互情形(即USECASE),并计划出网站的本相(Prototype)。
3.计划出实例化对象和背景数据库布局。
4.接纳ORM工具,创建实例化对象与背景数据库之间的映照干系。
5.依据网站交互需求,定制背景Action,以处置用户举措。
6.修正网站本相(Prototype)为静态页面(JSP文件),将Action处置了局嵌进到静态页面中前往给客户端。
在这六个步骤中,第一步实践已在《筹办篇》里已给出了,上面重点解说前面几个步骤。
1.网站本相(Prototype)
网站本相是对一个网站功效的页面级形貌,即看到网站本相就比如看到一个实在的网站一样,只是网站本相并没有嵌进静态代码,并且页面之间也缺少联系关系罢了。
网站本相的开辟为纯静态页面的开辟,制造网站本相的关头在于将网站功效需求转化为人机界面。
如易网的网站本相制造下载地点:http://www.routease.com/download/ruyinew924.rar
2.OOP计划与背景数据库计划
借助壮大的ORM开辟工具,能够将OOP与数据库的计划同时举行(便可以同时实行下面步骤的3,4步),这也是ORM工具最年夜特性。本项目接纳Oracle公司的Toplink作为ORM开辟工具。以下扼要先容Toplink开辟历程。
1)翻开Toplink的MappingWorkbench组件,然后新建一个Mapping工程。
2)设置工程的属性,即在"选项"面板上设置工程路径和Java对象源代码的路径。
3)设置数据库上岸参数,包含使用会见数据库的URL、用户名、暗码等。
完成以上三步,就能够依据使用的需求来开辟Java类。在MappingWorkbench里新建一个形貌符(实践就是有一个Java类),依据需求来增加属性,并主动天生Set/Get办法。一旦完成Java类的开辟后,选择"主动映照到数据库"的选项,便可完成数据库表的主动创立。(Toplink的最年夜上风就是在定制好Java类以后能够主动天生数据库的表布局)。
鉴于国际Toplink方面的材料较少,这里先容一下Toplink天生的工程文件RouteaseMappingProject,该工程文件在web服务器启动的时分装载,能够了解为客户程序对数据库会见的接口程序,他有三类办法:
・机关函数
次要是挪用oracle.toplink.sessions.Project的addDescriptor办法,其感化是将数据库和Java对象之间的映照干系到场到Project中。代码树模以下:
publicRouteaseMappingProject(){
addDescriptor(buildAccountDescriptor());
addDescriptor(buildPhoneDescriptor());
…….
}
・applyLogin办法
它处置客户程序上岸数据,并设置一些存取数据库的参数,好比缓冲池等。代码树模为:
publicvoidapplyLogin(){
//设置数据库会见参数
DatabaseLoginlogin=newDatabaseLogin();
login.usePlatform(neworacle.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()){//Canonlybeusedwithbinding.
login.setUsesStreamsForBinding(false);
}
login.setShouldForceFieldNamesToUpperCase(false);
login.setShouldOptimizeDataConversion(true);
login.setShouldTrimStrings(true);
login.setUsesBatchWriting(false);
if(login.shouldUseBatchWriting()){//Canonlybeusedwithbatchwriting.
login.setUsesJDBCBatchWriting(true);
}
login.setUsesExternalConnectionPooling(false);
login.setUsesExternalTransactionController(false);
setLogin(login);
}
・创建映照干系
Toplink经由过程相似于builXXXDescriptor办法来创建Java对象与数据库表字段之间的对应干系,树模代码以下:
publicDescriptorbuildAccountDescriptor(){
Descriptordescriptor=newDescriptor();
descriptor.descriptorIsAggregate();
descriptor.setJavaClass(com.routease.db.vo.user.Account.class);
descriptor.setAlias("Account");
//Mappings.
//创建Account对象的deposit属性与数据库表的DEPOSIT字段的对应干系
DirectToFieldMappingdepositMapping=newDirectToFieldMapping();
depositMapping.setAttributeName("deposit");
depositMapping.setFieldName("DEPOSIT");
descriptor.addMapping(depositMapping);
…
returndescriptor;
}
3.定制背景Action
依据MVC的精力,View和Model计划好以后应当是将开辟重点转移到把持器的开辟上。把持器是依据用户举动举行呼应的处置模块,好比用户经由过程首页的搜刮条对服务信息举行检索,这时候,web服务中的SearchToTradeEntityAction(对应SearchToTradeEntityAction.java文件)会对用户这一举措举行处置。以下对这一Action举行具体剖析:
packagecom.routease.action.totradeentity;
importjava.util.Collection;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.commons.beanutils.PropertyUtils;
importorg.apache.commons.lang.StringUtils;
importorg.apache.struts.action.ActionForm;
importorg.apache.struts.action.ActionForward;
importorg.apache.struts.action.ActionMapping;
importcom.routease.action.PagingAction;
importcom.routease.action.helper.UserHelper;
importcom.routease.db.dao.DataSource;
importcom.routease.db.dao.totradeentity.SearchingCriteria;
importcom.routease.db.dao.totradeentity.ToTradeEntityDAO;
importcom.routease.db.util.Constants;
importcom.routease.db.util.Page;
publicclassSearchToTradeEntityActionextendsPagingAction{
publicSearchToTradeEntityAction()
{
super();
}
//executeWithDataSource办法为该Action默许实行的办法
publicActionForwardexecuteWithDataSource(ActionMappingactionMapping,ActionFormactionForm,HttpServletRequestrequest,HttpServletResponseresponse,DataSourceds)throwsException{
//起首承受用户提交的表双数据
Stringobjective=(String)PropertyUtils.getSimpleProperty(actionForm,"objective");
StringkeyWords=(String)PropertyUtils.getSimpleProperty(actionForm,"keyWords");
StringkeyWordsRange=(String)PropertyUtils.getSimpleProperty(actionForm,"keyWordsRange");
if(StringUtils.isEmpty(keyWordsRange)){
keyWordsRange=SearchingCriteria.KEY_WORDS_RANGE_NAME;
}
StringindustryLevel1=(String)PropertyUtils.getSimpleProperty(actionForm,"industryLevel1");
StringindustryLevel2=(String)PropertyUtils.getSimpleProperty(actionForm,"industryLevel2");
StringstartingPrice=(String)PropertyUtils.getSimpleProperty(actionForm,"startingPrice");
StringendingPrice=(String)PropertyUtils.getSimpleProperty(actionForm,"endingPrice");
Stringcity=(String)PropertyUtils.getSimpleProperty(actionForm,"city");
Stringprovince=(String)PropertyUtils.getSimpleProperty(actionForm,"province");
StringstartNoStr=(String)PropertyUtils.getSimpleProperty(actionForm,"startNumber");
StringlengthStr=(String)PropertyUtils.getSimpleProperty(actionForm,"length");
if(StringUtils.isEmpty(startNoStr)){
startNoStr="1";
}
//依据用户提交的数据,创立查询表达式对象SC
intstartNumber=Integer.parseInt(startNoStr);
intlength=UserHelper.getPagingLength(ds,request);
ToTradeEntityDAOserviceDAO=newToTradeEntityDAO(ds);
SearchingCriteriasc=newSearchingCriteria();
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("startofpage:"+startNumber);
}
//提交查询对象SC,并取得查询了局集,将其了局集放进Request对象中,便于前往
Pageresult=serviceDAO.searchToTradeEntities(sc,startNumber,length);
Collectionindustries=serviceDAO.findIndustryDistribution(sc);
result.setSizePerPage(length);
request.setAttribute(Constants.TO_TRADE_ENTITY,result);
request.setAttribute("MY_INDUSTRIES",industries);
request.setAttribute("MY_PAGE",result);
//营业逻辑处置终了以后,前往乐成页面
returnactionMapping.findForward("SUCCESS_PAGE");
}
}
SearchToTradeEntityAction是一个典范的Action,由后面注解不丢脸出,一样平常Action分为三部分:
a.承受用户表双数据
b.处置用户表双数据
c.前往处置了局及页面
4.修正页面为JSP文件
但凡触及到与用户形态相干的页面均应改革为静态页面(JSP文件),改革是在后面静态文件的基本长进行的,用服务器端前往的数据(寄存在Request对象里)交换静态文本,因为这部分绝对手艺性不强,以是不再具体赘述了。
经由过程后面四部分的先容,基础概述了如易网手艺实行的次要历程,鄙人面的一章里先容网站手艺中的几个主要技能。
《结束篇》
本篇次要先容网站实行过程当中的几个主要技能和思绪,最初还将先容网站保护方面的内容。
一.加速网站速率
只管以静态html文件为主,因为静态文件不必要WEB服务器剖析而间接前往给客户端,以是速率更快。
对网站及时性不强的静态文件能够接纳背景按期革新的机制来转化为静态文件大概js文件,如易网首页中的"保举服务"栏目实践就是接纳这类机制,可是对及时性请求较强的买卖环节是不合适用这类体例的。
别的一种加速网站速率的办法就是将频仍会见数据库的信息放在内存中,在web服务器启动的时分加载出去,这类觉得空间换工夫的思绪也值得自创。
二.服务器监测办理流程
一样平常企业级服务器都是接纳自力服务器,必要专人保护,可是如许本钱较高,有需要开辟一套背景监控程序来对体系资本,数据/程序备份做监测,用手艺手腕来下降本钱。
如易网背景监控程序完成思绪是:分两个线程,一个历程监测服务器的内存、磁盘资本和数据库、Web服务等相干使用的形态,一旦发明有非常,将以Email或短信的情势关照体系办理员;别的一个历程次要对数据举行周期性的备份,并将备份经由过程ftp上传至指定备用服务器。
本体系办理程序在网站运转时代起到主要的平安保证感化,并且也基础不必要野生干涉,削减了人力本钱,值得中小企业自创。
三.自助营销平台
对企业电子商务平台,营销尤其主要。经由过程分歧路径搜集营销数据库,并按期给用户发送企业产物信息,这统统历程接纳程序的体例完成,便利,费事。
最初,扼要先容一下网站保护的事件。网站一旦运营起来,必需包管其7*24小时的全天候一般运转。以是,网站前期的保护极其主要。依据笔者履历,次要必要做好以下几个方面:
1.按期做好数据备份和程序备份。
2.做好网站平安防护事情,对主要文件和目次设置会见权限,架设防火墙,封闭不必的端口。按期变动服务器的暗码,避免黑客进侵。
3.任何程序级的修正必需经由测试情况的考证以后才干公布到临盆情况,要有套严厉的公布流程。
做好以上三个方面,网站的一般运转基础能够包管。
停止语:
本文重点先容了网站实行过程当中的手艺框架和完成办法,并分离实例剖析了个中使用到的相干手艺。理论证实,这套思绪创建起来的网站架构不乱高效,具有很高的使用代价。
用java开发web只要两本书:一本是关于java基础的,一本是关于jsp、servlet的就可以了。开发周期长,我就来讲句题外话,现在有很多思想都是通过java来展现。 |
|