1.1emapcomponent
1.1.1上传下载
1.1.1.1变量说明
1、[root], emap运行环境部署时使用的上下文根
2、[component],附件上传下载所在的应用,默认名称为emapcomponent
3、[params],其他条件参数,如:imageType=1
4、{scope},调用上传的应用中页面模型的ID
5、{fileToken},附件的令牌,调用上传的应用所属实体对象字段的值,每个字段值可以对应多个附件
6、{attatchId},附件唯一标识的wid值
1.1.1.2上传过程
1、根据scope和fileToken上传到临时目录
2、系统根据附件类型判断:大小、格式、登录权限
3、自定义判断(根据应用是否扩展过)
4、保存业务数据时,把临时文件保存到正式目录下
5、自定义保存(根据应用是否扩展过)
注:系统也提供了定时清理临时文件的功能,间隔时间配置在fileConfig.xml文件中
1.1.1.3下载过程
1、下载请求
2、自定义生成文件流(根据应用是否扩展过)
3、读取本地文件流(如果有第2步且成功,则本步忽略)
1.1.1.4Ajax提交地址
1.1.1.4.1获取当前系统时间
【url】:
/[root]/sys/emapcomponent/file/upload/getServerTime.do
【样例】:
返回结果:
1.1.1.4.2获取配置中临时文件的有效时间
【url】:
/[root]/sys/emapcomponent/file/upload/tempOverdueTime.do
【参数】:
无
【样例】:
1.1.1.4.3获取类型配置
【url】:
/[root]/sys/emapcomponent/file/upload/getFileConfig.do
【参数】:
storeId:必填项,附件类型的ID,来源于emapcomponent应用中的配置fileConfig.xml
【样例】:
js代码:
返回结果:
1.1.1.4.4上传到临时文件
【url】:
/[root]/sys/emapcomponent/file/uploadTempFile/{scope}/{fileToken}.do
或者
/[root]/sys/emapcomponent/file/uploadTempFile.do
【参数】:
storeId:必填项,附件类型的ID,来源于emapcomponent应用中的配置fileConfig.xml
fileName:选填,自定义的附件名称,不用带上后缀,会自动取原文件名后缀,不填的话就默认使用原文件名。
isSingle:选填,如果为“1”,表示在上传前会先将该token下的所有临时文件清理掉。
customer:选填,实现了ICustomerFileOp接口的service名称,会执行其中的fileCheck方法,方法的返回值会作为请求返回的错误信息
app:选填,上述service所在应用名称
【样例】:
js代码:
返回结果:
1.1.1.4.5删除已上传的临时文件
【url】:
/[root]/sys/emapcomponent/file/deleteTempFile/{scope}/{fileToken}/{fileWid}.do
或者
[root]/sys/emapcomponent/file/deleteTempFile.do
二者都限定为POST请求
【参数】:
scope:上传时指定的scope标识,必填
fileToken:上传时指定的文件token,必填
fileWid:指定要删除的文件id,选填,不填则会删除token下所有临时文件
【样例】:
js代码:
或者
返回结果:
注意:success为true仅表示请求提交到了后台,至于文件路径是否正确,是否正确删除,则不能保证。
1.1.1.4.6获取上传的临时文件
【url】:
/[root]/sys/emapcomponent/file/getTempFile/{scope}/{fileToken}/{fileId}.do
或者
/[root]/sys/emapcomponent/file/getTempFile.do
【参数】:
scope:上传时指定的scope标识,必填
fileToken:上传时指定的文件token,必填
fileId:临时文件的id,必填
【样例】:
直接输入地址,弹出下载窗口:
1.1.1.4.7裁剪图片临时文件,生成一个新的临时文件
【url】:
/[root]/sys/emapcomponent/file/cutTempFile/{scope}/{fileToken}/{fileWid}.do
支持裁剪的格式包括:bmp,gif,jpg,jpeg,png,wbmp
【参数】:
x:必填,剪裁区域左上角x坐标
y:必填,剪裁区域左上角y坐标
width:必填,剪裁区域宽度
height:必填,剪裁区域高度
actualWidth:选填,保存文件的实际宽度(缩放后的)
actualHeight:选填,保存文件的实际高度(缩放后的)
【样例】:
剪裁的方式为:
原图中,以(x,y)为左上角顶点,width,height为宽高的矩形部分。然后根据actualWidth和actualHeight对截取部分进行缩放,最后对缩放结果进行保存。
js代码:
返回结果:
1.1.1.4.8将临时文件保存为附件(正式文件)
【url】:
/[root]/sys/emapcomponent/file/saveAttachment/{scope}/{fileToken}.do
或者
/[root]/sys/emapcomponent/file/saveAttachment.do
【参数】:
scope:必填
fileToken:必填
attachmentParam:必填,包含storeId的json对象。其中可以包含一个key为orderMap的对象,存储wid----orderNum的键值对。后台将fileToken下所有附件的wid与orderMap中的wid做比对,符合的会将orderMap中的orderNum更新到数据库中对应附件的orderNum字段。
widsOfAttsToDelete:选填,表示在保存附件之前需要先删除的正式文件的wid,多个wid用逗号隔开
saveAppName:选填,saveBeanName指定的service所在的app名称
saveBeanName:选填,实现了ICustomerFileOp接口的service名称,会执行其中的fileSave方法,若未成功往数据库里插入这条记录,则还是会执行默认的保存附件方法。
authAppName:选填,authBeanName指定service所在的app名称
authBeanName:选填,实现了ICustomerFileOp接口的service名称。之后所有对附件操作都会执行其中的fileDownloadAuth方法进行权限检查。
【样例】:
js代码:
返回结果:
1.1.1.4.9删除附件:根据token删除附件
【url】:
/[root]/sys/emapcomponent/file/deleteFileByToken/{fileToken}.do?[params]
或者
/[root]/sys/emapcomponent/file/deleteFileByToken.do
【参数】
fileToken:必填,文件token
[params]:选填,额外的参数,fileName、storeId等等
【样例】:
js代码:
返回结果:
1.1.1.4.10获取指定令牌下所有的附件信息
【url】:
/[root]/sys/emapcomponent/file/getUploadedAttachment/{fileToken}.do
或者
/[root]/sys/emapcomponent/file/getUploadedAttachment.do
【参数】:
fileToken:必填
【样例】:
js代码:
返回结果:
1.1.1.4.11获取多个令牌下所有的附件信息,结果会按令牌分组
【url】:
/[root]/sys/emapcomponent/file/getUploadedAttachmentBatch.do
【参数】:
fileTokenArrayString:必填,多个token值以json格式组织起来的字符串
【样例】:
1.1.1.4.12下载附件:根据附件id
【url】:
/[root]/sys/emapcomponent/file/getAttachmentFile/{fileIdx}.do
或者
/[root]/sys/emapcomponent/file/getAttachmentFile.do
【参数】:
fileIdx:必填,附件id
app:选填,customerFile指定的service所在的app
customerFile:选填,实现了ICustomerFileOp接口的service名称,会执行其中的generateFile方法,若返回null,则还是会执行默认的生成文件流的方法。
【样例】:
可直接输入如下地址,弹出下载对话框:
1.1.1.4.13下载附件:根据附件token
【url】:
/[root]/sys/emapcomponent/file/getFileByToken/{fileToken}.do
或者
/[root]/sys/emapcomponent/file/getFileByToken.do
【参数】:
fileToken:必填,文件token
app:选填,customerFile指定的service所在的app
customerFile:选填,实现了ICustomerFileOp接口的service名称,会执行其中的generateFile方法,若返回null,则还是会执行默认的生成文件流的方法。
【样例】:
若同一fileToken下存在多个文件,只会返回第一个
可直接输入如下地址,弹出下载对话框:
1.1.1.4.14下载图片:下载token下指定类型图片
【url】:
/[root]/sys/emapcomponent/file/ getSingleImageByToken.do
1.如果有多个符合条件的图片,只会下载第一张。
2.没有符合条件的图片时,返回404页面。
【参数】:
fileToken:选填,默认为”0”,表示获取哪个尺寸的图片文件,
type:选填,获取图片的类型,可以填写如下三种类型
“ORIGINAL”:表示原始尺寸,缺省类型
“MIDDLE”:表示中型尺寸
“SMALL”:表示小型尺寸
【样例】:
访问如下地址:
弹出下载框:
批量下载:根据单个fileToken,zip格式返回
1.1.1.4.15批量下载:根据单个fileToken,zip格式返回
【url】:
/[root]/sys/emapcomponent/file/getFileBatchByToken/{fileToken}.do
【参数】:
fileToken:必填,文件token
imageSize:选填,默认为”0”,表示获取哪个尺寸的图片文件,
”0”表示获取原始类型图片,
“1”表示获取中尺寸类型图片,
“2”表示获取小尺寸类型图片。
nameType:选填,默认为”0”,表示附件的命名方式,
“0”表示以唯一编号命名文件,
“1”表示以原文件名命名文件,此方式会导致所限定token下相同文件名的文件会互相覆盖,只能获取到一个。只适合上传时自定义了唯一文件名称的场景。
customerFile选填,实现了ICustomerFileOp接口的service名称,会执行其中的generateFile方法,若返回null,则还是会执行默认的生成文件流的方法。
app:选填,上述service所在应用的名称
zipName:选填,表示下载的zip包的名称,不填的话,以(token1&token2……)的形式命名。
【样例】:
返回fileToken下所有文件,以zip格式打包.
1.1.1.4.16批量下载:根据多个fileToken,zip格式返回
【url】:
/[root]/sys/emapcomponent/file/getFileBatchByTokenArray.do
【参数】:
fileTokenArray:必填,多个token,用逗号隔开
imageSize:选填,默认为”0”,表示获取哪个尺寸的图片文件,
”0”表示获取原始类型图片,
“1”表示获取中尺寸类型图片,
“2”表示获取小尺寸类型图片。
nameType:选填,默认为”0”,表示附件的命名方式,
“0”表示以唯一编号命名文件,
“1”表示以原文件名命名文件,此方式会导致所限定token下相同文件名的文件会互相覆盖,只能获取到一个。只适合上传时自定义了唯一文件名称的场景。
customerFile:选填,实现了ICustomerFileOp接口的service名称,会执行其中的generateFile方法,若返回null,则还是会执行默认的生成文件流的方法。
app:选填,上述service所在应用的名称
zipName:选填,表示下载的zip包的名称,不填的话,以(token1&token2……)的形式命名。
【样例】:
由于参数长度不定,需求用post方式提交,并返回流数据。你可以选择自己构建form并提交,或者采用前段封装的组件,调用方式如下:
WIS_EMAP_SERV.batchDownloadFiles({
“contextPath”: “yourContextPath”,
“tokens”: “yourToken1,yourToken2”
})
使用此方法需要引入https://res.wisedu.com/fe_components/emap.js
1.1.1.4.17删除附件:根据id删除指定附件
【url】:
/[root]/sys/emapcomponent/file/deleteFileByWid/{wid}.do
或
/[root]/sys/emapcomponent/file/deleteFileByWid.do
【参数】:
wid:必填,需要删除的附件id
【样例】:
js代码:
返回结果:
1.1.1.5java接口
com.wisedu.emap.file.util.IFileDownload
获取方式:
private AppBeanContainer<IFileDownload> fileDl = new AppBeanContainer<IFileDownload>(
"emapcomponent", IFileDownload.BEANID, false);
使用样例:
IFileDownload tmp = fileDl.get();
if (tmp != null) {
tmp.xxx();
}
1.1.1.5.1通过fileToken获取正式文件信息
【接口方法】:
Map<String,Object> getUploadedAttachmentInfo(String fileToken)
【参数说明】:
fileToken:正式文件的token
【返回值说明】:
正式文件信息,键值为相应属性名,如id,name,fileToken等
1.1.1.5.2通过fileToken获取文件流
【接口方法】:
InputStream getStreamByToken(String token, Map<String, ?> params)
【参数说明】:
token:正式文件的token
params:如果一个token对应多个文件时,可通过此参数增加额外的区分条件
【返回值说明】:
文件流
1.1.1.6应用扩展java接口
1.1.1.6.1上传文件时应用自定义判断接口
【接口类】:
com.wisedu.emap.file.util.ICustomerFileOp
【接口方法】:
StringfileCheck(FileItem fileItem)
【参数说明】:
fileItem:上传的文件
【返回值说明】:
检查通过则返回null,否则返回失败消息,类型为String类型
1.1.1.6.2上传文件时临时文件保存接口
【接口类】:
com.wisedu.emap.file.util.ICustomerFileOp
【接口方法】:
void fileSave(File file, String fileToken)
【参数说明】:
file:file文件
fileToken:文件的Token字段
1.1.1.6.3下载时访问权限检查接口
特别说明:本接口应当只用于权限检查。admin用户的任何操作都不会进入此处进行权限检查,默认拥有所有权限。
【接口类】:
com.wisedu.emap.file.util.ICustomerFileOp
【接口方法】:
String fileDownloadAuth (String fileToken)
【参数说明】:
fileToken:token值
【返回类型】:
权限检查通过则返回null,否则返回失败消息,类型为String
【版本要求】:
1.1.37.B37-SNAPSHOT及以上
【代码示例】:
新增了AuthParam类,可直接通过静态方法获取实例。其中保存了附件wid和操作类型。
public String fileDownloadAuth(String token) {
AuthParam authParam = AuthParam.getAuthParam();
//CheckType是 AuthParam类中的枚举类型,注意引用的正确性
AuthParam.CheckType checkType = authParam.getCheckType();
String wid = authParam.getWid();
if (checkType == AuthParam.CheckType.DOWNLOAD) {
//下载相关的权限处理
returnnull;
}
elseif (checkType == AuthParam.CheckType.QUERY) {
//查询相关的权限处理
returnnull;
}
elseif (checkType == AuthParam.CheckType.DELETE) {
//删除相关的权限处理
returnnull;
}
else {
return"unknow checkType!";
}
}
1.1.1.6.4下载时生成文件接口
【接口类】:
com.wisedu.emap.file.util.ICustomerFileOp
【接口方法】:
InputStream generateFile(String fileToken)
【参数说明】:
fileToken:token值
【返回类型】:
保存文件的输入流InputStream
1.1.1.7附件表结构
<table name="EMAP_SAPP_FILE_INDEX" desc="文件索引表">
<columnname="WID"type="String(40)"desc="主键"nullable="false"/>
<columnname="FILE_NAME"type="String(300)"desc="文件名称"nullable="false"/>
<columnname="STORE_NAME"type="String(80)"desc="文件存储名"nullable="false"/>
<columnname="STORE_PATH"type="String(230)"desc="文件纯粹路径"nullable="false"/>
<columnname="UPLOAD_TIME"type="Datetime"desc="上传日期"nullable="false"/>
<columnname="APP_ID"type="String(100)"desc="数据模型所属的应用"/>
<columnname="DATA_OBJ_ID"type="String(100)"desc="数据模型ID"/>
<columnname="DATA_WID"type="String(50)"desc="数据模型主键"/>
<columnname="DATA_ITEM"type="String(60)"desc="数据模型列元素"/>
<columnname="STORE_TOKEN"type="String(80)"desc="数据模型列的值"/>
<columnname="FILE_SIZE"type="long"desc="文件大小"/>
<columnname="FILE_TYPE"type="String(30)"desc="文件类型"/>
<columnname="IS_IMAGE"type="byte"desc="是否是图片"/>
<columnname="IMAGE_TYPE"type="String(2)"desc="图片类型0:原尺寸;1:中尺寸;2:小尺寸"/>
<columnname="IMAGE_RESOLUTION"type="String(50)"desc="图片属性"/>
<columnname="IMAGE_WIDTH"type="int"desc="图片宽"/>
<columnname="IMAGE_HIGTH"type="int"desc="图片高"/>
<columnname="STATUS"type="byte"desc="删除状态"/>
<columnname="STORE_ID"type="String(50)"desc="存储编号"/>
<columnname="ITEM_ID"type="String(10)"desc="存储序列"/>
<columnname="ITEM_TYPE"type="String(10)"desc="存储序列类型"/>
<columnname="TABLE_NAME"type="String(50)"desc="所存表"/>
<columnname="CLRQ"type="Datetime"desc="处理日期"/>
<columnname="CZLX"type="String(10)"desc="操作类型"/>
<columnname="TBRQ"type="Datetime"desc="同步日期"/>
<columnname="TBLX"type="String(10)"desc="同步操作"/>
<columnname="CZRQ"type="Datetime"desc="操作日期"/>
<columnname="CZZ"type="String(30)"desc="操作者"/>
<columnname="CZZXM"type="String(90)"desc="操作者姓名"/>
<columnname="AUTH_APP"type="String(30)"desc="自定义权限APP名称"/>
<columnname="AUTH_BEAN"type="String(30)"desc="自定义权限BEAN"/>
</table>
<indexname="PK_EMAP_SAPP_FILE_INDEX"type="key"tableName="EMAP_SAPP_FILE_INDEX">
<columnname="WID"/>
</index>
1.1.2导入导出
1.1.2.1导入过程
1、上传文件,获取上传文件的attatchId
2、读取文件信息,如果自定义了,则使用自定义的读取文件方法
3、执行自定义的转换前数据分析
4、进行字典的转换(value转化成key)
5、执行自定义的转换后数据分析
6、进行数据保存
1)、执行单个数据分析,保存前
2)、执行保存动作,如果有自定义,则执行自定义的保存方法
7、执行自定义的保存后数据分析
8、生成导入结果文件,如果有自定义的则使用自定义结果文件生成方法
9、导入结果文件保存成附件,并返回附件的attatchId
10、通过附件的下载获取导入结果
1.1.2.2导出过程
1、执行导出定义的动作,生成导出数据
2、执行自定义的导出数据分析方法
3、生成导出结果文件,如果有自定义的则使用自定义结果文件生成方法
4、导出结果文件保存成附件,并返回附件的attatchId
5、通过附件的下载获取导出结果
1.1.2.3Ajax提交地址
1.1.2.3.1导出地址
【url】:
/[root]/sys/emapcomponent/imexport/export.do
【参数】:
app:调用导出的应用名称,必填
module:调用导出的模块名,必填
page:调用导出的页面,必填
action:调用导出的动作,必填
colnames:需要导出的字段的name,多个用逗号分隔,选填(不填则全部导出)
analyse:自定义的导出过程分析服务,实现IExportAnalyse,选填
write:自定义的导出写文件服务,实现IExportWrite,选填
filename:自定义的导出文件名,选填
【返回值】:
attachment:导出结果的附件ID
【样例】:js代码:
返回结果:
1.1.2.3.2下载导入模板
【url】:
/[root]/sys/emapcomponent/imexport/importTemplate.do
【参数】:
app:必填,调用导入的应用名称
module:必填,调用导入的模块名
page:必填,调用导入的页面
action:必填,调用导入的保存动作
colnames:选填,导入时自定义的字段,多个用逗号分隔
read:选填,实现IGenerateTemplate接口的service名称,实际会执行其中的generateTemplate方法返回模板文件
filename:选填,模板文件的名称,不填则默认取模型的名称
【返回值】:
attachment:导入模板的附件ID
【样例】:
js代码:
返回结果:
1.1.2.3.3获取导入数据行数
【url】:
/[root]/sys/emapcomponent/imexport/importRownum.do
【参数】:
attachment:必填,excel附件ID
app:选填,read指定的service所在的app
read:选填,实现了IGetRowNum接口的service名称,实际会执行getRowNum方法,返回行数
【返回值】:
rowNumber:数据行数
【样例】:
js代码:
返回结果
1.1.2.3.4执行导入
【url】:
/[root]/sys/emapcomponent/imexport/import.do
【参数】:
attachment:必填,待上传附件id(可由模板编辑后上传得到)
app:必填,调用导入的应用名称
module:必填,调用导入的模块名
page:必填,调用导入的页面
action:必填,调用导入的保存动作
consts:选填,常量字段,多个用逗号分隔,内容为key:value
guids:选填,GUID字段,多个用逗号分隔
read:选填,实现IReadAndWrite接口的service,实际会执行readImportFile,读取和解析流形式的导入数据,可以比对模型进行数据校验,返回导入数据
analyse:选填,实现IImportAnalyse接口的service,实际会执行beforeAnalyse方法,可在方法中对导入数据进行预处理,返回错误信息
save:选填,实心IImportSave接口的service,实际会执行save方法,将记录写入数据库,返回错误信息
ignoreEmptyRow:选填,默认为true,是否忽略空行(空格也算空行),true表示读取忽略空行,false表示将空行当成正常记录读取
【返回值】:
status:1表示成功,0表示失败
total:总记录数
success:成功记录数
attachment:导入结果的附件ID号
【注意事项】:
① excel格式校验
我们会将excel填写内容的格式与模型的类型作对比,比如某列在模型中为数字类型,excel中的格式却为文本,则视为出错,会在导入结果中记录错误信息
②长度和日期校验
针对数据模型中的日期类型,会对导入数据进行日期格式的校验。对于其他的数据类型,会在导入时进行数据长度的校验,在校验不通过的情况下会在导入结果中记录错误信息。
③字典校验:
如果数据模型中配置了字典,导入的数据会跟字典的key和value进行匹配,value匹配的情况下会导入数据会被翻译为key,若key和value都不匹配,则导入出错,并在导入结果中记录错误信息。
性别字典 | |
---|---|
Key | Value |
0 | 男 |
1 | 女 |
导入数据 | 实际存储结果 |
---|---|
0 | 0 |
女 | 1 |
3 | 出错! |
未知性别 | 出错! |
④推荐使用生成的模板
我们推荐使用根据模型生成的模板,而非自己造一个。因为默认的导入动作会把无效列视为错误处理,并记录错误信息。使用生成的模板可以有效避免无效列导致的错误。
【样例】:
js代码:
返回结果:
导入文件展示:
数据库导入结果展示:
1.1.2.4应用扩展java接口
1.1.2.4.1导出数据分析
com.wisedu.emap.framework.imexport.IExportAnalyse
1.1.2.4.2导出写文件
com.wisedu.emap.framework.imexport.IExportWrite
1.1.2.4.3导入读文件(不建议使用,已拆分为下面三个接口)
com.wisedu.emap.framework.imexport.IImportRead
1.1.2.4.4导入模板生成
com.wisedu.emap.framework.importread. IGenerateTemplate
1.1.2.4.5导入数据行数计算
com.wisedu.emap.framework.importread. IGetRowNum
1.1.2.4.6导入文件读取和导入结果文件生成
com.wisedu.emap.framework.importread. IReadAndWrite
1.1.2.4.7导入过程分析
com.wisedu.emap.framework.imexport.IImportAnalyse
1.1.2.4.8导入保存
com.wisedu.emap.framework.imexport.IImportSave
1.1.3字典刷新
1.1.3.1刷新某个应用下某个字典表
【url】:
/[root]/sys/emapcomponent/clearDicCache.do
【参数】:
app:应用名称
dic:字典ID号
【样例】:
正确传递参数后,刷新成功:
1.1.3.2刷新某个应用下所有字典表
【url】:
/[root]/sys/emapcomponent/clearAppDicCache.do
【参数】:
app:应用名称
【样例】:
正确传递参数后,刷新成功:
1.1.3.3刷新整个EMAP工作空间内字典表
【url】:
/[root]/sys/emapcomponent/clearAllDicCache.do
【参数】:
无
【样例】:
无需传递参数,正确访问地址,刷新成功:
1.1.3.4刷新字典的Java接口
com.wisedu.emap.dicOperation.IDicOperation
获取方式:
private AppBeanContainer<IDicOperation> dicOpt = new AppBeanContainer<IDicOperation>(
"emapcomponent", IDicOperation.BEANID, false);
注:上面这段代码是类的成员变量定义
使用样例:
IDicOperationtmp = this.dicOpt.get();
if (tmp != null) {
tmp.xxx();
1.1.4缓存
1.1.4.1概述
缓存的接口在emapcomponent应用中,工厂类为ICacheFactory。
缓存对象分为两种:单值ISingleCache<T>,多值IMultipleCache<T>。
两种缓存的使用场景:
单值缓存主要用于只需保存一个值的情况。如配置信息,一般都是一次读取所有的配置信息,然后作为一个map缓存下来。
多值缓存主要用于需要保存多个值的情况。如人员的基本信息或最新动态,一般是根据人员编号读取一条或一批数据缓存下来。
1.1.4.2缓存对象的获取样例
private IMultipleCache<Stud> xxxCache;
{
AppBeanContainer<ICacheFactory> factory = new AppBeanContainer<ICacheFactory>(
"emapcomponent", ICacheFactory.BEANID, true);
StudHandler handler = new ...;
xxxCache = factory.get().getMultipleCache(id, CacheType.LOCAL, handler);
// 或者
xxxCache = factory.get().getMultipleCache(id, CacheType.LOCAL, handler,
idleTime, liveTime, maxSize);
}
获取缓存对象时,需要给出一个标识,即id,此名称在同一个应用中必须是唯一的。
然后是缓存的类型,目前只实现的本地缓存(能够在集群间同步)
handler是用于获取缓存数据的处理器,需要实现相应的接口,这个会在下一节说明。
idleTime为缓存的闲置时间,单位:秒。如果设置为0或小于0,则表示没有闲置时间。
liveTime为缓存的保持时间,单位:秒。如果设置为0或小于0,则表示没有保持时间。
maxSize为保留的缓存值的个数。如果设置为0或小于0,则表示没有个数限制。
1.1.4.3缓存的使用样例
对于单值缓存,可直接通过get()方法获取缓存的值。
如:T value = cache.get();
对于多值缓存,需要给出键值来获取缓存的值。
如:T value = cache.get("key");
1.1.4.4handler
获取数据的处理器也分为两种:单值ISingleValueHandler<T>,多值IMultipleValueHandler<T>。
在获取缓存的值时,如果缓存不存在,缓存框架会调用handler来获取缓存的值。
一般获取缓存的方式如下图:
上面整个获取的过程需要加同步锁。当然可以将这个过程封装成一个方法,但是每种类别的缓存都需要封装这样一个方法。
使用了handler之后,执行方式如下图所示:
整个处理过程由缓存框架接管,包括同步锁及优化处理不需要再关心了,也无需再封装方法。
1.1.4.5缓存的清除
如果缓存的源头(如数据库)更新了,那可以调用缓存的清除方法。这样在下次获取缓存时,就会调用handler获取新的数据。
对于本地缓存,会激活集群间的同步处理,所有服务器上的对于缓存都会被清除。
注:如果设置idleTime或liveTime,由超时所触发的自动清除缓存不会触发集群间的同步处理。但通过调用方式执行的清除缓存,仍然能够触发群间的同步处理。
1.1.4.6Spring中配置缓存
除了代码方式初始化缓存对象,还可以通过配置初始化缓存对象。
spring的配置文件为:[应用目录]/config/spring.xml。此文件如果不存在请自行创建。
缓存对象的配置样例如下:
<bean id="myCache" class="com.wisedu.emap.cache.CacheGenerator">
<property name="handler" ref="strHandler"/>
<property name="idleTime" value="18000"/>
<property name="maxSize" value="20"/>
<!--
单值缓存需要添加如下属性
<property name="singleCache" value="true"/>
-->
</bean>
<bean name="strHandler" class="com.wisedu….StringCacheHandler"/>
代码中缓存对象的注入样例如下:
@Autowired
@Qualifier("myCache")
private IMultipleCache<String> myCache;
缓存的使用样例如下:
String value = this.myCache.get("testId");