摘要:本文以實(shí)例來詳細(xì)分析運(yùn)用J2EE技術(shù)架構(gòu)來搭建企業(yè)級(jí)電子商務(wù)網(wǎng)站的全過程,并對(duì)關(guān)鍵部件的實(shí)現(xiàn)以及相關(guān)技術(shù)進(jìn)行具體剖析,同時(shí)結(jié)合筆者經(jīng)驗(yàn),提出很多有價(jià)值的思路和方法。

  一. 前言:

  近年來,隨著互聯(lián)網(wǎng)業(yè)務(wù)的迅猛發(fā)展,企業(yè)間、企業(yè)與消費(fèi)者間實(shí)現(xiàn)電子商務(wù)已經(jīng)成為可能,建立企業(yè)級(jí)的電子商務(wù)平臺(tái)不僅可以拓寬企業(yè)的營銷渠道,而且對(duì)提升企業(yè)品牌形象等方面有重要的戰(zhàn)略意義。

  本文將以目前國內(nèi)最大服務(wù)交易平臺(tái)如易網(wǎng)(http://www.routease.com/)為例,來深入剖析一個(gè)電子商務(wù)交易平臺(tái)搭建的全過程。

  《準(zhǔn)備篇》

  一個(gè)項(xiàng)目的實(shí)施首先確定項(xiàng)目目標(biāo)、項(xiàng)目需求與開發(fā)環(huán)境(為方便理解,將如易網(wǎng)作為項(xiàng)目來描述)。本篇主要討論這三個(gè)方面:

  一.實(shí)施目標(biāo)

  如易網(wǎng)的創(chuàng)辦目標(biāo):建設(shè)為國內(nèi)最大的服務(wù)類交易平臺(tái)和在線工作平臺(tái)。由于本篇以技術(shù)講解為主,如要了解更多的背景資料,可以訪問:http://www.routease.com/AboutUs.htm 。

  二.實(shí)施需求

  目標(biāo)決定需求,定制清晰明確的項(xiàng)目需求是整個(gè)項(xiàng)目成敗的關(guān)鍵。可以使用Rose工具來建立項(xiàng)目對(duì)象實(shí)體圖,這里就不再贅述了,以下就幾個(gè)重要對(duì)象做一些描述:(可以對(duì)照http://www.routease.com/來瀏覽下面內(nèi)容):

  TotradeEntity:交易實(shí)體對(duì)象。該對(duì)象為核心對(duì)象,標(biāo)識(shí)交易的服務(wù)對(duì)象。比如翻譯服務(wù),開鎖服務(wù)等。

  ServiceRequirement:服務(wù)需求對(duì)象。該對(duì)象標(biāo)識(shí)用戶需求。比如需要電腦維修的信息等。

  SHOP:店鋪對(duì)象。該對(duì)象為中小企業(yè)或者個(gè)人開的網(wǎng)店,一個(gè)店鋪對(duì)應(yīng)多個(gè)交易實(shí)體。

  USER:用戶對(duì)象。該對(duì)象標(biāo)識(shí)從事網(wǎng)站的合法注冊(cè)用戶,它保留用戶信息。

  Account:帳戶對(duì)象。該對(duì)象標(biāo)識(shí)用戶的帳戶信息。

  Message:消息對(duì)象。該對(duì)象標(biāo)識(shí)用戶之間交流的信息。

  Credit:信譽(yù)對(duì)象。該對(duì)象標(biāo)識(shí)用戶交易的信譽(yù)等級(jí)信息,為交易提供有力參考。

  三.開發(fā)/運(yùn)行環(huán)境

  基于以上需求分析,本站采用J2EE/Structs應(yīng)用架構(gòu),服務(wù)器主機(jī)采用WIN2003 SERVER+APACHE2.0.54+TOMCAT 5.5.4的系統(tǒng)環(huán)境,開發(fā)環(huán)境:Eclipse+JDK1.5,數(shù)據(jù)庫DAO采用的著名的ORM工具TopLink9.0.4.5。以下對(duì)相應(yīng)開發(fā)技術(shù)及其工具做一個(gè)簡要介紹:

  1. Structs技術(shù)

  Web應(yīng)用的開發(fā)經(jīng)歷了一個(gè)由P2P(Page to Page)到MVC(model view controller)的發(fā)展過程。早期的Web應(yīng)用對(duì)用戶請(qǐng)求的處理和響應(yīng)均是在頁面上完成的,如圖1-1所示,即所的JSP1.0。這樣的Web架構(gòu)最大的好處就是開發(fā)效率較高,然后近幾年隨著互聯(lián)網(wǎng)的迅猛發(fā)展,網(wǎng)站功能日益增強(qiáng),而這種P2P的網(wǎng)站架構(gòu)(因?yàn)槠錁I(yè)務(wù)規(guī)則代碼與頁面代碼混為一團(tuán),不利于維護(hù))已經(jīng)不再適應(yīng)大規(guī)模應(yīng)用的發(fā)展要求,取而代之的是基于MVC的Web架構(gòu)。MVC的核心思想是將應(yīng)用分為模型、視圖和控制器三部分。模型是指應(yīng)用程序的數(shù)據(jù),以及對(duì)這些數(shù)據(jù)的操作;視圖是指用戶界面;controller負(fù)責(zé)用戶界面和程序數(shù)據(jù)之間的同步,也就是完成兩個(gè)方向的動(dòng)作:a.在根據(jù)用戶界面(view)的操作完成對(duì)程序數(shù)據(jù)(model)的更新,b.將程序數(shù)據(jù)(model)的改變及時(shí)反應(yīng)到用戶界面(view)上。通過MVC的Web架構(gòu),可以弱化各個(gè)部分的耦合關(guān)系,并將業(yè)務(wù)邏輯處理與頁面以及數(shù)據(jù)分離開來,這樣當(dāng)其中一個(gè)模塊的代碼發(fā)生改變時(shí),并不影響其他模塊的正常運(yùn)行,所以基于MVC的Web架構(gòu)更適應(yīng)于大規(guī)模軟件應(yīng)用開發(fā)的潮流。


圖1

圖2

  目前基于MVC的開發(fā)框架主要有Structs、Spring等。本站選用其中的Structs作為開發(fā)框架,采用Structs應(yīng)用框架開發(fā)應(yīng)用程序,將開發(fā)人員從繁瑣的代碼編制中解放出來,取而代之的是配置一些含有對(duì)應(yīng)關(guān)系的XML文件,這樣當(dāng)應(yīng)用環(huán)境發(fā)生變化時(shí),不需重新編譯程序即可運(yùn)行,并且使得應(yīng)用更加靈活、高效,而且重用度高。

  從開發(fā)角度,Struts主要有如下的功能:

  ·包含一個(gè)controller servlet,能將用戶的請(qǐng)求發(fā)送到相應(yīng)的Action對(duì)象。通過Web.xml文件來配置其相關(guān)參數(shù)。

  ·tag庫,并且在controller servlet中提供關(guān)聯(lián)支持,幫助開發(fā)人員創(chuàng)建交互式表單應(yīng)用。

  ·通過配置Structs-config.xml文件,將Action對(duì)象與用戶請(qǐng)求以及請(qǐng)求結(jié)果頁面關(guān)聯(lián)起來。

  如需更多了解Structs的相關(guān)信息,請(qǐng)其官方網(wǎng)站:http://jakarta.apache.org/struts 

  2.TopLink技術(shù)

  過去,對(duì)模型數(shù)據(jù)的存取訪問往往是直接是應(yīng)用通過ODBC這樣的數(shù)據(jù)庫接口訪問數(shù)據(jù)庫。但是這樣處理并不符合OOP的精神,而且應(yīng)用開發(fā)人員必須熟悉后臺(tái)數(shù)據(jù)庫的模型構(gòu)造,這就加大開發(fā)的難度。為此,ORM(Object Relational Mapping)技術(shù)應(yīng)運(yùn)而生.ORM技術(shù)實(shí)際是一個(gè)對(duì)象持久化的框架,其核心思想是建立了Java對(duì)象與后臺(tái)數(shù)據(jù)庫之間的映射關(guān)系。這樣對(duì)這些Java對(duì)象的訪問實(shí)際就是對(duì)后臺(tái)數(shù)據(jù)庫的訪問,從而屏蔽了數(shù)據(jù)庫訪問的細(xì)節(jié),開發(fā)人員甚至可以在不了解后臺(tái)數(shù)據(jù)庫的情況下進(jìn)行開發(fā)工作。此外,Toplink在數(shù)據(jù)緩存優(yōu)化上也有很好的表現(xiàn)。本項(xiàng)目采用著名的ORM工具Toplink進(jìn)行開發(fā)。


《實(shí)施篇》

  本篇主要介紹該平臺(tái)的具體實(shí)現(xiàn)過程。根據(jù)軟件工程的相關(guān)理論,結(jié)合筆者多年的開發(fā)經(jīng)驗(yàn),網(wǎng)站開發(fā)一般尊循以下六步驟:

  1. 收集、整理網(wǎng)站需求。

  2. 根據(jù)網(wǎng)站需求,構(gòu)想網(wǎng)頁的交互情景(即USE CASE),并設(shè)計(jì)出網(wǎng)站的原形(Prototype)。

  3. 設(shè)計(jì)出實(shí)例化對(duì)象以及后臺(tái)數(shù)據(jù)庫結(jié)構(gòu)。

  4. 采用ORM工具,建立實(shí)例化對(duì)象與后臺(tái)數(shù)據(jù)庫之間的映射關(guān)系。

  5. 根據(jù)網(wǎng)站交互需求,定制后臺(tái)Action,以處理用戶動(dòng)作。

  6. 修改網(wǎng)站原形(Prototype)為動(dòng)態(tài)頁面(JSP文件),將Action處理結(jié)果嵌入到動(dòng)態(tài)頁面中返回給客戶端。

  在這六個(gè)步驟中,第一步實(shí)際已經(jīng)在《準(zhǔn)備篇》里已經(jīng)給出了,下面重點(diǎn)講解后面幾個(gè)步驟。

  1. 網(wǎng)站原形(Prototype)

  網(wǎng)站原形是對(duì)一個(gè)網(wǎng)站功能的頁面級(jí)描述,即看到網(wǎng)站原形就好比看到一個(gè)真實(shí)的網(wǎng)站一樣,只是網(wǎng)站原形并沒有嵌入動(dòng)態(tài)代碼,而且頁面之間也缺乏關(guān)聯(lián)而已。

  網(wǎng)站原形的開發(fā)為純靜態(tài)頁面的開發(fā),制作網(wǎng)站原形的關(guān)鍵在于將網(wǎng)站功能需求轉(zhuǎn)化為人機(jī)界面。

  如易網(wǎng)的網(wǎng)站原形制作下載地址:http://www.routease.com/download/ruyinew924.rar

  2. OOP設(shè)計(jì)與后臺(tái)數(shù)據(jù)庫設(shè)計(jì)

  借助強(qiáng)大的ORM開發(fā)工具,可以將OOP與數(shù)據(jù)庫的設(shè)計(jì)同時(shí)進(jìn)行(即可以同時(shí)實(shí)施上面步驟的3,4步),這也是ORM工具最大特點(diǎn)。本項(xiàng)目采用Oracle公司的Toplink作為ORM開發(fā)工具。以下簡要介紹Toplink開發(fā)過程。

  1) 打開Toplink的Mapping Workbench組件,然后新建一個(gè)Mapping 工程。

  2) 配置工程的屬性,即在"選項(xiàng)"面板上設(shè)置工程路徑以及Java對(duì)象源代碼的路徑。

  3) 配置數(shù)據(jù)庫登陸參數(shù),包括應(yīng)用訪問數(shù)據(jù)庫的URL、用戶名、密碼等。

  完成以上三步,就可以根據(jù)應(yīng)用的需求來開發(fā)Java類。在Mapping Workbench里新建一個(gè)描述符(實(shí)際就是有一個(gè)Java類),根據(jù)需求來添加屬性,并自動(dòng)生成Set/Get方法。一旦完成Java類的開發(fā)后,選擇"自動(dòng)映射到數(shù)據(jù)庫"的選項(xiàng),即可實(shí)現(xiàn)數(shù)據(jù)庫表的自動(dòng)創(chuàng)建。(Toplink的最大優(yōu)勢(shì)就是在定制好Java類之后可以自動(dòng)生成數(shù)據(jù)庫的表結(jié)構(gòu))。

  鑒于國內(nèi)Toplink方面的資料較少,這里介紹一下Toplink生成的工程文件RouteaseMappingProject,該工程文件在web服務(wù)器啟動(dòng)的時(shí)候裝載,可以理解為客戶程序?qū)?shù)據(jù)庫訪問的接口程序,他有三類方法:

  ·構(gòu)造函數(shù)

  主要是調(diào)用oracle.toplink.sessions.Project的addDescriptor方法,其作用是將數(shù)據(jù)庫和Java對(duì)象之間的映射關(guān)系加入到Project 中。代碼示范如下:

