技术框架及开发指南v0.1


版权申明 福建新东网科技有限公司版权所有,保留一切权利。 未经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档的部分或全部,并以任何形式传播。 技术框架及开发指南(V0.1) 文档控制页 修订历史 版本号 日期 作者 修改说明  V0.1  2005­12­30  李壮相 初稿 目 录  1  引言 ............................................................................................1  1.1  数据层问题...............................................................................1  1.2  表现层问题...............................................................................1  2  架构图.........................................................................................2  3  引进持久层(iBatis).....................................................................3  4  引进 MVC(Webwork).................................................................4  5  开发工具(Eclipse)......................................................................4  6  iBatis 开发 .................................................................................5  6.1  sql­map­config.xml ..................................................................5  6.2  SqlMapConfigExample.properties...........................................6  6.3  TfUser.Xml...............................................................................6  6.4  Myapp.java ..............................................................................7  6.5  操作数据 ..................................................................................8  7  Webwork 开发 ...........................................................................9  7.1  web.xml....................................................................................9  7.2  xwork.xml............................................................................... 11  7.3  MODEL 对象..........................................................................12  7.4  Action 对象.............................................................................13  7.5  Web 界面 ...............................................................................14  7.6  输入验证 ................................................................................16  7.7  validators.xml.........................................................................17  7.8  StringRegexValidator.java .....................................................17 技术框架及开发指南 V0.1  福建新东网科技有限公司 第 1 页  1 引言  1.1数据层问题 在如今的企业级应用开发环境中,面向对象的开发方法已成为主流。对象只 能存在于内存中,而内存不能永久保存数据。如果要永久保存对象的状态,需要 进行对象的持久化到数据库中。对象和关系数据其实是业务实体的两种表现形 式。把对象持久化到关系数据库中,需要进行对象­关系的映射,这是一项繁琐 耗时的工作。在实际应用中,除了需要把内存中的对象持久化到数据库外,还需 要把数据库中的关系数据再重新加载到内存中,以满足用户查询业务数据的需 求。 频繁地访问数据库,会对应用的性能造成很大影响。目前我们的程序员把数 据库访问操作封装起来,提供简洁的 API,供业务层统一调用。但是,如果关系 数据模型非常复杂,目前的 API 难以满足实现持久化层的需要,并耗费了我们程 序的大量时间而且专业性受到置疑,而从头开发公司自己的持久化层不是很可 行。因此考虑引进持久层。  1.2表现层问题 大部分 Web 应用程序都是用像 ASP,PHP,或者 CFML 这样的过程化语 言来创建的。它们将像数据库查询语句这样的数据层代码和像  HTML  这样的表 示层代码混在一起。经验比较丰富的开发者会将数据从表示层分离开来,但这通 常不是很容易做到的,它需要精心的计划和不断的尝试。MVC 从根本上强制性 技术框架及开发指南 V0.1  福建新东网科技有限公司 第 2 页 的将它们分开。尽管构造 MVC 应用程序需要一些额外的工作,但是它给我们带 来的好处是无庸质疑的。从根本上解决以下问题:页面中含有大量的 Java 程序, 甚至还有 SQL;Java 程序中含有大量的页面内容;美工对含有代码的网页无法 做页面设计;程序员参与页面设计手工对页面的显示进行控制;Javascript 代码 铺天盖地,东抄一段,西抄一段,缺乏有效的管理。  2 架构图 我们将技术架构图的层次分为 4 层,突出表现层和持久层的定义。表现层采 用 Webwork 架构,持久层采用 iBatis 持久技术。希望公司各项目组能够按规定 进行软件架构实现。图中其实很清晰的看出每个层次之间的关系,表现层的页面 通过可以配置的  Action  chaining(操作链)交互着  JavaBeans  中的信息,而  JavaBeans 中的信息来自 iBatis 的 DAO,DAO 通过可以配置的 Map 访问着数 据库中的信息。每个层面比较清晰,并强调可配置,可配置意味着,您不需要修 改代码就能够完成需要的逻辑业务和数据库的 SQL 优化。 技术框架及开发指南 V0.1  福建新东网科技有限公司 第 3 页 通过了解公司目前的项目,频繁访问数据库问依然,极端的情况就是为了一 个用户的性别也要从数据库的配置中读取,其他的配置参数也不例外,每个用户 读取配置时 60%的 SQL 和条件都是一模一样的,有一些较好的项目能够做到缓 存,但缺乏缓存的更新机制,同步问题突显。因此,引进通过维护缓存的持久层 似乎成了不二的选择。  3 引进持久层(iBatis)  如上面描述的,持久层给我们带来的好处毋庸置疑,引进持久层就成为引进 持久层产品的问题。 鉴于公司项目的实际情况,Hibernate  不能暂时还难以满足以下要求:1、 我们现有的电信系统部分或全部数据来自现有数据库,处于安全考虑,只对开发 团队提供几条  select  SQL(或存储过程)以获取所需数据,具体的表结构不予公 开;2、电信部分开发规范要求,所有牵涉到业务逻辑部分的数据库操作,必须 在数据库由存储过程实现;3、系统数据处理量巨大,性能要求极为苛刻,这样 往往意味着我们必须通过高度优化的  SQL  语句(或存储过程)才能达到系统性能 技术框架及开发指南 V0.1  福建新东网科技有限公司 第 4 页 设计指标。如果采用  Hibernat  势必会有部分高性能要求功能还要通过原始的  JDBC 来实现,未免过于拖沓,而“半自动化”的 iBatis 刚好解决了这个问题, 权衡利弊之后,认为选择了 iBatis 做为公司持久层的首选产品,而“一站式”的 系统,如福州一中网校依然推荐使用 Hibernate,自动化可以节省 30%左右的开 发时间。  4 引进 MVC(Webwork)  再谈 MVC,其实是一个很“古老”的话题了。在 Struts 和 Webwork 中做 一个选择, 更多的不是从技术层上做细致的比较, 只是为了统一 MVC 产品选择。 选择 Webwork 仅仅因为 Struts 配置过于复杂。公司有部分产品使用了 Struts 架 构,相信更多的程序员苦于 ActionForms 使用不便、无法进行单元测试等等,而 且架构复杂,更多的程序员在技术憧憬和争执中度过,而 Webwork 结构简单易 于扩展、标签库易于定制、拦截器非常出色,况且 Struts 和 webwork 开发团队 的合并,更解决我们的忧虑,新框架是以 webwork 为 core,并且 webwork 可以 提供一个抽象层,以完全向后兼容 Struts1.x。  5 开发工具(Eclipse)  公司内部由于历史原因,以及程序员的随意性,存在多种开发工具 Eclipse、  JBuilder、Intelij  Idea,因为开发工具的区别在团队开发过程中造成了很大的麻 烦,因此公司层面决定要求统一采用免费的 Eclipse 做为开发工具。请程序员务 必遵守。 技术框架及开发指南 V0.1  福建新东网科技有限公司 第 5 页  6 iBatis 开发  iBatis 开发指南建议阅读夏昕编写的《iBATIS  2.0 开发指南》,下面简单扼 要的对一些主要点的文件进行描述。 以  tomcat  为例,在  WEB­INF/lib  下应包含  ibatis­common­2.jar(必需)、  ibatis­sqlmap­2.jar( 必 需 ) 和 以 及  ibatis­dao­2.jar( 可 选 ) , 和 必 需 携 带 的  commons­logging­1­0­3.jar。  6.1sql­map­config.xml  这个文件是重要的 iBatis 的配置文件,iBatis 通过访问数据库、缓存、以及  Map 的 XML 文件等信息。下面是一个典型的例子:          技术框架及开发指南 V0.1  福建新东网科技有限公司 第 6 页                      6.2SqlMapConfigExample.properties  这个文件的出现前提是 sql­map­config.xml 中指定了参数文件, 否则这个文 件可以不出现。  driver=oracle.jdbc.driver.OracleDriver  url=jdbc:oracle:thin:@192.168.0.1:1521:orcl  username=ORAUSER  password=ORAPASSWD  6.3TfUser.Xml  这是一个典型的数据访问配置的 XML 文件, 细节含义可以阅读 《iBATIS SQL  Maps 开发指南》。 技术框架及开发指南 V0.1  福建新东网科技有限公司 第 7 页                  select * from tf_user WHERE id=#id#      INSERT INTO  tf_user(id,username)  VALUES (#id#, #username#)      6.4Myapp.java  为了让程序编写看起来更优雅一些, 我们把 SqlMapClient 的获取封装起来。  public class Myapp {  private static final SqlMapClient sqlMap;  static {  try {  String resource = "sqlmap/map/sql­map­config.xml";  Reader reader = Resources.getResourceAsReader (resource); 技术框架及开发指南 V0.1  福建新东网科技有限公司 第 8 页  sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);  }  catch (Exception e) {  e.printStackTrace();  throw new RuntimeException ("Error initializing MyApp class. Cause:"+e);  }  }  public static SqlMapClient getSqlMapInstance () {  return sqlMap;  }  }  6.5操作数据 在这个 Java 文件中,通过 SqlMapClient 调用一个 insert 方法,方法中指定 了配置文件中的名称“insertUser” ,找到 TfUser.xml 中相应的 SQL 进行数据动 作。  public class Opperates {  public static void main(String[] args) {  User newUser= new User();  newUser.setId(1000005);  newUser.setUsername("oring");  SqlMapClient sqlMap = Myapp.getSqlMapInstance();  try{  sqlMap.insert ("insertUser", newUser);  }  catch(Exception e){  e.printStackTrace();  } 技术框架及开发指南 V0.1  福建新东网科技有限公司 第 9 页  }  }  这个是非常简单的例子,iBatis 不只是我们上面表述的那么简单,请您阅读 附件提供的 PDF 文档,将会有更深层次的了解。  7 Webwork 开发  Webwork 开发指南建议阅读夏昕编写的《Webwork2.0 开发指南》,下面简 单扼要的对一些主要点的文件进行描述。 以 Tomcat 为例:  WEB­INF 下包含 velocity.properties 和 webwork.tld 文件  WEB­INF/lib 下包含 webwork­2.1.jar 和以及 webwork\lib\core\*.jar  Src 下包含 xwork.xml、validators.xml  7.1web.xml  在 web.xml 中加载 webwork,设定相应的 class,并对设定 HTTP 协议中没 有.action 结尾的服务资源。    技术框架及开发指南 V0.1  福建新东网科技有限公司 第 10 页    …………………    container    com.opensymphony.webwork.lifecycle.RequestLifecycleFilter        container  /*        com.opensymphony.webwork.lifecycle.ApplicationLifecycleListener          com.opensymphony.webwork.lifecycle.SessionLifecycleListener        velocity    com.opensymphony.webwork.views.velocity.WebWorkVelocityServlet    1    技术框架及开发指南 V0.1  福建新东网科技有限公司 第 11 页    webwork    com.opensymphony.webwork.dispatcher.ServletDispatcher    1        webwork  *.action      velocity  *.vm    …………………      webwork  /WEB­INF/webwork.tld      7.2xwork.xml  xwork.xml 支撑着 webwork2, 并做为一般性代码框架, 我们可以设定 Action  的结果返回: 技术框架及开发指南 V0.1  福建新东网科技有限公司 第 12 页              /web/index.jsp      /index.jsp        ………      7.3MODEL 对象  Model 很好理解, 就是一个简单的不能再简单的Bean, 和iBatis的JavaBean  完全共享,和 Struts 的 formbean 类似,例如:  public class TfUser  {  private String Username;  private String password;  … public String getPassword(){  return password;  }  public void setPassword()  { 技术框架及开发指南 V0.1  福建新东网科技有限公司 第 13 页  this.password=password;  }  public String getUsername(){  return username;  }  public void setUsername()  {  this.username=username;  }  … }  7.4Action 对象  Action 继承 AbstractAction,ModelDriven,加以必要的业务实现,例如:  LoginAction.java  public class LoginAction extends AbstractAction implements ModelDriven {  private final static String LOGIN_FAIL="loginfail";  TfUser loginInfo = new TfUser();  public String execute() throws Exception {  TransService fs = TransServiceFactory.geTransService();  TfUser testUser = null;  if(loginInfo.getUsertype()==null  &&loginInfo.getUsername()!=null  &&loginInfo.getUsername().length()>0)  testUser=fs.getClubUser(loginInfo.getUsername(),  loginInfo.getPwd());  else  {  return LOGIN_FAIL;  } 技术框架及开发指南 V0.1  福建新东网科技有限公司 第 14 页  if (testUser!=null)  {  set("loginUser",testUser);//写入 session  …  return SUCCESS;  }else{  return LOGIN_FAIL;  }  }  public Object getModel() {  return loginInfo;  }  }  7.5Web 界面 登录成功后的页面  /web/index.jsp  <%@ taglib prefix="ww" uri="webwork" %>  <%@  page  pageEncoding="GBK"  contentType="text/html;  charset=GBK"  language="java" errorPage="/all_error.jsp" %>  <%request.setCharacterEncoding("GBK");%>      英语翻译平台  技术框架及开发指南 V0.1  福建新东网科技有限公司 第 15 页                 Error:
                ……………      ……………    …………… 
  ……………      技术框架及开发指南 V0.1  福建新东网科技有限公司 第 16 页  7.6输入验证 这是一个很出色的功能,如果自行编写验证类,会有很多意想不到的效果。  Webwork  命名约定方式:Action  类名­validation.xml,并一定要放在和  Action  类名相同的目录:  LoginAction­validation.xml        ^([a­zA­Z0­9_]{5,13})$    你必须输入一个用户名,用户名只能由字母、数字及下划线组成且长度必须在  5­13 之间。            请输入密码      13  密码长度不能超过 13 个字节    技术框架及开发指南 V0.1  福建新东网科技有限公司 第 17 页    7.7validators.xml  该文件给验证类定义一个类型名称, 在 Action类名­validation.xml 中并引用, 如上面的 LoginAction­validation.xml 文件。    …………          …………    7.8StringRegexValidator.java  这里我们扩展了一个 StringRegexValidator 的类, webwork 没有提供正则表 达式的验证类,通过下面的代码,就可以完成一个正则表达式的验证类。  public class StringRegexValidator extends FieldValidatorSupport    { 技术框架及开发指南 V0.1  福建新东网科技有限公司 第 18 页  private String regex="";  private boolean doTrim = true;  public void validate( Object object )throws ValidationException{  String fieldName = getFieldName();  String value = (String)this.getFieldValue( fieldName, object );  if (doTrim) {  value = value.trim();  }  Pattern pattern = Pattern.compile( regex );  Matcher matcher = pattern.matcher( value );  if ( !matcher.find() ){  addFieldError( fieldName, object );  }  }  /**  * @return Returns the regex.  */  public String getRegex() {  return regex;  }  /**  * @param regex The regex to set.  */  public void setRegex(String regex) {  this.regex = regex;  }  /** 技术框架及开发指南 V0.1  福建新东网科技有限公司 第 19 页  * @return Returns the trim.  */  public boolean isTrim() {  return doTrim;  }  /**  * @param trim The trim to set.  */  public void setTrim(boolean trim) {  doTrim = trim;  }  }  依此类推,我们还可以写出更多的验证类,比如注册用户时判断用户名是否 存在的验证类,这是在 JavaScript 验证中比较难做到的。  public class UsernameCheckValidator extends FieldValidatorSupport    {  private boolean doTrim = true;  public void validate(Object object) throws ValidationException {  String fieldName = getFieldName();  String value = (String)this.getFieldValue( fieldName, object );  if (doTrim) {  value = value.trim();  }  TransService fs = TransServiceFactory.getTransService();  Boolean hasuser=(Boolean)fs.checkUserName(value);  if (hasuser.booleanValue()){  addFieldError( fieldName, object );  }  }  /** 技术框架及开发指南 V0.1  福建新东网科技有限公司 第 20 页  * @return Returns the trim.  */  public boolean isTrim() {  return doTrim;  }  /**  * @param trim The trim to set.  */  public void setTrim(boolean trim) {  doTrim = trim;  }  }
还剩22页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

chenly

贡献于2012-05-22

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf