在主界面菜單中選擇Tools-->Resources-->DBMS.
再彈出的菜單中選擇需要擴(kuò)展的數(shù)據(jù)庫類型。
點(diǎn)擊左上角Property圖標(biāo),彈出模板設(shè)置窗口。
在窗口中設(shè)置相應(yīng)的Sql生成模板。
2006年10月12日 #
今天遇到了需要在 javascript 中繼承的問題:
查了一些帖子,自己又寫了幾個(gè)例子測(cè)試了一下,總結(jié)如下:
js 中實(shí)現(xiàn)繼承有三種方法:
假設(shè)父類為 Parent, 子類為 Child,
第一種,子類強(qiáng)制調(diào)用父類構(gòu)造
function Child(){
?????? Parent.call(this);
}
第二種,子類間接調(diào)用父類構(gòu)造
function Child(){
?????? this.base = Parent;
?????? this.base();
}
第三種:設(shè)置原型
function Child(){}
Child.prototype = new Parent();
這種方式雖然不夠直觀,卻應(yīng)該是最有效率的方式。
其實(shí) js 本身是沒有什么繼承之類的概念的,只是為了使用利用 js 的一些特性而加的。
js 的原型方式 prototype, 使得許多的工作變得容易。
一個(gè) function 對(duì)象和根據(jù) function 構(gòu)造出來的對(duì)象是不同的。
一個(gè) function 對(duì)象的原型其實(shí)就是一個(gè)根據(jù) function 對(duì)象構(gòu)建出來的對(duì)象。
記住:這個(gè)對(duì)象可與 new 出來的對(duì)象不一樣。在 function 內(nèi)部的代碼并不會(huì)被執(zhí)行,如:
this.funcName = function() 這樣的代碼。而 new 出來的對(duì)象則不然,他具有執(zhí)行后的對(duì)象特性。
function 的局部變量相當(dāng)于 class 里的私有變量,無法在子類中獲取和操作。但 this. 的部分是可以的。
(這是我推斷的,沒有任何的根據(jù),當(dāng)然也是可以測(cè)試的):
當(dāng)一個(gè) Child 被 new 時(shí),第一二種方法中, js 執(zhí)行器
1 、先分配一個(gè)空間,(相當(dāng)于 this = new Object() ) (msdn 中有具體的描述 )
2 、拷貝原型:
3 、執(zhí)行構(gòu)造:也就是 Child.call(this) (相當(dāng)于 child(), 此時(shí) this 對(duì)象有值)( msdn 中有描述)
然后執(zhí)行 Parent(); 這個(gè)時(shí)候 parent 的構(gòu)造函數(shù)執(zhí)行以下幾步:
1 、將 parent 的 prototype 拷貝到 object 區(qū)域,這時(shí)覆蓋了前面的區(qū)域 ( 好像測(cè)試證明 parent 的原型并不會(huì)被拷貝,此步不會(huì)被執(zhí)行 )
2 、對(duì)這個(gè)區(qū)域執(zhí)行初始化,也就是正常的 function 調(diào)用的過程。(相當(dāng)于 Parent(),this 變量有值)
而普通的 function 調(diào)用應(yīng)該是這個(gè)樣子:由于沒有 new 操作符,所以沒有為其分配當(dāng)前的 this( 也沒有空間 ),
this 被放到了 window 對(duì)象上。但是 new 的時(shí)候顯然不是這樣。
obj.func() 的調(diào)用和 func() 調(diào)用是完全不一樣的, obj.func 中 this 對(duì)象是 obj 對(duì)象,而 func() 調(diào)用 this 對(duì)象是 window 對(duì)象,這個(gè)應(yīng)該和 jvm 中靜態(tài)方法和類實(shí)例方法調(diào)用的區(qū)別的原理一樣。
在實(shí)現(xiàn)了對(duì)象繼承之后,我開始面臨到第二個(gè)問題,重載。
js 怎樣實(shí)現(xiàn)重載。
1 、簡(jiǎn)單的重載:
在這種重載中,子類的方法無需調(diào)用父類的方法,直接在執(zhí)行父類構(gòu)造之后,再執(zhí)行子類的重載方法,如 Parent 的 toString() 方法,這時(shí)只需執(zhí)行 this.toString = function(){....} 就可以了。
2 、調(diào)用父類方法的重載:
由于 js 實(shí)際運(yùn)行時(shí)并沒有父類、子類兩個(gè)實(shí)例空間,所以 super.toString() 肯定是不行的,而在子類的 toString 方法中進(jìn)行 this.toString() 調(diào)用只能引起內(nèi)存溢出,其實(shí)這種也可以想辦法做到。
this.super_toString = this.toString();
this.toString=function(){
?????? ..............
?????? this.super_toString();
?????? ..............
}
基本的方法,網(wǎng)上到處都是,在 java 中就是在 web.xml 注冊(cè)一個(gè) Listener ,如下:
<listener>
??? <listener-class>xp.web.SessionCounter</listener-class>
</listener>
SessionCounter.java 實(shí)現(xiàn) javax.servlet.http.HttpSessionListener 接口,分別在 sessionCreated 方法和 sessionDestroyed 方法中處理 session 數(shù)目。
這樣的方法有一定的問題:
1 、對(duì)于真正從網(wǎng)頁訪問的和搜索引擎的 spider 無法區(qū)分。
2 、當(dāng) Tomcat 重啟時(shí),加載了上次持久化的 session 時(shí),無法準(zhǔn)確計(jì)算在線數(shù)。
第二個(gè)問題我們可以不予考慮,這是 tomcat 容器實(shí)現(xiàn)不標(biāo)準(zhǔn)的問題,我們要解決的是的第一個(gè)問題,如何知道你的訪問的是真實(shí)的。
用 js 繞過搜索引擎 :
做過 pv 統(tǒng)計(jì)的都知道,可以用 script 的方式得到你真實(shí)的 pageView 數(shù)目,我們現(xiàn)在要做的就是這樣的一件事情,我們?cè)谒械捻撁娑技尤胍欢卧挘?/span>
<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>
然后我們寫上一個(gè) 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());
}
}
我們可以看到這個(gè) servlet 只是做了一件事情,在 process 里面做了 SessionCounter.put(request.getSession().getId()); 這個(gè)動(dòng)作。
我們來看看我們的 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();
??? }
}
我們記錄了一個(gè)靜態(tài)的 hash 表來記錄激活狀態(tài)的 sessionid ,并在 session 銷毀的時(shí)候?qū)⑦@個(gè) sessionid 置為空。
怎么把 servlet 配置到 web 應(yīng)用中我就不羅唆了。
???最近做網(wǎng)頁的時(shí)候無意中發(fā)現(xiàn)一個(gè)有意思的問題,只在Ie中測(cè)試過,不知道在firefox中有什么現(xiàn)象。
先定義樣式表:
<STYLE>
DIV .head1
{
?background-color: yellow;
}
DIV.head2
{
?background-color: red;
}
</STYLE>
展現(xiàn)樣式:
<div class="head1">div1</div>
<span class="head1">span1</span>
<div class="head2">div1</div>
<span class="head2">span1</span>
<div>
<div class="head1">div2</div>
<span class="head1">span2</span>
</div>
<p>
<div class="head1">div2</div>
<span class="head1">span2</span>
</p>