随笔-57  评论-129  文章-0  trackbacks-0
 

JSA的压缩过程分两步,第一步是语法压缩,类似于Dojo ShrinkSafe,但比他安全,也比他有效。



第二步是文本压缩,目前采用的是

JavaScript Compressor的压缩算法。

(http://dean.edwards.name/packer/ )



这些都可以在设置窗口设置。

默认情况先用语法压缩,当文件大于1000k且采用文本压缩仍然可以压缩到原来大小90%时才在原来基础上采用文本压缩。







to shinwell

你的担心多余了。



to dev:

Online Dojo JavaScript Compressor 就是 Dojo ShrinkSafe 。

说的好听,其实一点都不safe。

如果你觉得火药桶上暖和,那你就多坐一会吧!



下载地址:

http://sourceforge.net/project/showfiles.php?group_id=175776

或者

http://forum.xidea.org 文件列表




评论也很精彩,请点击查看精彩评论。欢迎您也添加评论。查看详细 >>





JavaEye推荐
杭州:外企高薪聘请系统维护工程师(10-15K)
杭州:国内大型网络公司高薪招聘系统架构师,资深JAVA开发工程师
北京:优秀公司NHNChina招聘:WEB开发,系统管理,JAVA开发, DBA
广州:急招 JAVA开发经理/系统架构师(10-15K/月)也招聘java程序员



文章来源: http://jindw.javaeye.com/blog/57832
posted @ 2007-03-06 18:43 金大为 阅读(131) | 评论 (0)编辑 收藏

山若不高,不必绕行。
水若不宽,蹦过也成。
居于陋室,五风俱兴。
四壁管弦奏,秋雨泻前厅。
出入有虫蚁,往来惊犬禽。

可以鸣长铳,猎山鸡。
清丝竹之乱耳,去案牍之劳形。
祖山静修寺,荷岭微波亭。
大为曰∶“逛逛也行”

文章来源:http://jindw.spaces.live.com/Blog/cns!4D0B98F5F0C51177!107.entry
posted @ 2007-02-09 18:26 金大为 阅读(58) | 评论 (0)编辑 收藏

JavaScript Integration 1.1Alpha6发布






原名JSPackager,无侵入的脚本管理框架。


更多信息见:


http://www.xidea.org


http://forum.xidea.org


现在发布的1.1a6版本有如下重大改进:


XML Template for JavaScript


Xml Template for JavaScript,使用原生xml解析,和脚本求值运算(eval函数),实现的xml模板引擎(js.xml.Template)。非常简洁。


1.1alpha6之后自带的jsdoc工具,就是使用该技术开发的。




JSI组建模型 JSDecorator 雏形


用于装饰朴素html元素的框架,使用简单的xml标记,标识期装饰行为,比如将一个不通的input装饰成一个日期输入控件。将一个textarea装饰成一个代码语法高亮显示区域,或一个wysiwyg html编辑器。


JSI启动后将自动检查decorator标记,自动做相关类的寻找、导入并装饰页面。


脚本API实时解析程序(JSDoc)


基于xml template 开发的文档工具,实时解析,无需安装任何软件,纯html/js应用程序。可以简化文档写作及api查阅。




 




评论也很精彩,请点击查看精彩评论。欢迎您也添加评论。查看详细 >>

推荐相关文章:
  简单小巧的多级联动菜单
  JavaScript 解析 XML 时如何通过名称直接取到值?




JavaEye推荐
杭州:外企高薪聘请系统维护工程师(10-15K)
杭州:国内大型网络公司高薪招聘系统架构师,资深JAVA开发工程师
北京:优秀公司NHNChina招聘:WEB开发,系统管理,JAVA开发, DBA
广州:急招 JAVA开发经理/系统架构师(10-15K/月)也招聘java程序员



文章来源: http://jindw.javaeye.com/blog/53489
posted @ 2007-02-09 12:03 金大为 阅读(59) | 评论 (0)编辑 收藏

非常讨厌Struts1 Action的设计,一堆花俏的概念,没必要的复杂度.
但是工作关系,还非要使用这个垃圾,没办法,只好把苍蝇包起来咽下去.

做一个Action基类,SimpleAction ,把它封装的更像webwork.
 
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;


/**
 * @author jindw
 * @xwork.package name = ""
 */
public final class SimpleAction extends AbstractAction {
    /**
     * Commons Logging instance.
     */
    protected static Log log = LogFactory.getLog(SimpleAction.class);

    /**
     * common result name define
     */
    public static final String SUCCESS = "success";

    public static final String ERROR = "error";

    public static final String INPUT = "input";

    /**
     * method cache
     */
    protected Map executeMap = new HashMap();

    protected Map executeArgumentTypesMap = new HashMap();

    public SimpleAction() {
        super();
        Method[] methods = this.getClass().getMethods();
        for (int i = 0; i < methods.length; i++) {

            Method method = methods[i];
            if (String.class != method.getReturnType()) {
                continue;
            }
            Class[] params = method.getParameterTypes();
            int argCount = 0;
            for (int j = 0; j < params.length; j++) {
                if (ActionForm.class.isAssignableFrom(params[j])) {
                    argCount++;
                } else if (HttpServletRequest.class.isAssignableFrom(params[j])) {
                    argCount++;
                } else if (HttpServletResponse.class
                        .isAssignableFrom(params[j])) {
                    argCount++;
                } else if (ActionMapping.class.isAssignableFrom(params[j])) {
                    argCount++;
                } else {
                    argCount = -1;
                    break;
                }
            }
            if (argCount >= 0) {
                executeMap.put(method.getName(), method);
                executeArgumentTypesMap.put(method.getName(), params);
            }
        }
        initialize();
    }

    protected void initialize() {
        Method[] methods = this.getClass().getMethods();
        for (int i = 0; i < methods.length; i++) {
            Class[] paramTypes = methods[i].getParameterTypes();
            if (paramTypes.length == 1) {
                String name = methods[i].getName();
                if (name.startsWith("set")) {
                    name = name.substring(3);
                    if (name.length() > 0) {
                        char fc = name.charAt(0);
                        if (Character.isUpperCase(fc)) {
                            name = Character.toLowerCase(fc)
                                    + name.substring(1);
                            //implement it eg:get from Spring Context
                            Object value = getBean(name);
                            if (value != null) {
                                try {
                                    methods[i].invoke(this,
                                            new Object[] { value });
                                } catch (Exception e) {
                                    log.info("set property error:", e);
                                }
                            }
                        }
                    }
                }
            }
        }
    }



    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        // Get the method's name. This could be overridden in subclasses.
        String methodName = getMethodName(mapping, form);
        // Invoke the named method, and return the result
        String result = dispatchMethod(mapping, form, request, response,
                methodName);
        request.setAttribute("actionForm", form);
        if(result == null){
            return null;
        }else{
            return transformForward(mapping.findForward(result), request);
        }
    }

    /**
     * @param forward
     * @param request
     * @return
     */
    protected ActionForward transformForward(ActionForward forward,
            HttpServletRequest request) {
        if (forward == null) {
            return null;
        } else {
            StringBuffer buf = new StringBuffer(forward.getPath());
            boolean containsVariable = false;
            for (int k = 0, i = buf.indexOf("${", k); i >= 0; i = buf.indexOf(
                    "${", k), k = i) {
                int j = buf.indexOf("}", i);
                if (j > 0) {
                    containsVariable = true;
                    k = j;
                    String key = buf.substring(i + 2, j);
                    Object o = null;
                    if(key.indexOf('.')<0){
                        o=request.getAttribute(key);
                    }else{
                        String[] keys = key.split("[.]");
                        o=request.getAttribute(keys[0]);
                        for(int l = 1;l<keys.length;l++){
                            try
                            {
                                o = BeanUtilsBean.getInstance().getPropertyUtils().getProperty(o, keys[l].trim());
                            }
                            catch (Exception e)
                            {
                                log.debug("find property error:", e);
                                o = null;
                                break;
                            }
                            
                        }
                    }
                    buf.replace(i, j + 1, String.valueOf(o));
                }
            }
            if (containsVariable) {
                forward = new ActionForward(forward);
                forward.setPath(buf.toString());
                return forward;
            } else {
                return forward;
            }
        }
    }

    public static void main(String[] args) {
        StringBuffer buf = new StringBuffer("http://sdssfs${123}&{123}&${sd}");
        for (int k = 0, i = buf.indexOf("${", k); i >= 0; i = buf.indexOf("${",
                k), k = i) {
            int j = buf.indexOf("}", i);
            if (j > 0) {
                k = j;
                String key = buf.substring(i + 2, j);
                buf.replace(i, j + 1, "%" + key + "%");
            }
        }
        System.out.println(buf);
    }

    protected String dispatchMethod(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response,
            String methodName) throws IllegalArgumentException,
            IllegalAccessException, InvocationTargetException {
        Method method = (Method) executeMap.get(methodName);
        Class[] argumentTypes = (Class[]) executeArgumentTypesMap
                .get(methodName);
        Object[] params = new Object[argumentTypes.length];
        for (int i = 0; i < params.length; i++) {
            Class type = argumentTypes[i];
            if (ActionForm.class.isAssignableFrom(type)) {
                if(type.isAssignableFrom(form.getClass())){
                    params[i] = form;
                }else{
                    throw new ClassCastException("action form type is:"+form.getClass()+";but required:"+type+";");
                }
            } else if (HttpServletRequest.class.isAssignableFrom(type)) {
                params[i] = request;
            } else if (HttpServletResponse.class.isAssignableFrom(type)) {
                params[i] = response;
            } else if (ActionMapping.class.isAssignableFrom(type)) {
                params[i] = mapping;
            }
        }
        return (String) method.invoke(this, params);
    }

    protected String getMethodName(ActionMapping mapping, ActionForm form) {
        String param = mapping.getParameter();
        if (param != null) {
            int i = param.indexOf("method=");
            if (i > 0) {
                int j = param.indexOf(i, ';');
                if (j >= 0) {
                    return param.substring(i + ("method=".length()), j).trim();
                } else {
                    return param.substring(i + ("method=".length())).trim();
                }
            } else {
                if (this.executeMap.containsKey(param)) {
                    return param;
                }
            }
        }
        return "execute";
    }


}





