1、JFRAMEWORK 2018-11-91JFRAMEWORK 架构设计编撰:赵万刚JFRAMEWORK 2018-11-92目录1. 系统设计架构说明 51.1. 总体架构示意图 61.1.1. 各层示意图 71.1.1.1. WEB 页面请求/ 返回结果处理过 .71.1.1.2. 逻辑层 81.1.1.3. 统一错误处理 81.1.1.4. 日志记录 91.1.2. 各层采用 JAVA 技术 .92. 各层设计 112.1. 页面层 HTML .112.1.1. 页面脚本处理 112.1.1.1. Enter to tab 处理 112.1.1.2. 客户端输入域判断 112.1.1.3
2、. 快捷键的使用 122.1.1.4. 打印处理 122.1.2. CSS 样式表 .132.1.3. 控件样式 132.2. 数据处理层 JSP.132.2.1. 注意问题 132.2.2. 公用变量 142.3. 数据分离层 SERVLET.142.3.1. 注意事项 142.3.2. 错误处理 152.3.3. 公用参数 152.3.4. 样例说明 152.4. 过滤层 182.4.1. 过滤 FILTER.182.4.2. 事件 LISTENERS .202.5. 逻辑层 222.5.1. 调用数据库操作 222.5.2. 调用 EMAIL 操作 .232.5.3. 参数传递说明 24
3、2.5.4. 错误处理 242.5.5. 公用参数 282.6. 持久层 292.6.1. 数据库操作部分 292.6.2. 离线数据集 WzResult.302.6.3. 结果封装集 WzTyResult 312.6.4. 持久类规范 312.7. 配置文件 342.7.1. 信息配置文件 ApplicationResources.properties 352.7.2. 标记库配置文件 DTHTML.TLD .35JFRAMEWORK 2018-11-932.7.3. WEB 配置文件 WEB.XML(固有) 352.7.4. 日志配置文件 LOG4J.properties392.7.5.
4、应用服务器配置和发布 402.7.5.1. RESIN 配置文件 RESIN.properties(应用服务器相关) .402.7.5.2. TOMCAT.412.7.6. 持久生成器主类 MANIFEST.MF432.7.7. 配置文件 CONFIG.XML432.7.8. 数据库 SQL 配置文件 CONFIGSQL.XML.482.8. 测试 492.8.1. 说明 492.8.2. 测试文件命名 492.8.3. JUNIT 说明 .492.8.3.1. JUNIT 架构说明 .492.8.3.2. 样例文件 603. 系统开发约定 663.1. 程序命名约定 663.1.1.1. 一
5、般程序名字约定 663.1.1.2. 数据库命名约定 673.1.1.3. WEB.673.2. 书写规范 683.2.1.1. 数据库 683.2.1.2. Java 书写规范 .69备注 69Java 文件样式约定 70一般性编程约定 723.2.1.3. Web73网页 734. 各模块设计 744.1. 持久层生成器 744.1.1. 格式化信息定义 744.2. JAVA 类路径 744.3. 通用维护 754.3.1. 设计目的 754.3.2. 数据库设计 754.3.3. 通用维护 774.3.4. 复合通用维护 774.3.4.1. 功能 774.3.4.2. web 端设计
6、 774.3.4.2.1. 初始化 .774.3.4.2.1.1. 子表查询参数初始化原则 784.3.4.2.1.2. 隐含字段初始化原则 784.3.4.2.1.3. 默认查询条件原则 784.3.4.2.1.4. spcid 取得 784.3.4.2.2. Web 端调用流程说明 78JFRAMEWORK 2018-11-944.3.4.2.3. 样例说明 .794.4. servlet 集成类 864.4.1. 验证信息配置 864.4.1.1. 样例文件 864.4.2. 调用方法 874.4.3. 样例文件 874.5. 外部邮件(公用包) 904.5.1.1. 发送 90A si
7、mple text email 90Sending emails with attachments.90Sending HTML formatted email 92Debugging .93Authentication 93Handling Bounced Messages944.5.1.2. 接收 954.6. 压缩(公用包) 954.6.1.1. 压缩 954.6.1.2. 解压 95JFRAMEWORK 2018-11-951. 系统设计架构说明本系统设计主要是概要设计,具体详细设计见:详细设计 名称 开发工具程序 UML Dcework2 TOGAHTER 6数据库建模 DCEWOR
8、K2DB SYBASE PowerDesign10程序开发 DCJFRAMEWORKPER BORLAND JBUILERX WEB.WAR DCWEB.WAR BORLAND JBUILERXJAVA 基类包 DCJFRAMEWORK.JAR BORLAND JBUILERX持久层生成器 DCJFRAMEWORKPER.EXE BORLAND JBUILERX代码生成器 DCJFRAMEWORKPER.EXE BORLAND JBUILERXJAVA 帮助 DCEWORK2DOC开发工具工具名称 备注TOGAHTER 6 JAVA 程序 UMLSYBASE POWLERDESIGNER10
9、数据库建模BORLAND JBUILERX JAVA 程序开发DCJFRAMEWORKPER.EXE 持久层生成器DCJFRAMEWORKPER.EXE 代码生成器PLSQL Developer 数据库调试工具Visio2003 流程开发工具RESIN2 运行环境JFRAMEWORK 2018-11-961.1.总体架构示意图页 1架 构 示 意 图数据分离层W e bW e bH T M LX M LA P P L E T逻辑处理层数据库其他资源数据持久层 存储层过滤数据显示层数据库操作JFRAMEWORK 2018-11-971.1.1.各层示意图1.1.1.1. WEB 页面请求/返回结
10、果处理过数 据 分 离 层显 示 层 和 数 据 分 离 层 架 构 设 计基 于 B R O W S E R 的 页 面 处 理 技 术一 般 采 用 H T M L + C S S + S C R I P T 的 输 出对 于 要 求 比 较 高 的 可 以 采 用 A P P L E T 技 术 ( 数 据 交 换 协 议 一 般 通 过H T T P / H T T P S 协 议 )B R O W S E RB R O W S E R对 R E Q U E S T 、S E S S I O N 、 A P P数 据 取 得 、 格 式化 、 封 装逻 辑 处 理 层1 . 取 得 离
11、 线 可 序 列 化 的 结 果 集2 . 统 一 错 误判 定 是 否符 合 简 单验 证统 一 错 误 处理否判 断 是 否取 得 预 期结 果统 一 错 误 处理否数 据 结 果 集预 处 理显 示 层产 生 并 格 式化 输 出转 向 处 理过 滤 层JFRAMEWORK 2018-11-981.1.1.2. 逻辑层逻 辑 处 理 层数 据 持 久 层( 表 、 视 图 等基 本 操 作 )数 据 库通 用 数 据 库操 作J N D I / J D B CE M A I L 层其 他 资 源 封装 层E M A I L 资 源J A V A M A I LX M L 资 源D O M
12、 4 J / J A X P / J A X R。 。 。N I O1.1.1.3. 统一错误处理错 误 处 理日 志 分 类 记录错 误 显 示 处理标 题1 。 统 一 错 误 吗 定 义2 。 标 准 的 错 误 显 示 信 息 定 义 ( 可 以 F O R M A T )JFRAMEWORK 2018-11-991.1.1.4. 日志记录输 出 信 息是 否 记 录日 志结 束否日 志 记 录记 录 结 束1.1.2.各层采用 JAVA 技术层 技术方案 采用技术方案显示层 HTMLXMLAPPLETEHTMLAPPLETE显示处理层 JSPJSFJSP+TAGLIBXLSTJSP+
13、TAGLIB应该是离线的结果集过滤层 FILTERLISTENERFILTERLISTENER数据分离层 SERVLET 及相关衍生JSPSERVLET 扩展封装和处理的结果应该是可序列化的数据持久层 CMP 自定义持久层JFRAMEWORK 2018-11-910JDOHIBERNATE自定义日志记录 LOG4JLOGFACTORY(J2SE1.4)LOG4J错误信息定义 BOUDERSOURCE相关技术BOUDERSOURCE国际化语言定义 BOUDERSOURCE BOUDERSOURCEJFRAMEWORK 2018-11-9112. 各层设计2.1.页面层 HTML2.1.1. 页面
14、脚本处理通过规则定义,使用统一脚本处理。以下脚本通过 VBS 实现,请在页面的低端加入:2.1.1.1. Enter to tab 处理通过统一脚本实现。脚本:entertotabs.vbs2.1.1.2. 客户端输入域判断判断内容:值的判断:非空,数字(整数) ,日期,范围,比较。判断规则:通过 title 表示,title 格式组成,通过”|” 分割域 内容名称 提示内容简单判断 _not:不为空_num:数字_d:日期_t:时间_dt:日期+时间_int:整数格式 正则表达式范围 ,分割比较 l|g|n,相关域L:小于 g:大于n:不等于脚本:Checkclient.vbs 的方法 Ch
15、eckclient(x):x:表示 FORM 的名称或序号,返回 BOOLEAN类型方法调用:2.1.1.3. 快捷键的使用定义:快捷键 Id 代号 功能PAGEDOWN(34)PAGEDOWN 下一页PAGEUP(33) PAGEUP 上一页HOME(36) PAGEHOME 首页END( 35) PAGEEND 尾页INSERT(45) DATAINSERT 新增DELETE(46) DATADELETE 删除CTRL+ENTER DATASAVE 保存F9(120) PAGEREFRESH重载页面ESC(27) 关闭本页脚本:entertotab.vbs2.1.1.4. 打印处理通过调用
16、本地 EXCEL 实现,对规则的 table 调用(没有跨行、跨列的)进行页面打印或EXCEL 文档格式导出.脚本:printclient.vbs调用方法:msg_print(bt,table_id,row_start,row_end,col_start,col_end,ym,yj)参数说明:参数 说明bt 标题table_id 要打印表格的 IDrow_start 开始打印的行数如第一行从 0 开始col _end 打印结束的行数:指到最后一行的行数如最后一行为 0col _start 开始打印的列从 0 开始col _end 打印结束的列数:指到最后一列的列数如最后一列为 0 等ym 页眉
17、内容yj 页脚内容JFRAMEWORK 2018-11-9132.1.2. CSS 样式表统一存放在目录 CSS 下样式表body.css 表和连接定义putong_1t.css 仿 XP 风格定义2.1.3. 控件样式控件 CLASS 备注text inputfile inputTEXTAREA InputAreacheckbox checkboxradio radioSELECT Inputselectbutton button2.2.数据处理层 JSP这一层主要是把要显示的数据生成 HTML 格式。分两种方式生成:动态和静态的。动态:JSP/SERVLET 及其相关衍生技术。静态:HTM
18、L。2.2.1. 注意问题 对名称命名和属性的定义见页面 对于 JSP 等页面处理对于数据分离层传递过来的数据应该是离线(最好是序列化) 。对结果集的传递应用 wzresult(已继承 java.sql.resultset),不应在页面中出现资源操作代码(如数据库操作、文件操作、邮件操作等);、数据的处理对结果集的封装应该适用 wztyresult其 GetDisplayLabel 方法可以取得字段对应代码的含义字符集设定 response.setContentType(“text/html; charset=gb2312“); request.setCharacterEncoding(“gb
19、2312“);JFRAMEWORK 2018-11-914在使用 request 和 response 之前,进行设置验证处理 主要是非空判断,其他不做判断错误处理 本层不设错误处理对 NULL 的处理Ob=null?”: Ob对页面的连接 在路径前加上上下文环境变量标准信息的定义 通过在 ApplicationResources.properties 定义错误信息,以msg.html.buttonlabelmenutitle.开头 HTML 其他注意问题使用统一 css 处理对日期和时间的输入,应通过脚本取得2.2.2. 公用变量session 变量名称 含义用户信息请继承 wz.elec.
20、web.pubs.bean. LoginUserIMp用户类_EWORK_SYSTEM_APP_USER SESSION 存储变量全部小写application 变量名称 含义_EWORK_SYSTEM_ORGANIZE_USER 记录在线用户信息:用户编号、用户名称、登陆计算机,登陆时间2.3.数据分离层 SERVLET2.3.1. 注意事项 把提交的数据进行(主要指 request,SESSION,APPLICATION)分离、验证、封装,传递到逻辑层JFRAMEWORK 2018-11-915 把逻辑层返回的结果进行分离、验证(根据错误码,进行错误处理) 、封装,传递到数据结果显示层处理
21、方式: SERVLET 及其相关衍生技术.2.3.2. 错误处理2.3.3. 公用参数wz.elec.web.pubs.webConst Web 端公用参数2.3.4. 样例说明package wz.elec.web.xt.action;功能含义 含义说明 Request 数据首先通过 GETPARMTER 方法取得数据非空判断(null 和”)(验证 )对取得的数据进行格式验证(验证)对取得的数据进行类型转换(验证)对验证和转换完毕的数据按逻辑层需要的格式进行封装(封装) SESSION 和 APPLICATIN 数据逻辑层需要的数据可能来自 SESSION 和 APPLICATIN 变量,
22、这样在分离层取得后,封装传递到逻辑层 通过在 ApplicationResources.properties 定义错误信息,以 error.开头 通过 ActionError 进行错误处理封装 通过 ActionErrors 进行错误结果类的封装,通过saveErrors(request, errors); /保存错误集合到 request 对象 errors.isEmpty 判断是否进行错误处理定义、调用 通过在 ApplicationResources.properties 定义错误信息,以 error.开头 通过 ActionError 进行错误处理封装 通过 ActionErrors
23、进行错误结果类的封装,通过saveErrors(request, errors); /保存错误集合到 request 对象 errors.isEmpty 判断是否进行错误处理 ActionForward(url);进行转向处理JFRAMEWORK 2018-11-916import wz.elec.pubs.action.*;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.
24、HttpServletResponse;import wz.elec.cli.pubs.WzCliOperation;import wz.elec.pubs.WzTyResult;import java.util.HashMap;import java.util.Enumeration;import org.apache.log4j.*;import wz.elec.pubs.action.ActionInitErrors;/* 功能简介:实现通用模块的删除处理* version 2.0* author 原军旗* see Action* since 1.3*/public class FhCo
25、mmonDelextends Action static Logger logger = Logger.getLogger( FhCommonDel.class.getName () ) ;/* 功能简介:处理删除以及删除后转向页面* param mapping The ActionMapping used to select this instance.* param form The optional ActionForm bean for this request.* param request The HTTP Request we are processing.* param res
26、ponse The HTTP Response we are processing.*/public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException request.setCharacterEncoding(“GB2312“);String target = null;String url = null;ActionErrors erro
27、rs = new ActionErrors(); /错误处理类WzCliOperation dataOperate = new WzCliOperation(); /数据操作和EJB调用类WzTyResult resultSet = null; /获得删除结果集/* 数据删除操作开始 */String tableCode = request.getParameter(“tableCode“); /表的名称代码JFRAMEWORK 2018-11-917if (tableCode=null|tableCode=“) errors.add(“error3“, new ActionError(“er
28、ror.param.tableCode.wrong“);return this.ActionForwardS(errors,request,response);String sWhere = “; /查询条件try String str = “;System.out.println(request.getParameter(“T_1“);Enumeration enums = request.getParameterNames();while (enums.hasMoreElements() str = (String) enums.nextElement();/System.out.prin
29、tln(“+str+“);if (str.indexOf(“T_“) != -1) if (request.getParameter(str) != null) sWhere = sWhere + “ + request.getParameter(str) + “,“;if (sWhere = “) sWhere = “;else sWhere = sWhere.substring(0, (sWhere.length() - 1);/System.out.println(“+sWhere+“);HashMap tableRMAP = new HashMap(); /主要填充数据resultSe
30、t = dataOperate.tyRequestDel(tableCode, sWhere, tableRMAP); /得到删除结果if (resultSet.errCode != 0) errors.add(“error2“, new ActionError(“error.ejb.failure“);logger.warn(resultSet.errMsg);return this.ActionForwardS(errors,request,response);Object head = resultSet.getBT(); /得到标题数据Object body = resultSet.g
31、etTA(); /得到表体数据Object set = resultSet.getJH(new Object(); /得到数据集catch (Exception e) errors.add(“error1“, new ActionError(“error.data.del.exception“);logger.error(ActionInitErrors.getProperty(“error.data.del.exception“),e);return this.ActionForwardS(errors,request,response);/* 数据删除操作结束 */JFRAMEWORK 2
32、018-11-918sWhere = request.getParameter(“sWhere“);if (sWhere = null) sWhere = “;saveErrors(request, errors); /保存错误集合到request对象if (!errors.isEmpty() target = “failure“;url = “/error/error.jsp“;else target = “success“;String swh = request.getParameter(“swh“);if (swh = null) swh = “000“;url = “/yk/FhCo
33、mmonSelect.do?tableCode=“ + tableCode + “return new ActionForward(url);2.4.过滤层2.4.1. 过滤 FILTER通过继承 FILTER,进行以下方面的流程传递控制: 权限:判断是否登录、是否允许登录到相关页面等 字符集:对 REQUEST、RESPONSE 等输入输出进行规定的字符设置。 格式转换:对输出或输入的数据进行统一的格式化数据处理。样例package wz.elec.web.pubs.filter;import javax.servlet.ServletResponse;import javax.servle
34、t.Filter;import javax.servlet.ServletException;import javax.servlet.FilterConfig;import javax.servlet.ServletRequest;import javax.servlet.FilterChain;JFRAMEWORK 2018-11-919import java.io.IOException;import javax.servlet.http.*;import wz.elec.web.pubs.bean.LoginUserMap;import javax.servlet.RequestDis
35、patcher;import wz.elec.cli.pubs.WzCliOperation;/* 功能简介:URL 地址过滤器,对 URL 地址进行过滤* 创建日期:2003-1-6* 修改日期:* 修改说明:* 版权所有:Copyright 2003 山东五洲科技开发有限公司, Inc. All rights reserved.* version 2.0* author 原军旗* see Filter* since 1.3*/public class UrlAddressMonitorFilter implements Filterprivate FilterConfig filterCo
36、nfig = null;public final static String url=“invalid“;/* 功能简介:初始化* param filterConfig*/public void init(FilterConfig filterConfig) throws ServletExceptionthis.filterConfig = filterConfig;/* 功能简介:破坏掉*/public void destroy()this.filterConfig = null;/* 功能简介:执行过滤器* param request* param response* param cha
37、in*/public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletExceptionJFRAMEWORK 2018-11-920HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse) response;/* HttpSession session = req.getSessi
38、on(true);LoginUserMap user = (LoginUserMap)session.getAttribute(“userId“);if(user =null)urlForward(request,response,“);/chain.doFilter(req, res);return;*/chain.doFilter(req, res);/* 功能简介:过滤私有方法*/private void urlForward(ServletRequest request, ServletResponse response,String url)throws IOException, S
39、ervletExceptionRequestDispatcher dispath =request.getRequestDispatcher(“/forward.jsp?url=“+url);dispath.forward(request,response);2.4.2. 事件 LISTENERS主要有四个事件名称 解释 备注ServletContextListener 上下文事件 产生、销毁ServletContextAttributeListener上下文属性事件 添加、删除、修改HttpSessionAttributeListener 会话属性事件 添加、删除、修改HttpSession
40、Listener 会话事件 产生、销毁样例package wz.elec.web.pubs.servlet;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSession;import javax.servlet.ServletContextAttributeListener;import java.util.Hashtable;import wz.elec.web.pubs.bean.LoginUserMap;import javax.swing.*;JFRAMEWORK 2018
41、-11-921import java.util.*;/* 功能简介:SESSION 变量的参数处理,主要用于登录模块的监听处理* 创建日期:2003-12-25* 修改日期:* 修改说明:* 版权所有:Copyright 2003 山东五洲科技开发有限公司, Inc. All rights reserved.* version 2.0* author 原军旗* see HttpSessionAttributeListener* since 1.3*/public class LoginSessionAttributeListener implements javax.servlet.http.
42、HttpSessionAttributeListenerprivate HttpSession session = null;private String name = null;/* SESSION 参数添加操作* param event 监听参数添加处理*/public void attributeAdded(HttpSessionBindingEvent event)name = event.getName();session = event.getSession();if(name.equals(“userId“)Hashtable users = (Hashtable)event.g
43、etSession().getServletContext().getAttribute(“users“);if(users != null)if(!users.containsKey(event.getValue()users.put(event.getValue(),session);event.getSession().getServletContext().setAttribute(“users“,users);/* 功能简介:SESSION 参数注销操作* param event 监听参数注销处理*/public void attributeRemoved(HttpSessionBi
44、ndingEvent event)JFRAMEWORK 2018-11-922name = event.getName();if(name.equals(“userId“)Hashtable users = (Hashtable)event.getSession().getServletContext().getAttribute(“users“);if(users != null)HttpSession session = (HttpSession)users.get(event.getValue();if(session != null)users.remove(event.getValu
45、e();event.getSession().getServletContext().setAttribute(“users“,users);session = event.getSession();/* 功能简介:SESSION 参数取代操作* param event 监听参数取代处理*/public void attributeReplaced(HttpSessionBindingEvent event)name = event.getName();if(name.equals(“userId“)session = event.getSession();System.out.println
46、(event.getValue().getClass().getName();LoginUserMap old = (LoginUserMap)event.getValue();Hashtable users = (Hashtable)event.getSession().getServletContext().getAttribute(“users“);if(old != null)users.remove(old);users.put(session.getAttribute(name),session);event.getSession().getServletContext().set
47、Attribute(“users“,users);JFRAMEWORK 2018-11-9232.5.逻辑层2.5.1.调用数据库操作一般不提倡直接调用数据库连接;通过 JNDI 方式进行数据库连接和数据库连接池的处理。数 据 库 调 用持 久 类d b o p e r a t i o n类数 据 库 资源d b o p e r a t i o n类其 他 操 作2.5.2.调用 EMAIL 操作低层调用标准的 JAVAMAIL 进行邮件收发操作。JFRAMEWORK 2018-11-924E M A I L 操 作S e n d M a i lE M A I L 服 务 器 发 件 人 收
48、件 人 标 题 内 容 附 件选 择 邮 件 格 式0 。 文 本1 。 H T M L发 送S E N D2.5.3. 参数传递说明 参数传递传入参数和返回参数一般要求是可序列化的。如不要传输httpservletrequest 等 结果集封装对有多个数据集的结果 WzResult,可以通过 WzTyResult 进行封装。2.5.4. 错误处理错误要进行分类处理,已知通过熟悉语言提示给用户,避免提示系统原生错误。一般错误需经过以下类处理 wzServerErr对 DebugWhere 变量进行设置以便调式信息 .package wz.elec.pubs;import java.text.*
49、;import javax.naming.*;JFRAMEWORK 2018-11-925import java.io.*;import java.sql.*;public final class wzServerErr /* 调试信息用:默认不显示出错位置*/public static boolean DebugWhere=true;/* ejb 主键重复信息处理*/public static String getDuplicateKeyErr(String fmt,Object value) if(fmt=null|(fmt.trim().equals(“) throw new ArrayIndexOutOfBoundsException(“fmt 参数: 不合法!“);if(value=null | value.l