资源描述
JFRAMEWORK 2024-11-16
JFRAMEWORK架构设计
编撰:赵万刚
目录
1. 系统设计架构说明 5
1.1. 总体架构示意图 6
1.1.1. 各层示意图 7
1.1.1.1. WEB页面请求/返回结果处理过 7
1.1.1.2. 逻辑层 8
1.1.1.3. 统一错误处理 8
1.1.1.4. 日志记录 9
1.1.2. 各层采用JAVA技术 9
2. 各层设计 11
2.1. 页面层HTML 11
2.1.1. 页面脚本处理 11
2.1.1.1. Enter to tab处理 11
2.1.1.2. 客户端输入域判断 11
2.1.1.3. 快捷键的使用 12
2.1.1.4. 打印处理 12
2.1.2. CSS样式表 13
2.1.3. 控件样式 13
2.2. 数据处理层JSP 13
2.2.1. 注意问题 13
2.2.2. 公用变量 14
2.3. 数据分离层SERVLET 14
2.3.1. 注意事项 14
2.3.2. 错误处理 15
2.3.3. 公用参数 15
2.3.4. 样例说明 15
2.4. 过滤层 18
2.4.1. 过滤FILTER 18
2.4.2. 事件LISTENERS 20
2.5. 逻辑层 22
2.5.1. 调用数据库操作 22
2.5.2. 调用EMAIL操作 23
2.5.3. 参数传递说明 24
2.5.4. 错误处理 24
2.5.5. 公用参数 28
2.6. 持久层 29
2.6.1. 数据库操作部分 29
2.6.2. 离线数据集WzResult 30
2.6.3. 结果封装集WzTyResult 31
2.6.4. 持久类规范 31
2.7. 配置文件 34
2.7.1. 信息配置文件ApplicationResources.properties 35
2.7.2. 标记库配置文件DTHTML.TLD 35
2.7.3. WEB配置文件WEB.XML(固有) 35
2.7.4. 日志配置文件LOG4J.properties 39
2.7.5. 应用服务器配置和发布 40
2.7.5.1. RESIN配置文件RESIN.properties(应用服务器相关) 40
2.7.5.2. TOMCAT 41
2.7.6. 持久生成器主类MANIFEST.MF 43
2.7.7. 配置文件CONFIG.XML 43
2.7.8. 数据库SQL配置文件CONFIGSQL.XML 48
2.8. 测试 49
2.8.1. 说明 49
2.8.2. 测试文件命名 49
2.8.3. JUNIT说明 49
2.8.3.1. JUNIT架构说明 49
2.8.3.2. 样例文件 60
3. 系统开发约定 66
3.1. 程序命名约定 66
3.1.1.1. 一般程序名字约定 66
3.1.1.2. 数据库命名约定 67
3.1.1.3. WEB 67
3.2. 书写规范 68
3.2.1.1. 数据库 68
3.2.1.2. Java书写规范 69
备注 69
Java 文件样式约定 70
一般性编程约定 72
3.2.1.3. Web 73
网页 73
4. 各模块设计 74
4.1. 持久层生成器 74
4.1.1. 格式化信息定义 74
4.2. JAVA类路径 74
4.3. 通用维护 75
4.3.1. 设计目的 75
4.3.2. 数据库设计 75
4.3.3. 通用维护 77
4.3.4. 复合通用维护 77
4.3.4.1. 功能 77
4.3.4.2. web端设计 77
4.3.4.2.1. 初始化 77
4.3.4.2.1.1. 子表查询参数初始化原则 78
4.3.4.2.1.2. 隐含字段初始化原则 78
4.3.4.2.1.3. 默认查询条件原则 78
4.3.4.2.1.4. spcid取得 78
4.3.4.2.2. Web端调用流程说明 78
4.3.4.2.3. 样例说明 79
4.4. servlet集成类 86
4.4.1. 验证信息配置 86
4.4.1.1. 样例文件 86
4.4.2. 调用方法 87
4.4.3. 样例文件 87
4.5. 外部邮件(公用包) 90
4.5.1.1. 发送 90
A simple text email 90
Sending emails with attachments 90
Sending HTML formatted email 92
Debugging 93
Authentication 93
Handling Bounced Messages 94
4.5.1.2. 接收 95
4.6. 压缩(公用包) 95
4.6.1.1. 压缩 95
4.6.1.2. 解压 95
1. 系统设计架构说明
本系统设计主要是概要设计,具体详细设计见:
详细设计
名称
开发工具
程序UML
Dcework2
TOGAHTER 6
数据库建模
DCEWORK2DB
SYBASE PowerDesign10
程序开发
DCJFRAMEWORKPER
BORLAND JBUILERX
WEB.WAR
DCWEB.WAR
BORLAND JBUILERX
JAVA基类包
DCJFRAMEWORK.JAR
BORLAND JBUILERX
持久层生成器
DCJFRAMEWORKPER.EXE
BORLAND JBUILERX
代码生成器
DCJFRAMEWORKPER.EXE
BORLAND JBUILERX
JAVA帮助
DCEWORK2DOC
开发工具
工具名称
备注
TOGAHTER 6
JAVA程序UML
SYBASE POWLERDESIGNER10
数据库建模
BORLAND JBUILERX
JAVA程序开发
DCJFRAMEWORKPER.EXE
持久层生成器
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技术
层
技术方案
采用技术方案
显示层
HTML
XML
APPLETE
HTML
APPLETE
显示处理层
JSP
JSF
JSP+TAGLIB
XLST
JSP+TAGLIB
应该是离线的结果集
过滤层
FILTER
LISTENER
FILTER
LISTENER
数据分离层
SERVLET及相关衍生
JSP
SERVLET扩展
封装和处理的结果应该是可序列化的
数据持久层
CMP
JDO
HIBERNATE
自定义
自定义持久层
日志记录
LOG4J
LOGFACTORY(J2SE1.4)
LOG4J
错误信息定义
BOUDERSOURCE
相关技术
BOUDERSOURCE
国际化语言定义
BOUDERSOURCE
BOUDERSOURCE
2. 各层设计
2.1. 页面层HTML
2.1.1. 页面脚本处理
通过规则定义,使用统一脚本处理。
以下脚本通过VBS实现,请在页面的低端加入:
<script language="vbScript" src="脚本名称">
</script>
2.1.1.1. Enter to tab处理
通过统一脚本实现。
脚本:entertotabs.vbs
2.1.1.2. 客户端输入域判断
判断内容:值的判断:非空,数字(整数),日期,范围,比较。
判断规则:通过title表示,title格式组成,通过”|”分割
域
内容
名称
提示内容
简单判断
_not:不为空
_num:数字
_d:日期
_t:时间
_dt:日期+时间
_int:整数
格式
正则表达式
范围
,分割
比较
[l|g|n],相关域
L:小于
g:大于
n:不等于
脚本:Checkclient.vbs的方法Checkclient(x):x:表示FORM的名称或序号,返回BOOLEAN类型
方法调用:<input name="DATASAVE" id=”DATASAVE” type="submit" accesskey= “s” title="快捷键(CTRL+ENTER)" onclick="return checkclient(0)" value="保存" language="JavaScript">
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.vbs
2.1.1.4. 打印处理
通过调用本地 EXCEL实现,对规则的table调用(没有跨行、跨列的)进行页面打印或EXCEL文档格式导出.
脚本:printclient.vbs
调用方法:msg_print(bt,table_id,row_start,row_end,col_start,col_end,ym,yj)
参数说明:
参数
说明
bt
标题
table_id
要打印表格的ID
row_start
开始打印的行数
如第一行从0开始
col _end
打印结束的行数:指到最后一行的行数
如最后一行为0
col _start
开始打印的列
从0开始
col _end
打印结束的列数:指到最后一列的列数
如最后一列为0等
ym
页眉内容
yj
页脚内容
2.1.2. CSS样式表
统一存放在目录CSS下
样式表
body.css
表和连接定义
putong_1t.css
仿XP风格定义
2.1.3. 控件样式
控件
CLASS
备注
text
input
file
input
TEXTAREA
InputArea
checkbox
checkbox
radio
radio
SELECT
Inputselect
button
button
2.2. 数据处理层JSP
这一层主要是把要显示的数据生成HTML格式。
分两种方式生成:动态和静态的。
动态:JSP/SERVLET及其相关衍生技术。
静态:HTML。
2.2.1. 注意问题
l 对名称命名和属性的定义见《页面》
l 对于JSP等页面处理
数据的处理
对于数据分离层传递过来的数据应该是离线(最好是序列化)。
对结果集的传递应用wzresult(已继承java.sql.resultset),不应在页面中出现资源操作代码(如数据库操作、文件操作、邮件操作等);、
对结果集的封装应该适用wztyresult
其GetDisplayLabel方法可以取得字段对应代码的含义
字符集设定
l <%@ page contentType="text/html; charset=gb2312" %>
l <%@ page pageEncoding="GB2312"%>
l response.setContentType("text/html; charset=gb2312");
l request.setCharacterEncoding("gb2312");
在使用request和response之前,进行设置
验证处理
主要是非空判断,其他不做判断
错误处理
本层不设错误处理
对NULL的处理
Ob==null?””: Ob
对页面的连接
在路径前加上<%=request.getContextPath()%>上下文环境变量
标准信息的定义
l 通过在ApplicationResources.properties定义错误信息,以msg.html.[button][label][menu][title].开头
l <dchtml:messages key="error.data.del.exception" />
l HTML
<META http-equiv="Content-Type" content="text/html; charset=gb2312">
l 其他注意问题
使用统一css处理
对日期和时间的输入,应通过脚本取得
2.2.2. 公用变量
session变量
名称
含义
用户信息请继承wz.elec.web.pubs.bean. LoginUserIMp
用户类
__EWORK_SYSTEM_APP_USER
SESSION存储变量
全部小写
application变量
名称
含义
_EWORK_SYSTEM_ORGANIZE_USER
记录在线用户信息:用户编号、用户名称、登陆计算机,登陆时间
2.3. 数据分离层SERVLET
2.3.1. 注意事项
l 把提交的数据进行(主要指request,SESSION,APPLICATION)分离、验证、封装,传递到逻辑层
功能含义
含义
说明
l Request数据
首先通过GETPARMTER方法取得数据
非空判断(null和””)(验证)
对取得的数据进行格式验证(验证)
对取得的数据进行类型转换(验证)
对验证和转换完毕的数据按逻辑层需要的格式进行封装(封装)
l SESSION和APPLICATIN数据
逻辑层需要的数据可能来自SESSION和APPLICATIN变量,这样在分离层取得后,封装传递到逻辑层
l 通过在ApplicationResources.properties定义错误信息,以error.开头
l 通过 ActionError进行错误处理封装
l 通过 ActionErrors进行错误结果类的封装,通过saveErrors(request, errors); //保存错误集合到request对象
l errors.isEmpty 判断是否进行错误处理
l 把逻辑层返回的结果进行分离、验证(根据错误码,进行错误处理)、封装,传递到数据结果显示层
处理方式: SERVLET及其相关衍生技术.
2.3.2. 错误处理
定义、调用
l 通过在ApplicationResources.properties定义错误信息,以error.开头
l 通过 ActionError进行错误处理封装
l 通过 ActionErrors进行错误结果类的封装,通过saveErrors(request, errors); //保存错误集合到request对象
l errors.isEmpty 判断是否进行错误处理
l ActionForward(url);进行转向处理
2.3.3. 公用参数
wz.elec.web.pubs.webConst
Web端公用参数
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.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 FhCommonDel
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.
* @param 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;
ActionErrors 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.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("["+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(); //主要填充数据
resultSet = 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.getTA(); //得到表体数据
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.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/FhCommonSelect.do?tableCode=" + tableCode + "&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;
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.pubs.WzCliOperation;
/**
* 功能简介:URL地址过滤器,对URL地址进行过滤
* <p>创建日期:2003-1-6
* <p>修改日期:
* <p>修改说明:
* <p>版权所有: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 final 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
*/
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);
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, ServletException{
RequestDispatcher dispath =request.getRequestDispatcher("/forward.jsp?url="+url);
dispath.forward(request,response);
}
}
2.4.2. 事件LISTENERS
主要有四个事件
名称
解释
备注
ServletContextListener
上下文事件
产生、销毁
ServletContextAttributeListener
上下文属性事件
添加、删除、修改
HttpSessionAttributeListener
会话属性事件
添加、删除、修改
HttpSessionListener
会话事件
产生、销毁
样例
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.*;
/**
* 功能简介:SESSION变量的参数处理,主要用于登录模块的监听处理
* <p>创建日期:2003-12-25
* <p>修改日期:
* <p>修改说明:
* <p>版权所有:Copyright 2003 山东五洲科技开发有限公司, Inc. All rights reserved.
* @version 2.0
* @author 原军旗
* @see HttpSessionAttributeListener
* @since 1.3
*/
public class LoginSessionAttributeListener implements javax.servlet.http.HttpSessionAttributeListener
{
private 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().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(HttpSessionBindingEvent event)
{
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
展开阅读全文