1:系统属性配置文件是根目录下的:webwork.properties文件,包括项目的编码信息。
2:采用了CAS的SSO,用的是filter(在web.xml中配置),SSO的配置信息在根目录下的sso.properties文件中配置。
3:SSO认证实现类是“cn.myapps.core.sso.CasUserSSO”,但当前默认的认证方式是default,所有sso的配置就没有用了。要用SSO,必须把sso.properties中的属性“authentication.type”改为sso,并合理配置sso.properties内容
需要好好分析一下:
cn.myapps.core.sso.cas.filter.OBPMCas20ProxyReceivingTicketValidationFilter这个类
4:如果URI中带有“/portal/”或“/mobile/”,则表示是前台应用。SSO只针对带“/portal/”的链接有效
5:系统的license文件位于“WEB-INF/license.zip”,可以通过“cn.myapps.util.CLoader”这个类来详细了解java中如何解析zip文件(无第三方依赖)。从这个类中可以发现,系统的很多类都被加密了,必须解密后才能使用。
6:本系统的所有自定义多语言的占位符类似如下:
{*[page.title]*}
如果使用页面标签,则类似如下:
<o:MultiLanguage>
<head>
<title>{*[page.title]*}</title>
</head>
</o:MultiLanguage>
7:系统表:
管理员用户表是:T_SUPERUSER
域信息表:T_DOMAIN
软件列表:t_application
8:在每个Action中,都有一个构造函数,在这个构造函数中创建对应Action的process(业务处理类)
所有的业务处理类都通过cn.myapps.protection.util.WarpProcessFactory的createProcess方法来进行创建,WarpProcessFactory维护了一个包含所有process的pool,pool中的每个process的创建规则如下:
DomainProcess-> DomainProcessBean
有3个例外,如下:
1>ApplicationProcess ->ApplicationProcessBean ->WarpApplicationProcessBean
2>DomainProcess-> DomainProcessBean ->WarpDomainProcessBean
3>DataSourceProcess-> DataSourceProcessBean -> WarpDataSourceProcessBean
在具体的process处理类中,通过DAOFactory.getDefaultDAO()来获得具体的DAO这层的处理类,一般是根据POJO对象来获得DAOServer对象,规则如下:
根据POJO找到真实的DAO(Hibernate操作层),如果输入的是:
“cn.myapps.core.superuser.ejb.SuperUserVO”,
得到的则是:
“cn.myapps.core.superuser.dao.HibernateSuperUserDAO”
9:系统采用hibernate作为底层,采用proxool作为数据库连接池,具体配置在如下:
Hibernate.properties(在其中指定了proxool作为数据库连接池)
Proxool.properties
这两个文件中
10:表单最后一行的License信息是在WarpProcessFactory通过WarpForm来生成的,每个Form对象都被cglib重新封装成WarpForm了。
11:系统采用BSF作为脚本语言,所有的表单校验实际上都是在后台通过调用BSF引擎来进行的,所以实际上都是服务器端的校验。
12:表单上字段域的解析是在Form的setTemplatecontext方法中进行的,在hibernate操作中,一旦给“templatecontext”字段赋值,系统同时自动解析表单模板,所有解析动作都发生在:
TemplateParser.parseTemplate(this,template);
以上这行,可以仔细分析里面的运行代码(通过调用htmlparser来实现)
13:Form对象解析:
_fields:页面上所有字段的集合,包含了所有可输入域和非可输入域。
_textparts:文本部分
_elements:页面上所有的元素,包含了所有的_fields和_textparts,并且二者按在页面中的顺序进行排列。_elements的数量是_fields数量和_textparts数量的总和。
_components:?
_module:表单所属的模块
activitys:表单包含的“操作”定义
version:版本
14:最终展示表单的页面是如下三个文件(根据不同的样式选择不同的content.jsp):
portal/default/document/content.jsp
portal/blue/document/content.jsp
portal/fresh/document/content.jsp
具体页面内容(html)通过调用
cn.myapps.core.dynaform.document.html. DocumentHtmlBean
的 getFormHTML方法来获得
15:每个application下对应的doc都会被统一保存在对应应用所在数据源的“T_DOCUMENT”表中,而不管其是由哪个表单所创建的。如下语句就是从对应数据源的“T_DOCUMENT”表中找到对应的doc
"SELECT COUNT(*) FROM OBPMAPP.T_DOCUMENT doc WHERE doc.ID=?"
在保存文档时,生成的比较典型的SQL语句如下:
"INSERT INTO OBPMAPP.TLK_选项卡 (ITEM_选项B,ITEM_字段2,ITEM_TEST,ITEM_选项A,ITEM_多行文本框,ITEM_下拉,ITEM_字段1,ITEM_单选,ID,PARENT,LASTMODIFIED,FORMNAME,STATE,STATEINT,AUDITUSER,AUDITDATE,AUTHOR,AUTHOR_DEPT_INDEX,CREATED,FORMID,ISTMP,VERSIONS,SORTID,APPLICATIONID,STATELABEL,AUDITORNAMES,LASTFLOWOPERATION,LASTMODIFIER,DOMAINID,AUDITORLIST) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)" |
同时,系统还会操作“auth_XXX”对应表单的权限记录表