评论也很精彩,请点击查看精彩评论。欢迎您也添加评论。查看详细 >>





JavaEye推荐
杭州:外企高薪聘请系统维护工程师(10-15K)
杭州:国内大型网络公司高薪招聘系统架构师,资深JAVA开发工程师
北京:优秀公司NHNChina招聘:WEB开发,系统管理,JAVA开发, DBA
广州:急招 JAVA开发经理/系统架构师(10-15K/月)也招聘java程序员



文章来源: http://jindw.javaeye.com/blog/33983
posted @ 2006-09-05 18:01 金大为 阅读(68) | 评论 (0)编辑 收藏

今天无意间看了几篇struts1相关的新文章,有些反感作者自以为是的观点:

不知道国人为什么还会对struts1这种垃圾会如此盲目崇拜。

在我看来,struts1除了制造了一堆中看不中用的可以用来折磨开发人员的概念之外,没做几项漂亮的事情(我承认这样说是偏激,只是给那些某些盲目崇拜的struts1写手们的反击而已)。

曾经struts1提出的创造性模式,一些新的mvc框架也都具备,也做了些自己的改进,也许以前 struts1是一个创造性的成果,但现在来说,它只是一个铺路石而已!

IT技术都是各领风骚3两年,它该隐退了,那个老态臃肿的家伙---Struts1。

