应用,一定要应用

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

2006年11月1日 #

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

     摘要: 在网上找了一些文档,还是觉得不是很清楚,自己走了些弯路,才把这个配置好,还是写下来吧,以备后查。 1.   目标 使用 apache 和 tomcat 配置一个可以应用的 web 网站,要达到以下要求: ...  阅读全文
posted @ 2006-11-06 11:49 flyffa 阅读(3311) | 评论 (9) | 编辑 收藏

   最近做网页的时候无意中发现一个有意思的问题,只在Ie中测试过,不知道在firefox中有什么现象。
先定义样式表:
<STYLE>
DIV .head1
{
 background-color: yellow;
}

DIV.head2
{
 background-color: red;
}

</STYLE>


展现样式:

<div class="head1">div1</div>
<span class="head1">span1</span>
<div class="head2">div1</div>
<span class="head2">span1</span>

div1
span1
div1
span1

测试head1 与head2的区别

<div>
<div class="head1">div2</div>
<span class="head1">span2</span>
</div>

div2
span2

<p>
<div class="head1">div2</div>
<span class="head1">span2</span>
</p>

div2
span2




总结:
 head1样式和head2样式的主要区别就是中间多了一个空格。 感觉像是head1样式是指在div内部适用的样式; head2样式是应用于div元素上的样式;

另:由于博客上的编辑器自动在style之间增加了cdata角标,导致我的效果无法显示,head1的效果我是通过设置背景色完成的,有兴趣的朋友可以把那几段代码拷出来存成一个文件,就可以看到效果。

请高手指教。

posted @ 2006-11-02 13:14 flyffa 阅读(3146) | 评论 (7) | 编辑 收藏

      自己以前做程序都是自己写连接池,那个时候项目大,环境各异,为了便于实施,总是由自己进行连接池的管理,等到自己想做一些小东西的时候,才发现这个连接池成了一个专用的东西,和系统做了太多的绑定,只能找连接池用,用过resin自带的连接池,再用tomcat连接池的时候就很不爽,没有监控的功能,在网上选来选去,最后选择了Proxool。

      Proxool连接池是sourceforge下的一个开源项目,这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。开源项目地址是:
http://proxool.sourceforge.net/


配置连接池比较的简单:
1、将下载的包解开,从包中的lib目录下将proxool-xxx.jar(xxx随着不同的版本号变化)加入你的工程中。
2、配置数据源:
      在web-info下建立文件:proxool.xml,文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<something-else-entirely>
  <proxool>
    <alias>Develop</alias>
    <driver-url>jdbc:mysql://localhost/kuanxue</driver-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <driver-properties>
      <property name="user" value="root"/>
      <property name="password" value=""/>
      <property name="useUnicode" value="true"/>
      <property name="characterEncoding" value="GBK"/>
    </driver-properties>
    <maximum-connection-count>500</maximum-connection-count>
    <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
  </proxool>
 </something-else-entirely>

3、配置web.xml
在web.xml中增加:
<!-- 配置初始化servlet,在web容器加载的时候自动加载配置文件,如果不是web程序,这个部分就需要通过开发接口来初始化了 -->
<servlet>
     <servlet-name>proxoolInitialServlet</servlet-name>
 <servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
     <init-param>
       <param-name>xmlFile</param-name>
       <param-value>WEB-INF/proxool.xml</param-value>
     </init-param>
     <load-on-startup>1</load-on-startup>
   </servlet>
<!--配置监控servlet,其实如果不想监控的话,可以不配-->
   <servlet>
    <servlet-name>dbpoolAdmin</servlet-name>
    <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
  </servlet>
   <servlet-mapping>
    <servlet-name>dbpoolAdmin</servlet-name>
    <url-pattern>/dbpool</url-pattern>
  </servlet-mapping>

4、在程序中调用
一般我将获取connection的行为封装为一个工厂模式,便于多种情况的切换,以下是其中proxool数据源的getConnection方法的实现:

public Connection getConnection() {
        try{
            Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
            return DriverManager.getConnection("proxool.Develop");
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return null;
    }

5、应用开发:
      在实际的应用中,我们可能需要更多的功能,比如监控功能不够强大,权限不好控制,我们希望能够编写出更强大的功能,比如杀死一些大的查询语句等,记录各种查询语句占用的时间,这就需要对开发接口进行进一步的研究了。
posted @ 2006-11-02 12:00 flyffa 阅读(5950) | 评论 (7) | 编辑 收藏

最近写网页,用DIV加CSS实现,发现DIV嵌套时,当内嵌浮动div的时候不能正常扩展

<div style="border-style:solid">
   <div style = "float:right;border-style:solid">dsfsdfsd<div>
</div>

发现内层div会越界,在网上找了一下:
<div style="border-style:solid">
   <div style = "float:right;border-style:solid">dsfsdfsd<div>
   <div style="font: 0px/0px sans-serif;clear: both;display: block">
</div>
加这么一句就好了,顺便查到了一个在firefox中解决的方法:
<div style="border-style:solid">
   <div style = "float:right;border-style:solid">dsfsdfsd<div>
   <br clear="alll">
</div>
posted @ 2006-11-01 12:43 flyffa 阅读(2443) | 评论 (2) | 编辑 收藏