应用,一定要应用

BlogJava 首页 新随笔 联系 聚合 管理
  25 Posts :: 0 Stories :: 118 Comments :: 0 Trackbacks

2006年12月14日 #

Sybase Powerdesigner具有强大的模板和脚本功能,可以自定义和扩展生成数据库时的DDL。
在主界面菜单中选择Tools-->Resources-->DBMS.
再弹出的菜单中选择需要扩展的数据库类型。
点击左上角Property图标,弹出模板设置窗口。
在窗口中设置相应的Sql生成模板。
posted @ 2008-06-21 11:22 flyffa 阅读(916) | 评论 (0)编辑 收藏

1.1. 继承

今天遇到了需要在 javascript 中继承的问题:

查了一些帖子,自己又写了几个例子测试了一下,总结如下:

1.1.1.     三种方法

js 中实现继承有三种方法:

假设父类为 Parent, 子类为 Child,

 

第一种,子类强制调用父类构造

function Child(){

       Parent.call(this);

}

 

第二种,子类间接调用父类构造

function Child(){

       this.base = Parent;

       this.base();

}

 

第三种:设置原型

function Child(){}

Child.prototype = new Parent();

这种方式虽然不够直观,却应该是最有效率的方式。

 

1.1.2.     总结:

其实 js 本身是没有什么继承之类的概念的,只是为了使用利用 js 的一些特性而加的。

 

js 的原型方式 prototype, 使得许多的工作变得容易。

 

一个 function 对象和根据 function 构造出来的对象是不同的。

 

一个 function 对象的原型其实就是一个根据 function 对象构建出来的对象。

记住:这个对象可与 new 出来的对象不一样。在 function 内部的代码并不会被执行,如:

this.funcName = function() 这样的代码。而 new 出来的对象则不然,他具有执行后的对象特性。

 

function 的局部变量相当于 class 里的私有变量,无法在子类中获取和操作。但 this. 的部分是可以的。

 

1.1.3.     猜测和假想

(这是我推断的,没有任何的根据,当然也是可以测试的):

当一个 Child new 时,第一二种方法中, js 执行器

1 、先分配一个空间,(相当于 this = new Object() (msdn 中有具体的描述 )

2 、拷贝原型:

3 、执行构造:也就是 Child.call(this) (相当于 child(), 此时 this 对象有值)( msdn 中有描述)

然后执行 Parent(); 这个时候 parent 的构造函数执行以下几步:

1 、将 parent prototype 拷贝到 object 区域,这时覆盖了前面的区域 ( 好像测试证明 parent 的原型并不会被拷贝,此步不会被执行 )

2 、对这个区域执行初始化,也就是正常的 function 调用的过程。(相当于 Parent(),this 变量有值)

 

而普通的 function 调用应该是这个样子:由于没有 new 操作符,所以没有为其分配当前的 this( 也没有空间 ),

this 被放到了 window 对象上。但是 new 的时候显然不是这样。

 

obj.func() 的调用和 func() 调用是完全不一样的, obj.func this 对象是 obj 对象,而 func() 调用 this 对象是 window 对象,这个应该和 jvm 中静态方法和类实例方法调用的区别的原理一样。

 

1.2. 方法重载

在实现了对象继承之后,我开始面临到第二个问题,重载。

1.1.4.     两种方法

js 怎样实现重载。

1 、简单的重载:

在这种重载中,子类的方法无需调用父类的方法,直接在执行父类构造之后,再执行子类的重载方法,如 Parent toString() 方法,这时只需执行 this.toString = function(){....} 就可以了。

 

2 、调用父类方法的重载:

由于 js 实际运行时并没有父类、子类两个实例空间,所以 super.toString() 肯定是不行的,而在子类的 toString 方法中进行 this.toString() 调用只能引起内存溢出,其实这种也可以想办法做到。

 

this.super_toString = this.toString();

this.toString=function(){

       ..............

       this.super_toString();

       ..............

}

posted @ 2006-12-28 14:39 flyffa 阅读(1223) | 评论 (1)编辑 收藏

基本方法:

基本的方法,网上到处都是,在 java 中就是在 web.xml 注册一个 Listener ,如下:

<listener>

    <listener-class>xp.web.SessionCounter</listener-class>

</listener>

SessionCounter.java 实现 javax.servlet.http.HttpSessionListener 接口,分别在 sessionCreated 方法和 sessionDestroyed 方法中处理 session 数目。

 

这样的方法有一定的问题:

1 、对于真正从网页访问的和搜索引擎的 spider 无法区分。

2 、当 Tomcat 重启时,加载了上次持久化的 session 时,无法准确计算在线数。

 

第二个问题我们可以不予考虑,这是 tomcat 容器实现不标准的问题,我们要解决的是的第一个问题,如何知道你的访问的是真实的。

 

js 绕过搜索引擎

做过 pv 统计的都知道,可以用 script 的方式得到你真实的 pageView 数目,我们现在要做的就是这样的一件事情,我们在所有的页面都加入一段话:

<script type="text/javascript">

document.write ("<iframe src='/sessionCountServlet' width=0 height=0 frameborder=no border=0 MARGINWIDTH=0 MARGINHEIGHT=0 SCROLLING=no></iframe>");

</script>

然后我们写上一个 servlet 来记录这些真正的访问者。

import java.io.*;

 

import javax.servlet.*;

import javax.servlet.http.*;

public class SessionCounterServlet extends HttpServlet {

    public SessionCounterServlet() {

        super();

    }

 

    public void doGet(HttpServletRequest request,

                      HttpServletResponse response) throws IOException,

            ServletException {

 

        process(request, response);

 

    }

 

    public void doPost(HttpServletRequest request,

                       HttpServletResponse response) throws IOException,

            ServletException {

 

        process(request, response);

 

    }

 

    public void process(HttpServletRequest request,

                        HttpServletResponse response) throws IOException,

            ServletException {

        SessionCounter.put(request.getSession().getId());

}

}

 

我们可以看到这个 servlet 只是做了一件事情,在 process 里面做了 SessionCounter.put(request.getSession().getId()); 这个动作。

我们来看看我们的 SessionCounter 做了些什么:

import javax.servlet.http.*;

import java.util.Hashtable;

 

public class SessionCounter implements HttpSessionListener {

    public SessionCounter() {

    }

 

    public static Hashtable m_real = new Hashtable();

 

    private static long count = 0;

 

    public void sessionCreated(HttpSessionEvent e) {

        count++;

    }

 

    public void sessionDestroyed(HttpSessionEvent e) {

        if (count > 0) {

            count--;

        }

        m_real.remove(e.getSession().getId());

    }

 

    public static long getSessionCount() {

        return count;

    }

 

    public static void put(String sessionId){

        m_real.put(sessionId,"1");

    }

 

    public static int getRealCount(){

        return m_real.size();

    }

}

我们记录了一个静态的 hash 表来记录激活状态的 sessionid ,并在 session 销毁的时候将这个 sessionid 置为空。

怎么把 servlet 配置到 web 应用中我就不罗唆了。

posted @ 2006-12-14 15:10 flyffa 阅读(2398) | 评论 (1)编辑 收藏