最近Struts项目也开始做一些颠覆性的改进,比如struts2将来自webwork,将使用xwork作为它的核心。这也从一个侧面反映了原来struts1的迷茫。

那些自以为是的struts1文档写手,醒醒吧,别误导新人了。




评论也很精彩,请点击查看精彩评论。欢迎您也添加评论。查看详细 >>





JavaEye推荐
杭州:外企高薪聘请系统维护工程师(10-15K)
杭州:国内大型网络公司高薪招聘系统架构师,资深JAVA开发工程师
北京:优秀公司NHNChina招聘:WEB开发,系统管理,JAVA开发, DBA
广州:急招 JAVA开发经理/系统架构师(10-15K/月)也招聘java程序员



文章来源: http://jindw.javaeye.com/blog/33984
posted @ 2006-08-12 19:02 金大为 阅读(36) | 评论 (0)编辑 收藏

微软的帮助文件,其提供了一个叫做“HTML Help Workshop”的工具制作和编译。

但是其目录编辑的操作不是很方便,而且绝对是件非常枯燥的事情。

看看他的目录描述文件:

 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" content="Microsoft® HTML Help Workshop 4.1">
<!-- Sitemap 1.0 -->
</HEAD>
<BODY>
<OBJECT type="text/site properties">
 <param name="ImageType" value="Folder">
