联系人:王先生
手机:13651070328
QQ:29803446
Email:[email protected]
说明:因上传图片不方便,需要本文文档的请联系我或者从csdn中下载我上传的文件OpenJWeb_v1_6_代码生成器.PDF
目 录
OpenJWeb V1.6采用的主框架为Struts2+Spring+Hibernate+Spring Security,后台管理页面可使用平台的代码生成器来生成。在平台中定义好一个数据库表结构后,可生成对应的数据库表,Java实体类代码,Hibernate配置文件,struts2的action配置,编辑页面和列表页面、Struts2 Action类等,并在线调用ant进行编译。
子系统对应的数据库表为comm_sub_system,目前定义了以下子系统:
SYS_CODE |
SYS_NAME |
COMM |
基础平台 |
CRM |
客户关系管理 |
WF |
流程控制 |
每个子系统都对应一个Struts2的命名空间,命名空间和子系统的对应关系见下表,其中命名空间的命名规则为子系统编码(SYS_CODE)的小写字母,见下表:
子系统编码 |
子系统名称 |
命名空间 |
对应strut2配置文件 |
COMM |
基础平台 |
comm |
struts-comm.xml |
CRM |
客户关系管理 |
crm |
struts-crm.xml |
WF |
工作流 |
wf |
struts-wf.xml |
HR |
人力资源 |
hr |
struts-hr.xml |
D:/project/openjweb/src/java /struts.xml的内容:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="struts-default.xml"/>
<include file="struts-comm.xml"/>
<include file="struts-crm.xml"/>
<include file="struts-hr.xml"/>
<include file="struts-wf.xml"/>
</struts>
每增加一个子系统,都要在这里声明一个配置文件,并在同目录下创建一个对应的struts-开头的配置文件,例如struts-hr.xml,内容格式:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="hr" extends="struts-default" namespace="/hr">
<!-- insert new action -->
</package>
</struts>
请注意不要删除<!-- insert new action -->,因为平台生成action配置的时候自动寻找<!-- insert new action -->作为插入点。
图2-1 表结构定义
操作说明:
点“增加”按钮建一新记录,表结构命名统一为小写英文字母加下划线,表结构应以系统为前缀命名,实体类的package为org.openjweb.core.entity(目前暂时使用固定的package,以后用户可指定其他package),实体类为类名规则:首字母大写,表名的下划线后的第一个字母大写,并去掉下划线,例如comm_user表对应的类名为CommUser,包含package的完整类名为org.openjweb.core.entity.CommUser。
勾选一行记录,点建表可创建表结构,但目前表结构还没有定义,参考下一节表字段定义。
说明:目前建表语句采用的是Oracle的格式,暂未编写对其他关系数据库的建表语句。
图2-2 表字段定义
图2-3 页面属性
填写表字段注意事项:
(1) 类属性名的命名规则为字段名去掉下划线,并将下划线后的第一个字母改为大写,不要随意对类属性名命名,否则会出现问题。(以后类属性名改为由系统自动生成)
(2) 数据库属性中标签中,表名,表字段名,表字段中文名,类属性名,字段类型必须填写,字段长度也需要填写(目前系统提供了字符串和数字类型的,日期类的字段也是字符串类型),当字段为带小数字段时,小数位数也需要填写。
(3) 页面属性标签中定义了生成页面所需要的一些配置,页面输入方式中,弹出窗口、单选择按钮、复选框暂未实现。如果页面中显示文本框,则页面输入方式可空,系统认为文本框是默认的输入方式;如果页面输入为下拉选择,则应选择一个数据字典类型;列表页面显示和编辑页面显示分别表示生成页面时,是否在列表和编辑页面中显示这个字段。
(4) 此页面上有两个保存按钮,上面的保存按钮是保存整个列表的,下面是保存当前编辑列的。
(5) 以下字段不需要定义,平台会自动生成,包括:
列名 |
中文含义 |
类型 |
说明 |
pk_id |
主键 |
Varchar2(20) |
主键,每个表都有一个pk_id主键。 |
row_id |
唯一行号 |
Varchar2(40) |
非空,32位UUID格式 |
sort_no |
排序字段 |
NUMBER(16) |
此字段存储排序顺序 |
create_dt |
创建日期 |
VARCHAR2(23) |
日期时分秒格式 |
create_uid |
创建日期 |
VARCHAR2(23) |
创建人 |
update_dt |
最后修改日期 |
VARCHAR2(23) |
日期时分秒 |
update_uid |
最后修改人 |
VARCHAR2(23) |
最后修改人 |
data_flg |
数据状态 |
VARCHAR2(6) |
0初始1正式2逻辑删除… |
flow_status |
流程状态位 |
Varchar2(16) |
用于工作流 |
flow_title |
流程实例标题 |
Varchar2(100) |
用于工作流显示待办任务使用 |
参考2.2.1,当表字段定义完毕,勾选一个表,点“建表”按钮。如果操作成功,则会弹出操作成功的JS提示窗口,否则出现操作失败的JS提示窗口。建表过程系统生成了哪些内容?
(1) 在comm_column_def中增加2.2.2中列出的表字段的定义信息。
(2) 在数据库中创建了对应的数据库表。
(3) 生成了此表对应的Hibernate配置文件和POJO类。位于D:/project/openjweb/src/java/org/openjweb/core/entity目录。
(4) 在D:/project/openjweb/src/java/core-service-demo.xml中,增加了hibernate映射
文件的声明,见下文:
<property name="mappingResources">
<list>
<value>org/openjweb/core/entity/CommUser.hbm.xml</value>
<!--OpenJWebGenerator-->
</list>
</property>
说明:
(1) 请不要删除<!--OpenJWebGenerator-->标志,因为平台将<!--OpenJWebGenerator-->作为插入点标志。
(2) 如果重复建表操作,需要手工删除表。这是出于安全角度考虑,以免误删数据库表。
目前平台可生成单表的增删改查页面。主明细页面的生成正在开发中。操作过程:
(1) 功能定义:
图2.4 功能定义列表页面
图2.5 功能定义编辑页面
URL地址:/namespace/list类名.action,例如表wf_mywork对应的URL为:/wf/listWfMywork.action
实体类名:表的下拉,选择一个想要生成增删改查页面的表。
所属子系统:选择不同的子系统,则生成的jsp页面的存放位置不同,jsp生成的路径位于:
D:/project/openjweb/webapps/WEB-INF/jsp/命名空间/,例如工作流系统命名空间为wf,则jsp路径为D:/project/openjweb/webapps/WEB-INF/jsp/wf/。
Action路径:系统会根据action的package自动在指定的目录下创建action类。
DB Service Bean:指定一个Spring的Bean Service用于数据库访问,目前只配置了IDBSupportService3。所以必须填写IDBSupportService3。
(2) 配置好上述内容后,在列表中点“生成代码”,系统会首先创建代码后,自动调用在线编译功能(系统会弹出提示窗口,最终编译成功后,系统自动装载新编译的类,此时连前面生成的建表时生成的实体类一起编译)。此步骤操作会生成以下内容:
l 列表和编辑JSP页面,如D:/project/openjweb/webapps/WEB-INF/jsp/wf/下的listWfMywork.jsp和editWfMywork.jsp。
l Action类,参考D:/project/openjweb/src/java/org/openjweb/core/action目录下的WfMyworkAction.java,内容如下(由平台生成的Action源代码):
package org.openjweb.core.action;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.log4j.Logger;
import org.openjweb.core.entity.WfMywork;
import org.openjweb.core.action.PageAction;
import org.openjweb.core.entity.CommUser;
import org.openjweb.core.pageloader.PageLoaderImpl;
import org.openjweb.core.service.IDBSupportService;
import org.openjweb.core.service.ServiceLocator;
import org.openjweb.core.util.DropdownListBoxUtil;
import org.openjweb.core.util.StringUtil;
import org.springframework.dao.DataAccessException;
import org.springframework.security.context.SecurityContextHolder;
public class WfMyworkAction extends PageAction
{
private static final Logger logger = Logger.getLogger(WfMyworkAction.class);
化
private String nameSpaceActionName ="/wf/listWfMywork";//需要在子类中初始化
private String selId="";//当编辑一条记录时,选择的ID号
private WfMywork editEntity = new WfMywork(); //待编辑的实体
private String register="";
public void setRegister(String value)
{
this.register = register;
}
public String getRegister()
{
return this.register;
}
public void setEditEntity(WfMywork entity)
{
this.editEntity = entity;
}
public WfMywork getEditEntity()
{
return this.editEntity;
}
public void setSelId(String id)
{
this.selId = id;
}
public String getSelId()
{
return this.selId;
}
public String getNameSpaceActionName()
{
return this.nameSpaceActionName;
}
protected void initAction()
{
this.setEntityClassName("org.openjweb.core.entity.WfMywork");
this.setDbService("IDBSupportService3");
//设置查询前内容
if(this.getPageLoader()==null||this.getPageLoader().getEntityClassName().trim().length()==0)
{
this.setPageLoader( new PageLoaderImpl(this.getDbService(),new Long(10),this.getEntityClassName()) );
//可在这里设置用户自定义的SQL,自定义的SQL可从页面中获取
}
PageLoaderImpl loader = this.getPageLoader();
loader.setIsShowName("true");
this.setPageLoader(loader);
}
public String edit() throws DataAccessException, Exception
{
this.initAction();
//获取selId,查询实体
IDBSupportService service = (IDBSupportService)ServiceLocator.getBean(this.getDbService());
String parmSelId = request.getParameter("selId");
this.selId = parmSelId;
logger.info("获得的编辑对象为:");
logger.info(this.selId);
map = DropdownListBoxUtil.getListMaps(this.getDbService(),this.getEntityClassName(), request);
request.setAttribute("map",map);
try
{
this.editEntity = (WfMywork)service.findById(this.getEntityClassName(), "rowId", this.getSelId());
}
catch(Exception ex) //如果没找到,说明已被删除,可进入新增模式
{
logger.error("没找到,进入新增模式");
}
return "edit";
}
public String save() throws Exception
{
this.initAction();
//获取selId,查询实体
IDBSupportService service = (IDBSupportService)ServiceLocator.getBean(this.getDbService());
String sUpdateDt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(System.currentTimeMillis()));
CommUser user = (CommUser) (SecurityContextHolder.getContext().getAuthentication().getPrincipal());
String uid="";
try
{
uid=user.getLoginId();
}
catch(Exception ex)
{
}
if(uid==null||uid.trim().length()==0)
{
return "reject";//权限不足或超时${test}
}
this.editEntity.setUpdateDt(sUpdateDt);
this.editEntity.setUpdateUid(uid);
if(this.editEntity.getPkId()==null||this.editEntity.getPkId().trim().length()==0)//新记录
{
this.getEditEntity().setPkId(String.valueOf(service.getSerial()));
this.editEntity.setCreateDt(sUpdateDt);
this.editEntity.setCreateUid(uid);
this.editEntity.setRowId(StringUtil.getUUID());
}
this.setSelId(this.getEditEntity().getRowId());//设置selId作为查询参数
service.saveOrUpdate(this.getEditEntity());
this.addActionMessage("保存成功!");
map = DropdownListBoxUtil.getListMaps(this.getDbService(),this.getEntityClassName(), request);
request.setAttribute("map",map);
return "edit";
}
}
(3) 编译后,访问:http://localhost:8088/crm/wf/listMywork.action,生成的列表页面和编辑页面:
图2.6 由平台生成的列页面
图2.7 由平台生成的编辑页面
在生成的编辑页面中,有文本输入框,日期选择器,下拉列表框等。下面是struts2带的日期选择器的外观(感觉明显不如webwork的日期选择器美观):
图2.8 由平台生成的编辑页面
到了这一步骤,可以体验一下,增加删除修改翻页功能都可以使用了,实现这一步不需要开发人员编写一行代码。
(1) struts2默认的编辑页面的风格不美观,需要设计新的主题模板。
(2) 生成的功能未与菜单树和权限绑定,需要自动分配到菜单树和自动创建页面按钮权限。
(3) 生成的页面标签文字有乱码,下一步需要增加多语资源文件生成。
(4) 生成校验xml,开发常用的校验器。
(5) 主明细表模板开发。
(6) 在功能定义中,应可由用户选择生成模板。
(7) 在功能定义中,可添加更多的功能按钮,并指定每个功能按钮的访问权限。
(8) 弹出选择窗口生成器需要实现。
(9) …