zk学习总结
- ZK Tree问题,当界面初始加载一个 Tree 控件时,有可能树型数据显示不全,就是被遮住一部分字。解决方法有两种:
1>. 利用 <attribute>
<tree xxxxx>
<attribute name="onCreate">
String cmd = "jQuery('.z-dottree').find('table').each(function(i) {jQuery(this).attr('style','');});";
Clients.evalJavaScript(cmd);
</attribute>
</tree>
2>. 就是修改 zk 的包 zul.jar
把 zul.jar/web/js/zul/sel/mold/ 下的 tree.js, tree.src.js 有 table-layout:fixed; 样式全都去掉.
========================================
因为table-layout:fixed会导致树型数据部门被遮住,所以要把这样去掉。上面那一种方法,在首次加载有效,但如果是树型控件可以输入条件查询,如果查出一个不存在的数据,树型被清空,再查询有数据的树型出来,树型控件会被重新加载,table-layout:fixed会被重新加载出来,所以得用第二种方法。 - ZK的上传控件 CKEditor 就是 FckEditor
一般ZK都已经内置了ckeditor,他的包是 ckez.jar
首先要注意:如果页面上有布署了 jQuery脚本代码,应在head区域设置一句代码:
var jQuery = window.jq;
不然会看不到编辑域,而只能看一个 textarea 文本域。
配置:
在项目根目录设置 CKEditor 文件夹;
包含 config.jsp, config.js, upload.jsp ;
如果不需要传入自定义的参数给 upload.jsp使用,config.jsp就可以不用. 这里 config.jsp与config.js 是一样的文件,就是.jsp文件,可以接收从页面传来的数据,由于zk在加载ckeditor是异步的,而zk加载异步又与普通的web异步不太一样...
就是如果你写 window.onload或是$(document|window).ready 都有可能zk还没加载完。
config.jsp代码:01
<%@ page language=
"java"
import
=
"java.util.*"
pageEncoding=
"UTF-8"
02
contentType=
"text/javascript;charset=UTF-8"
%>
03
04
<%
05
String xxId = request.getParameter(
"mID"
);
06
%>
07
Array.prototype.contain = function(itm) {
08
if
(
this
.length ==
0
)
09
return
false
;
10
11
for
(m in
this
) {
12
if
(
this
[m] == itm)
13
return
true
;
14
}
15
16
return
false
;
17
}
18
19
Array.prototype.remove = function(itm) {
20
if
(
this
.contain(itm)) {
21
for
(m in
this
) {
22
if
(
this
[m] == itm) {
23
this
.splice(m,
1
)
24
}
25
}
26
}
27
}
28
29
CKEDITOR.editorConfig = function( config )
30
{
31
config.language =
'zh-CN'
;
32
//config.uiColor = '#AADC6E';
33
//alert(config.toolbar_Basic instanceof Object);
34
35
var menus = config.toolbar_Basic[
0
];
36
37
if
(!menus.contain(
'Image'
)) {
38
menus.push(
'Image'
);
39
}
40
41
if
(!menus.contain(
'Source'
)) {
42
menus.push(
'Source'
);
43
}
44
45
if
(!menus.contain(
'Undo'
)) {
46
menus.push(
'Undo'
);
47
}
48
49
if
(!menus.contain(
'Redo'
)) {
50
menus.push(
'Redo'
);
51
}
52
53
menus.remove(
'About'
);
54
55
config.toolbar =
'Basic'
;
56
57
var __theXXid =
'<%=xxId%>'
;
58
//图片处理
59
config.pasteFromWordRemoveStyles =
true
;
//setFilebrowserImageBrowseUrl
60
config.filebrowserImageUploadUrl =
"/projectName/ckeditor/uploader?Type=Image&xxId="
+ __theXXid;
61
62
// 去掉ckeditor“保存”按钮
63
config.removePlugins =
'save'
;
64
return
;
65
for
(itm in config) {
66
//if (itm.indexOf('plug') >= 0) {
67
alert(itm);
68
//}
69
}
70
};
71
72
config.js代码 其实与 config.js下面的脚本一样...
73
upload.jsp好像没啥用,里面放空也行.
74
75
------------------------------------
76
77
在web.xml新建 ckeditor servlet 节点; <SPAN style=
"FONT-FAMILY: 'sans serif', tahoma, verdana, helvetica; WHITE-SPACE: normal"
class
=Apple-style-span> <servlet></SPAN><SPAN style=
"FONT-FAMILY: ''sans serif', tahoma, verdana, helvetica'"
class
=Apple-style-span><SPAN style=
"WHITE-SPACE: nowrap"
class
=Apple-style-span> </SPAN></SPAN>
<servlet-class>ishitong.mpsmp.web.util.CKEditorUploadServlet</servlet-class>
<init-param>
<param-name>baseDir</param-name>
<param-value>/upload/pushimgs/</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>enabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>AllowedExtensionsFile</param-name>
<param-value></param-value>
</init-param>
<init-param>
<param-name>DeniedExtensionsFile</param-name>
<param-value>
html|htm|php|php2|php3|php4|php5|phtml|pwml|inc|asp|aspx|ascx|jsp|cfm|cfc|pl|bat|exe|com|dll|vbs|js|reg|cgi|htaccess|asis|ftl
</param-value>
</init-param>
<init-param>
<param-name>AllowedExtensionsImage</param-name>
<param-value>jpg|gif|jpeg|png|bmp</param-value>
</init-param>
<init-param>
<param-name>DeniedExtensionsImage</param-name>
<param-value></param-value>
</init-param>
<init-param>
<param-name>AllowedExtensionsFlash</param-name>
<param-value>swf|fla</param-value>
</init-param>
<init-param>
<param-name>DeniedExtensionsFlash</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CKUpload</servlet-name>
<url-pattern>/ckeditor/uploader</url-pattern>
</servlet-mapping>
在zk.xml处配置:
<language-config>
<addon-uri>/WEB-INF/ckez-bind-addon.xml</addon-uri>
</language-config>
要让CKEditor可上传,就要设置 setFileBrowse这样的属性节点...
setFilebrowserBrowseUrl 配置上传文件夹位置
setCustomConfigurationsPath 设置 CKeditor 客户端脚本配置文件. 如:
FckID.setCustomConfigurationsPath = "/ckeditor/config.jsp?自定义参数名=xxxxx"; - Configuration config = desktop.getWebApp().getConfiguration();
config.setMaxUploadSize( 102400 ); // 单位 KB ,如果为负则不限制大小 - zk 使用 mybatis 中用 in 操作查询.
Map map = new HashMap<String, Object>();
List list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
...
map.put("allKeys", list);
Mybatis 部分:
<delete id="DeleteTableDatas" parameterType="java.util.HashMap" flushCache="true">
delete from xxtbl where
<foreach collection="allKeys" index="mIndex" item="mItem" open=" KEYID=" separator=" or KEYID=" close="">
#{mItem,javaType=String,jdbcType=VARCHAR}
</foreach>
</delete> - zk使用 Mybatis 调用存储过程:
<select id="MybatisUseProcedures" parameterType="java.util.HashMap" resultType="hashmap" statementType="CALLABLE" flushCache="true" useCache="false" >
{
call prod_Name(
#{MULLXIDS,mode=IN,jdbcType=VARCHAR,javaType=String},
...
)
}
如果是小数据,又不常用的存储过程,要使用游标的话,可以这样:
注意不能使用缓存;
反回的表数据所包含的字段,应在 resultMap 有存在。
call prod_Name(
#{C_SQL,mode=OUT,jdbcType=CURSOR,javaType=java.sql.ResultSet,resultMap=resultMap_Id}
)
由mybatis没有关闭游标操作,如果没关闭,oracle中的池会被占满,而出现访问异常的问题,所以尽量少使用游标。 - zk使用存储过程后调用在存过中生成的临时表.
调用存储过程跟上面 第 5 一样.
调用存储过程中生成的临时表,就是用Session再调用一次 select * from 临时表的 mybatis段。
因为临时表是在一个会话区间存在的,所以不用担心用户太多而产生抢占或更改别的用户数据的问题。 - 相关文件下载
CKEditorUploadServlet (web.xml配置的上传类)
ckeditoruploadservlet.rar - ZK上传方法.
在页面布署一个 button按钮
<button id="xxx" label="按钮名称" upload="true" />
后台
public void onUpload$xxx(ForwardEvent event) {
UploadEvent oData = (UploadEvent) event.getOrigin();
Media media = oData.getMedia();
String fileName = media.getName();
boolean isb = media.isBinary();
if (isb) { //假如是 Binary 文件
flen = media.getByteData().length; //就用这样的方式读取文件大小
} else {
flen = media.getStringData().length(); //否则直接读取内容文本大小.
}
if (!fileName.equals("")) {
String path = new ThreadLocal<HttpSession>().get().getServletContext().getRealPath("/upload/xxx/");
boolean flag = UsualUtil.createFile(media.getByteData(), path,fileName);
if (flag) {
//上传成功.
}
}
} - Listbox 与 Listitem
前者的 addEventListener ("xxx", new EventListener() {}); 有onSelect 后者是 onClick; - Listbox的添加与删除.
假设 Listitem 实体为 HashMap
List<HashMap<String, Object>> nlist = new ArrayList<HashMap<String, Object>>();
List<Listitem> lists = ListboxId.getItems();
for (Listitem itm : lists) {
if (!itm.isSelected()) {
cell = (Listcell) itm.getChildren().get(1);
String col1 = cell.getLabel();
.......
.......
Map map = new HashMap<String, Object>();
map.put("key1", col1);
....
...
nlist.add(map);
}
}
ListModelList nmdl = new ListModelList(nlist);
ListboxId.setModel(nmdl);
以上的删除,
添加的话是其他的Listitem或其他类型数据转化为 List<HashMap<String, Object>>();
都要进行 SetModel 不然会发生错误。 - ZK事件方法为 :
public void onType$ComponentId(ForwardEvent event) {}; - ZK执行事件方法的语句:
javascript:zAu.send(new zk.Event(zk.Widget.$(jq('$ComponentId')), 'MethodName',['参数1','参数2',...]));
public void MethodName$ComponentId(ForwardEvent event){
Object[] oData = (Object[]) e.getOrigin().getData();
String 参数1= oData[0].toString();
String 参数2= oData[1].toString();
...
}; - 相关下载
UsualUtil.java usualutil.rar 布局:
http://wenku.baidu.com/view/49e52ca6b0717fd5360cdc27.html (布局)