OMG,到底在寻找什么..................
(构造一个完美的J2EE系统所需要的完整知识体系)
posts - 198,  comments - 37,  trackbacks - 0
原贴地址:http://dev.yesky.com/47/2412047_1.shtml
《实施篇》

  本篇主要介绍该平台的具体实现过程。根据软件工程的相关理论,结合笔者多年的开发经验,网站开发一般尊循以下六步骤:

  1. 收集、整理网站需求。

  2. 根据网站需求,构想网页的交互情景(即USE CASE),并设计出网站的原形(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的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对象与数据库表字段之间的对应关系,示范代码如下:

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文件

  凡是涉及到与用户状态相关的页面均应改造为动态页面(JSP文件),改造是在前面静态文件的基础上进行的,用服务器端返回的数据(存放在Request对象里)替换静态文本,由于这部分相对技术性不强,所以不再详细赘述了。

  通过前面四部分的介绍,基本概述了如易网技术实施的主要过程,在下面的一章里介绍网站技术中的几个重要技巧。
posted on 2006-05-31 21:25 OMG 阅读(255) 评论(0)  编辑  收藏 所属分类: 电子商务开发

只有注册用户登录后才能发表评论。


网站导航:
 

<2006年5月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿(1)

随笔分类

随笔档案

IT风云人物

文档

朋友

相册

经典网站

搜索

  •  

最新评论

阅读排行榜

评论排行榜