public RouteaseMappingProject() {
addDescriptor(buildAccountDescriptor());
addDescriptor(buildPhoneDescriptor());
…….
}

  ·applyLogin方法

  它處理客戶程序登陸數(shù)據(jù),并配置一些存取數(shù)據(jù)庫的參數(shù),比如緩沖池等。代碼示范為:

public void applyLogin() {
 //配置數(shù)據(jù)庫訪問參數(shù)
 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));
 // 設(shè)置數(shù)據(jù)庫參數(shù)
 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);
}

  ·建立映射關(guān)系

  Toplink通過類似于builXXXDescriptor方法來建立Java對(duì)象與數(shù)據(jù)庫表字段之間的對(duì)應(yīng)關(guān)系,示范代碼如下:

public Descriptor buildAccountDescriptor() {
 Descriptor descriptor = new Descriptor();
 descriptor.descriptorIsAggregate();
 descriptor.setJavaClass(com.routease.db.vo.user.Account.class);
 descriptor.setAlias("Account");
 // Mappings.
 //建立Account 對(duì)象的deposit屬性與數(shù)據(jù)庫表的DEPOSIT字段的對(duì)應(yīng)關(guān)系
 DirectToFieldMapping depositMapping = new DirectToFieldMapping();
 depositMapping.setAttributeName("deposit");
 depositMapping.setFieldName("DEPOSIT");
 descriptor.addMapping(depositMapping);
 …
 return descriptor;
}



 3. 定制后臺(tái)Action

  根據(jù)MVC的精神,View和Model設(shè)計(jì)好之后應(yīng)該是將開發(fā)重點(diǎn)轉(zhuǎn)移到控制器的開發(fā)上。控制器是根據(jù)用戶行為進(jìn)行響應(yīng)的處理模塊,比如用戶通過首頁的搜索條對(duì)服務(wù)信息進(jìn)行檢索,這時(shí),web服務(wù)中的SearchToTradeEntityAction(對(duì)應(yīng)SearchToTradeEntityAction.java文件)會(huì)對(duì)用戶這一動(dòng)作進(jìn)行處理。以下對(duì)這一Action進(jìn)行詳細(xì)分析:

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默認(rèn)執(zhí)行的方法
 public ActionForward executeWithDataSource(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response, DataSource ds) throws Exception {
  //首先接受用戶提交的表單數(shù)據(jù)
  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";
  }
  //根據(jù)用戶提交的數(shù)據(jù),創(chuàng)建查詢表達(dá)式對(duì)象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);
  }
  //提交查詢對(duì)象SC,并獲得查詢結(jié)果集,將其結(jié)果集放入Request對(duì)象中,便于返回
  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);
  //業(yè)務(wù)邏輯處理完畢之后,返回成功頁面
  return actionMapping.findForward("SUCCESS_PAGE");
 }
}

  SearchToTradeEntityAction是一個(gè)典型的Action,由前面注解不難看出,一般Action分為三部分:

  a. 接受用戶表單數(shù)據(jù)

  b. 處理用戶表單數(shù)據(jù)

  c. 返回處理結(jié)果及頁面

  4. 修改頁面為JSP文件

  凡是涉及到與用戶狀態(tài)相關(guān)的頁面均應(yīng)改造為動(dòng)態(tài)頁面(JSP文件),改造是在前面靜態(tài)文件的基礎(chǔ)上進(jìn)行的,用服務(wù)器端返回的數(shù)據(jù)(存放在Request對(duì)象里)替換靜態(tài)文本,由于這部分相對(duì)技術(shù)性不強(qiáng),所以不再詳細(xì)贅述了。

  通過前面四部分的介紹,基本概述了如易網(wǎng)技術(shù)實(shí)施的主要過程,在下面的一章里介紹網(wǎng)站技術(shù)中的幾個(gè)重要技巧。


