应用,一定要应用

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

2008年6月21日 #

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

2006年12月28日 #

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 阅读(1204) | 评论 (1)编辑 收藏

2006年12月14日 #

基本方法:

基本的方法,网上到处都是,在 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 阅读(2387) | 评论 (1)编辑 收藏

2006年11月6日 #

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

2006年11月2日 #

   最近做网页的时候无意中发现一个有意思的问题,只在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 阅读(3029) | 评论 (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 阅读(5839) | 评论 (7)编辑 收藏

2006年11月1日 #

最近写网页,用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 阅读(2369) | 评论 (2)编辑 收藏

2006年10月12日 #

最近由于项目需要,开始对全文检索做些了解,刚刚开始,由于项目人力的严重不足,我没有太多的时间进行细致的研究,不知道能走到如何的一个深度,走一步,看一步吧。

我用java做的开发,由于数据库表并不多,我没有采用hibernate或者其他的持久层,而是直接使用了jdbc进行数据库操作。数据库使用的是Mysql。

做搜索,第一想到的就是like了,后来发现条件可能比较复杂,效率可能低下,于是准备添加全文检索的搜索模式。

第一类:数据库内嵌全文检索

第一种方案:毫无疑问,最为省事的还是数据库直接帮我搞定,我无须安装新的东西,也不用花太多的时间做新的研究。
      我用的是Mysql5.1。查官方文档,使用全文检索技术很简单:
      把表建成MyIsam的,
      然后导入数据,
      然后建立fulltext索引,
      然后,调整什么最小词长(这个部分我还没做就发现问题了,节约了一部分工作量),
      然后写一个select * from tbl where match (col1,col2) against ("关键字1","关键字2")的sql,
      于是发现没有任何的返回记录。上网google了一下,才知道mysql不支持中文的全文,在Mysql5.1参考手册12.7.4中有这么一段话:
      诸如汉语和日语这样的表意语言没有自定界符。因此 FULLTEXT分析程序不能确定在这些或其它的这类语言中词的起始和结束的位置。其隐含操作及该问题的一些工作区在12.7节,“全文搜索功能”有详细论述。
      但我没有找到任何关于这个部分的描述,所以我暂时认为Mysql直到现在对中文的全文检索依然没有支持。

第二种方案:修改版的mysql,因为mysql是开源的软件,那么mysql本身不支持,有没有中文版的能支持呢,在google中顺手搜到了一个,海量公司研发了一个,网址:http://www.hylanda.com/,由于不是开源的,公司是商业化运作,加上网上应用的人好像也不多,故而这个方案也被搁置了。

第三种方案:插件,网上能够google到的就是这样一个:http://myft.twomice.net/,目前好像是开源运作,我还没有尝试,粗略看了一下,怎么还要自己编译mysql,好像和插件的概念有些出入,不过总的来说,这个方式还是值得尝试的。

第四种方案:更换数据库,目前还有oracle,ms-sql可以选择,这两个的中文搜索不知道做的如何,如果不错的,而mysql又不能解决的话,就换数据库吧,我想用oracle应该好一些。

第二类:开源全文检索引擎
目前最火的就是lucene吧,可以研究研究。

在搜索中发现了这样一篇博客文章,加上,以备查。
http://blog.csdn.net/jeafyezheng/archive/2006/09/29/1306463.aspx
posted @ 2006-10-12 13:28 flyffa 阅读(484) | 评论 (0)编辑 收藏

2006年8月24日 #

     摘要: 2004-12-03 JSP/XML/JSTL Jsp 和 xml 的合作 l         方式 1 : 第一个大的趋...  阅读全文
posted @ 2006-08-24 17:15 flyffa 阅读(1489) | 评论 (0)编辑 收藏

2004-12-03

第一部分:JSP和J2EE
1、1什么是javabean
javabean的属性分为四类:
1、simple:简单属性
propName
getter:getpropName()
setter:setpropName()

2、Index:索引属性
propName
getter:[] getpropName()
setter:setpropName()
getterI: obj getpropName(int i)
setterI: setpropName(int i,obj)

3、bound:触发propertychange事件的属性
接口和普通属性没有什么不同,只是在setter里支持触发事件propertychange.

4、constrained:限制类属性
接口和普通属性一致,setter支持bound,另外:
在setter中支持触发事件让相关监听组件来判断是否可以设置,如果不行,其他组件会抛出propertyvetoException

事件模型:
基于源和listener的的事件模型。observer模式。
事件:java.util.EventObject及其子类。
监听者:java.util.EventListener及其子类。
源对象:接口必须标准
public void add< ListenerType>(< ListenerType> listener)
public void remove< ListenerType>(< ListenerType> listener)

事件适配器:
可以用作确定会做出反映的事件响应者的用途。

2、在jsp中使用

3、jsp中javabean的scope
application scope:应用程序级别的。
session scope:会话级别
request scope:请求级别
page scope:页面级别

1、2 ejb
特殊的面向服务器端的javabeans.
包含sessionbean和entitybean两种
home
Home 接口定义了创建查找删除EJB 远程接口对象或者EJB 服务的方法客户端
应用程序通过使用JNDI 技术定位Home 接口的位置一旦获得Home 接口的实例就可以
利用它的create()方法创建EJB 远程接口的实例对象
remote接口
远程调用接口 (或者简称为远程接口Remote Interface)是对EJB 对象方法的总封装
在远程调用接口中声明了EJB 对象的方法但是并没有具体实现这些方法。

3、jsp中javabean的scope
application scope:应用程序级别的。
session scope:会话级别
request scope:请求级别
page scope:页面级别

1、2 ejb
特殊的面向服务器端的javabeans.
包含sessionbean和entitybean两种
home
Home 接口定义了创建查找删除EJB 远程接口对象或者EJB 服务的方法客户端
应用程序通过使用JNDI 技术定位Home 接口的位置一旦获得Home 接口的实例就可以
利用它的create()方法创建EJB 远程接口的实例对象
remote接口
远程调用接口 (或者简称为远程接口Remote Interface)是对EJB 对象方法的总封装
在远程调用接口中声明了EJB 对象的方法但是并没有具体实现这些方法。


posted @ 2006-08-24 17:13 flyffa 阅读(402) | 评论 (0)编辑 收藏

仅列出标题  下一页