</OBJECT>
<UL>
   <LI> <OBJECT type="text/sitemap">
      <param name="Name" value="index">
      <param name="Local" value="html\index.html">
      </OBJECT>
  <LI> <OBJECT type="text/sitemap">
     <param name="Name" value="前言">
     <param name="Local" value="html/preface.html">
     </OBJECT>
..........................
</UL>
</BODY></HTML>

好了,是一种用html 文本描述的结构,我们只要在其中插入几个表示目录的OBJECT标记就是。

对于hibernate 参考来说,其目录写在一个index.html文件中,我们可以简单的通过网页脚本吧它的目录读出,代码如下:

<textarea id=text rows="30" cols="100" wrap="off"
 ondblclick="writeTree(this)"
></textarea>

 <script>
 function writeTree(disp,root){
   if(root == null){
     root=document.body.getElementsByTagName("DL")[0];
   }
   var value = ""
   value += '<HTML><!-- Sitemap 1.0 --><BODY><OBJECT type="text/site properties"><param name="Window Styles" value="0x800025"><param name="ImageNumber" value="11"></OBJECT><UL>\n';
   value += buildTree(0,root);
   value += '</UL></BODY></HTML>';
   disp.value= value;
 }
 function buildTree(deep,root){
   var perfix="";
   for(var j=0;j<deep;j++){
     perfix+='\t';
   }
   var value="";
   var eles = root.childNodes;
   for(var i=0;i<eles.length;i++){
      var entry = eles[i];
      if(entry.tagName == "DT"){
        var link = entry.getElementsByTagName("A")[0];
        if(link.firstChild){
          value+=perfix;
          value+='<LI> <OBJECT type="text/sitemap">';
        value+='<param name="Name" value="'+link.firstChild.nodeValue+'">';
        value+='<param name="Local" value="guide/'+link.getAttribute("href")+'">';
        value+='</OBJECT>\n';
      }
    }else if(entry.tagName == "DD"){
      var dir = entry.getElementsByTagName("DL")[0]; 
      value+=perfix+"<UL>\n";
      value+=buildTree(deep+1,dir);
      value+=perfix+"</UL>\n";
    }
     

   }
   return value;
 }
 </script>


将这段代码插入htm文件的body 元素后,打开,双击多行文本框。将声称chm 目录描述,将其保存为contents.hhc,重新打开chm工程后,将contents.hhc文件加入到工程,编译,chm 文件制作完成。






评论也很精彩,请点击查看精彩评论。欢迎您也添加评论。查看详细 >>





JavaEye推荐
杭州:外企高薪聘请系统维护工程师(10-15K)
杭州:国内大型网络公司高薪招聘系统架构师,资深JAVA开发工程师
北京:优秀公司NHNChina招聘:WEB开发,系统管理,JAVA开发, DBA
广州:急招 JAVA开发经理/系统架构师(10-15K/月)也招聘java程序员



文章来源: http://jindw.javaeye.com/blog/33990
posted @ 2005-06-11 15:26 金大为 阅读(68) | 评论 (0)编辑 收藏
仅列出标题
共6页: 上一页 1 2 3 4 5 6