1、JFRAMEWORK2024-11-16JFRAMEWORK架构设计编撰:赵万刚目录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.页面层HTML112.1.1.页面脚本处理112.1.1.1.Enter to tab处理112.1.1.2.客户端输入域判断112.1.1.3.快捷键的使用122.1.1.4.打印处理122.1.2.CSS样式表132.1.3.控件样式132.2.数据处理层
2、JSP132.2.1.注意问题132.2.2.公用变量142.3.数据分离层SERVLET142.3.1.注意事项142.3.2.错误处理152.3.3.公用参数152.3.4.样例说明152.4.过滤层182.4.1.过滤FILTER182.4.2.事件LISTENERS202.5.逻辑层222.5.1.调用数据库操作222.5.2.调用EMAIL操作232.5.3.参数传递说明242.5.4.错误处理242.5.5.公用参数282.6.持久层292.6.1.数据库操作部分292.6.2.离线数据集WzResult302.6.3.结果封装集WzTyResult312.6.4.持久类规范312
3、.7.配置文件342.7.1.信息配置文件ApplicationResources.properties352.7.2.标记库配置文件DTHTML.TLD352.7.3.WEB配置文件WEB.XML(固有)352.7.4.日志配置文件LOG4J.properties392.7.5.应用服务器配置和发布402.7.5.1.RESIN配置文件RESIN.properties(应用服务器相关)402.7.5.2.TOMCAT412.7.6.持久生成器主类MANIFEST.MF432.7.7.配置文件CONFIG.XML432.7.8.数据库SQL配置文件CONFIGSQL.XML482.8.测试49
4、2.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.一般程序名字约定663.1.1.2.数据库命名约定673.1.1.3.WEB673.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
5、.2.数据库设计754.3.3.通用维护774.3.4.复合通用维护774.3.4.1.功能774.3.4.2.web端设计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端调用流程说明784.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.发
6、送90A simple text email90Sending emails with attachments90Sending HTML formatted email92Debugging93Authentication93Handling Bounced Messages944.5.1.2.接收954.6.压缩(公用包)954.6.1.1.压缩954.6.1.2.解压951. 系统设计架构说明本系统设计主要是概要设计,具体详细设计见:详细设计名称开发工具程序UMLDcework2TOGAHTER 6数据库建模DCEWORK2DBSYBASE PowerDesign10程序开发DCJFRA
7、MEWORKPERBORLAND JBUILERX WEB.WARDCWEB.WARBORLAND JBUILERXJAVA基类包DCJFRAMEWORK.JARBORLAND JBUILERX持久层生成器DCJFRAMEWORKPER.EXEBORLAND JBUILERX代码生成器DCJFRAMEWORKPER.EXEBORLAND JBUILERXJAVA帮助DCEWORK2DOC开发工具工具名称备注TOGAHTER 6JAVA程序UMLSYBASE POWLERDESIGNER10数据库建模BORLAND JBUILERXJAVA程序开发DCJFRAMEWORKPER.EXE持久层生成
8、器DCJFRAMEWORKPER.EXE代码生成器PLSQL Developer数据库调试工具Visio2003 流程开发工具RESIN2 运行环境1.1. 总体架构示意图1.1.1. 各层示意图1.1.1.1. WEB页面请求/返回结果处理过1.1.1.2. 逻辑层1.1.1.3. 统一错误处理1.1.1.4. 日志记录1.1.2. 各层采用JAVA技术层技术方案采用技术方案显示层HTMLXMLAPPLETEHTMLAPPLETE显示处理层JSPJSFJSP+TAGLIBXLSTJSP+TAGLIB应该是离线的结果集过滤层FILTERLISTENERFILTERLISTENER数据分离层SE
9、RVLET及相关衍生JSPSERVLET扩展封装和处理的结果应该是可序列化的数据持久层CMPJDOHIBERNATE自定义自定义持久层日志记录LOG4JLOGFACTORY(J2SE1.4)LOG4J错误信息定义BOUDERSOURCE相关技术BOUDERSOURCE国际化语言定义 BOUDERSOURCEBOUDERSOURCE2. 各层设计2.1. 页面层HTML2.1.1. 页面脚本处理通过规则定义,使用统一脚本处理。以下脚本通过VBS实现,请在页面的低端加入:2.1.1.1. Enter to tab处理通过统一脚本实现。脚本:entertotabs.vbs2.1.1.2. 客户端输入
10、域判断判断内容:值的判断:非空,数字(整数),日期,范围,比较。判断规则:通过title表示,title格式组成,通过”|”分割域内容名称提示内容简单判断_not:不为空_num:数字_d:日期_t:时间_dt:日期+时间_int:整数格式正则表达式范围,分割比较l|g|n,相关域L:小于 g:大于n:不等于脚本:Checkclient.vbs的方法Checkclient(x):x:表示FORM的名称或序号,返回BOOLEAN类型方法调用:2.1.1.3. 快捷键的使用定义:快捷键Id代号功能PAGEDOWN(34)PAGEDOWN下一页PAGEUP(33)PAGEUP上一页HOME(36)P
11、AGEHOME首页END(35)PAGEEND尾页INSERT(45)DATAINSERT新增DELETE(46)DATADELETE删除CTRL+ENTERDATASAVE保存F9(120)PAGEREFRESH重载页面ESC(27)关闭本页脚本:entertotab.vbs2.1.1.4. 打印处理通过调用本地 EXCEL实现,对规则的table调用(没有跨行、跨列的)进行页面打印或EXCEL文档格式导出.脚本:printclient.vbs调用方法:msg_print(bt,table_id,row_start,row_end,col_start,col_end,ym,yj)参数说明:参
12、数说明bt标题table_id要打印表格的IDrow_start开始打印的行数如第一行从0开始col _end打印结束的行数:指到最后一行的行数如最后一行为0col _start开始打印的列从0开始col _end打印结束的列数:指到最后一列的列数如最后一列为0等ym页眉内容yj页脚内容2.1.2. CSS样式表统一存放在目录CSS下样式表body.css表和连接定义putong_1t.css仿XP风格定义2.1.3. 控件样式控件CLASS备注textinputfileinputTEXTAREAInputAreacheckboxcheckboxradioradioSELECTInputsel
13、ectbuttonbutton2.2. 数据处理层JSP这一层主要是把要显示的数据生成HTML格式。分两种方式生成:动态和静态的。动态:JSP/SERVLET及其相关衍生技术。静态:HTML。2.2.1. 注意问题l 对名称命名和属性的定义见页面l 对于JSP等页面处理数据的处理对于数据分离层传递过来的数据应该是离线(最好是序列化)。对结果集的传递应用wzresult(已继承java.sql.resultset),不应在页面中出现资源操作代码(如数据库操作、文件操作、邮件操作等);、对结果集的封装应该适用wztyresult其GetDisplayLabel方法可以取得字段对应代码的含义字符集设
14、定l l l response.setContentType(text/html; charset=gb2312);l request.setCharacterEncoding(gb2312);在使用request和response之前,进行设置验证处理主要是非空判断,其他不做判断错误处理本层不设错误处理对NULL的处理Ob=null?”: Ob对页面的连接在路径前加上上下文环境变量标准信息的定义l 通过在ApplicationResources.properties定义错误信息,以msg.html.buttonlabelmenutitle.开头l l HTML l 其他注意问题使用统一css
15、处理对日期和时间的输入,应通过脚本取得2.2.2. 公用变量session变量名称含义用户信息请继承wz.elec.web.pubs.bean. LoginUserIMp用户类_EWORK_SYSTEM_APP_USERSESSION存储变量全部小写application变量名称含义_EWORK_SYSTEM_ORGANIZE_USER记录在线用户信息:用户编号、用户名称、登陆计算机,登陆时间2.3. 数据分离层SERVLET2.3.1. 注意事项l 把提交的数据进行(主要指request,SESSION,APPLICATION)分离、验证、封装,传递到逻辑层功能含义含义说明l Request
16、数据首先通过GETPARMTER方法取得数据非空判断(null和”)(验证)对取得的数据进行格式验证(验证)对取得的数据进行类型转换(验证)对验证和转换完毕的数据按逻辑层需要的格式进行封装(封装)l SESSION和APPLICATIN数据 逻辑层需要的数据可能来自SESSION和APPLICATIN变量,这样在分离层取得后,封装传递到逻辑层l 通过在ApplicationResources.properties定义错误信息,以error.开头l 通过 ActionError进行错误处理封装l 通过 ActionErrors进行错误结果类的封装,通过saveErrors(request, er
17、rors); /保存错误集合到request对象l errors.isEmpty 判断是否进行错误处理 l 把逻辑层返回的结果进行分离、验证(根据错误码,进行错误处理)、封装,传递到数据结果显示层处理方式: SERVLET及其相关衍生技术.2.3.2. 错误处理定义、调用l 通过在ApplicationResources.properties定义错误信息,以error.开头l 通过 ActionError进行错误处理封装l 通过 ActionErrors进行错误结果类的封装,通过saveErrors(request, errors); /保存错误集合到request对象l errors.isE
18、mpty 判断是否进行错误处理l ActionForward(url);进行转向处理2.3.3. 公用参数wz.elec.web.pubs.webConstWeb端公用参数2.3.4. 样例说明package wz.elec.web.xt.action;import wz.elec.pubs.action.*;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServ
19、letResponse;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 FhCom
20、monDel extends 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. * p
21、aram response 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; Act
22、ionErrors errors = new ActionErrors(); /错误处理类 WzCliOperation dataOperate = new WzCliOperation(); /数据操作和EJB调用类 WzTyResult resultSet = null; /获得删除结果集 /* 数据删除操作开始 */ String tableCode = request.getParameter(tableCode); /表的名称代码 if (tableCode=null|tableCode=) errors.add(error3, new ActionError(error.param
23、.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.println(+st
24、r+); 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(); /主要填充数据 resultSet = dataOpera
25、te.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.getTA(); /得到表
26、体数据 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); /* 数据删除操作结束 */ sWhere = request.getPara
27、meter(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/FhCommonSelect.do?tableCode= + tableCode + &
28、sWhere= + sWhere + &swh= + swh; return new ActionForward(url); 2.4. 过滤层2.4.1. 过滤FILTER通过继承FILTER,进行以下方面的流程传递控制:l 权限:判断是否登录、是否允许登录到相关页面等l 字符集:对REQUEST、RESPONSE等输入输出进行规定的字符设置。l 格式转换:对输出或输入的数据进行统一的格式化数据处理。样例package wz.elec.web.pubs.filter;import javax.servlet.ServletResponse;import javax.servlet.Filter
29、;import javax.servlet.ServletException;import javax.servlet.FilterConfig;import javax.servlet.ServletRequest;import javax.servlet.FilterChain;import java.io.IOException;import javax.servlet.http.*;import wz.elec.web.pubs.bean.LoginUserMap;import javax.servlet.RequestDispatcher;import wz.elec.cli.pub
30、s.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 Filter private FilterConfig filterConfig = null; public f
31、inal static String url=invalid; /* * 功能简介:初始化 * param filterConfig */ public void init(FilterConfig filterConfig) throws ServletException this.filterConfig = filterConfig; /* * 功能简介:破坏掉 */ public void destroy() this.filterConfig = null; /* * 功能简介:执行过滤器 * param request * param response * param chain
32、*/ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; /* HttpSession session = req.getSession(true); LoginUserM
33、ap 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, ServletExcep
34、tion RequestDispatcher dispath =request.getRequestDispatcher(/forward.jsp?url=+url); dispath.forward(request,response); 2.4.2. 事件LISTENERS主要有四个事件名称解释备注ServletContextListener上下文事件产生、销毁ServletContextAttributeListener上下文属性事件添加、删除、修改HttpSessionAttributeListener会话属性事件添加、删除、修改HttpSessionListener会话事件产生、销毁样
35、例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.*;import java.util.*;/* * 功能简介:SESSIO
36、N变量的参数处理,主要用于登录模块的监听处理 * 创建日期: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.HttpSessionAttributeListener pri
37、vate 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.getSession().getServletC
38、ontext().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(HttpSessionBindingEvent event)
39、name = 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.getValue(); event.getSession().getServletContext().setAttribute(users,users); session = event.getSession(); /* * 功能简介:SESSION参数取代操作 * param event 监听参数取代处理 */ public void attributeReplaced(HttpSessi