《完結(jié)篇》

  本篇主要介紹網(wǎng)站實(shí)施過程中的幾個(gè)重要技巧和思路,最后還將介紹網(wǎng)站維護(hù)方面的內(nèi)容。

  一. 加快網(wǎng)站速度

  盡量以靜態(tài)html文件為主,由于靜態(tài)文件不需要WEB服務(wù)器解析而直接返回給客戶端,所以速度更快。

  對(duì)網(wǎng)站實(shí)時(shí)性不強(qiáng)的動(dòng)態(tài)文件可以采用后臺(tái)定期刷新的機(jī)制來轉(zhuǎn)化為靜態(tài)文件或者js文件,如易網(wǎng)首頁中的"推薦服務(wù)"欄目實(shí)際就是采用這種機(jī)制,但是對(duì)實(shí)時(shí)性要求較強(qiáng)的交易環(huán)節(jié)是不適合用這種方式的。

  另外一種加快網(wǎng)站速度的方法就是將頻繁訪問數(shù)據(jù)庫的信息放在內(nèi)存中,在web服務(wù)器啟動(dòng)的時(shí)候加載進(jìn)來,這種以為空間換時(shí)間的思路也值得借鑒。

  二. 服務(wù)器監(jiān)測(cè)管理流程

  一般企業(yè)級(jí)服務(wù)器都是采用獨(dú)立服務(wù)器,需要專人維護(hù),但是這樣成本較高,有必要開發(fā)一套后臺(tái)監(jiān)控程序來對(duì)系統(tǒng)資源,數(shù)據(jù)/程序備份做監(jiān)測(cè),用技術(shù)手段來降低成本。

  如易網(wǎng)后臺(tái)監(jiān)控程序?qū)崿F(xiàn)思路是:分兩個(gè)線程,一個(gè)進(jìn)程監(jiān)測(cè)服務(wù)器的內(nèi)存、磁盤資源以及數(shù)據(jù)庫、Web服務(wù)等相關(guān)應(yīng)用的狀態(tài),一旦發(fā)現(xiàn)有異常,將以Email或短信的形式通知系統(tǒng)管理員;另外一個(gè)進(jìn)程主要對(duì)數(shù)據(jù)進(jìn)行周期性的備份,并將備份通過ftp上傳至指定備用服務(wù)器。

  本系統(tǒng)管理程序在網(wǎng)站運(yùn)行期間起到重要的安全保障作用,而且也基本不需要人工干預(yù),減少了人力成本,值得中小企業(yè)借鑒。

  三. 自助營銷平臺(tái)

  對(duì)企業(yè)電子商務(wù)平臺(tái),營銷尤為重要。通過不同路徑收集營銷數(shù)據(jù)庫,并定期給用戶發(fā)送企業(yè)產(chǎn)品信息,這一切過程采用程序的方式實(shí)現(xiàn),方便,省事。

  最后,簡要介紹一下網(wǎng)站維護(hù)的事宜。網(wǎng)站一旦運(yùn)營起來,必須保證其7*24小時(shí)的全天候正常運(yùn)行。所以,網(wǎng)站后期的維護(hù)極為重要。根據(jù)筆者經(jīng)驗(yàn),主要需要做好以下幾個(gè)方面:

  1. 定期做好數(shù)據(jù)備份和程序備份。

  2. 做好網(wǎng)站安全防護(hù)工作,對(duì)重要文件和目錄設(shè)置訪問權(quán)限,架設(shè)防火墻,關(guān)閉不用的端口。定期更改服務(wù)器的密碼,防止黑客入侵。

  3. 任何程序級(jí)的修改必須經(jīng)過測(cè)試環(huán)境的驗(yàn)證之后才能發(fā)布到生產(chǎn)環(huán)境,要有套嚴(yán)格的發(fā)布流程。

  做好以上三個(gè)方面,網(wǎng)站的正常運(yùn)行基本可以保證。

  結(jié)束語:

  本文重點(diǎn)介紹了網(wǎng)站實(shí)施過程中的技術(shù)框架和實(shí)現(xiàn)方法,并結(jié)合實(shí)例分析了其中運(yùn)用到的相關(guān)技術(shù)。實(shí)踐證明,這套思路建立起來的網(wǎng)站架構(gòu)穩(wěn)定高效,具有很高的應(yīng)用價(jià)值。