zk学习总结

 

  1. 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会被重新加载出来,所以得用第二种方法。

  2. 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-name>CKUpload</servlet-name>
    <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";

  3. Configuration config =       desktop.getWebApp().getConfiguration(); 
    config.setMaxUploadSize( 102400 ); // 单位 KB ,如果为负则不限制大小

  4. 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>

  5. 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中的池会被占满,而出现访问异常的问题,所以尽量少使用游标。

  6. zk使用存储过程后调用在存过中生成的临时表.
    调用存储过程跟上面 第 5 一样.

    调用存储过程中生成的临时表,就是用Session再调用一次 select * from 临时表的 mybatis段。
    因为临时表是在一个会话区间存在的,所以不用担心用户太多而产生抢占或更改别的用户数据的问题。
  7. 相关文件下载
    CKEditorUploadServlet (web.xml配置的上传类)
    ckeditoruploadservlet.rar
  8. 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) {
                    //上传成功.
                }
            }
    }

  9. Listbox 与 Listitem
    前者的 addEventListener ("xxx", new EventListener() {}); 有onSelect 后者是 onClick;

  10. 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 不然会发生错误。

  11. ZK事件方法为 :
    public void onType$ComponentId(ForwardEvent event) {};

  12. 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();
        ...
    };

  13. 相关下载
    UsualUtil.java usualutil.rar 布局:
    http://wenku.baidu.com/view/49e52ca6b0717fd5360cdc27.html (布局)
posted @ 2013-04-09 11:36  feifeihu  阅读(748)  评论(0编辑  收藏  举报