摘要: Javascript的调试,是开发Web应用尤其是AJAX应用很重要的一环,目前对Javascript进行调试的工具很多,我比较喜欢使用的是Firebug。Firebug是Joe Hewitt开发的一套与Firefox集成在一起的功能强大的web开发工具,可以实时编辑、调试和监测任何页面的CSS、HTML和JavaScript。
本文主要是为初学者介绍一下Firebug的基本功能与如何使用Fir...
阅读全文
posted @
2008-05-14 13:00 caihaibo 阅读(1228) |
评论 (0) |
编辑 收藏
最近尝试用extjs来展示树状菜单。着实花了一番功夫。树状菜单的菜单项需要动态加载,而目前版本的extjs中只支持JSON格式的数据。查了一些资料,决定使用struts2的json-plugin。首先按照例子做了一个,但是结果就是不成功,界面上只出来了一个js中生成的root节点,不能加载从后台生成的数据。研究后发现是数据格式有问题。使用json-plugin生成的数据格式如下:
{"cls":"folder","id":10,"leaf":false,"children":[{"cls":"file","id":11,"leaf":true,"children":null,"text":"S600"},{"cls":"file","id":12,"leaf":true,"children":null,"text":"SLK200"}],"text":"Benz"}
而extjs需要的数据格式如下:
[{"cls":"folder","id":10,"leaf":false,"children":[{"cls":"file","id":11,"leaf":true,"children":null,"text":"S600"},{"cls":"file","id":12,"leaf":true,"children":null,"text":"SLK200"}],"text":"Benz"}]
区别很小,就只相差最外面的两个方括号。但是少了这两个方括号,在json中,含义迥然不同,前者表示一个对象,而后者表示一个数组。而extjs中 tree的dataloader需要的数据必须是一个数组。而这样的数据格式是json-plugin自动生成的,无法改变。所以,我最后放弃了json -plugin,转而使用json-lib来解决这个问题。
1. 下载json-lib, http://json-lib.sourceforge.net/
2. lib目录下的jar文件清单:
commons-beanutils-1.7.0.jar
commons-collections-3.2.jar
commons-digester-1.6.jar
commons-lang-2.3.jar
commons-logging-1.1.jar
dom4j-1.6.1.jar
ezmorph-1.0.4.jar
freemarker-2.3.8.jar
json-lib-2.2.1-jdk15.jar
log4j-1.2.13.jar
ognl-2.6.11.jar
struts2-core-2.0.11.jar
xml-apis-1.0.b2.jar
xwork-2.0.4.jar
首先配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
然后是struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true"/>
<constant name="struts.i18n.encoding" value="UTF-8"/>
<package name="person" extends="struts-default">
<action name="menus" method="execute" class="com.lab.MenuAction">
<result>/menu.jsp</result>
</action>
</package>
</struts>
3. 树的节点模型(省略了getter,setter)
public class Menu {
private int id;
private String text;
private boolean leaf;
private String cls;
private List<Menu> children;
}
4. action
package com.lab;
import java.util.ArrayList;
import java.util.List;
import net.sf.json.JSONArray;
public class MenuAction {
private String menuString;
private List<Menu> menus;
public String execute() {
menus = new ArrayList<Menu>();
Menu benz = new Menu();
benz.setText("Benz");
benz.setCls("folder");
benz.setLeaf(false);
benz.setId(10);
menus.add(benz);
List<Menu> benzList = new ArrayList<Menu>();
benz.setChildren(benzList);
Menu menu;
menu = new Menu();
menu.setText("S600");
menu.setCls("file");
menu.setLeaf(true);
menu.setId(11);
benzList.add(menu);
menu = new Menu();
menu.setText("SLK200");
menu.setCls("file");
menu.setLeaf(true);
menu.setId(12);
benzList.add(menu);
Menu bmw = new Menu();
bmw.setText("BMW");
bmw.setCls("folder");
bmw.setLeaf(false);
bmw.setId(20);
menus.add(bmw);
List<Menu> bmwList = new ArrayList<Menu>();
bmw.setChildren(bmwList);
menu = new Menu();
menu.setText("325i");
menu.setCls("file");
menu.setLeaf(true);
menu.setId(21);
bmwList.add(menu);
menu = new Menu();
menu.setText("X5");
menu.setCls("file");
menu.setLeaf(true);
menu.setId(22);
bmwList.add(menu);
JSONArray jsonObject = JSONArray.fromObject(menus);
try {
menuString = jsonObject.toString();
} catch (Exception e) {
menuString = "ss";
}
return "success";
}
public String getMenuString() {
return menuString;
}
public void setMenuString(String menuString) {
this.menuString = menuString;
}
}
5. menu.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:property value="menuString" escape="false"/>
6. html页面和js
我使用的就是extjs的example中的reorder.html和reorder.js,更改了reorder.js中treeloader的dataurl: menus.action
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Reorder TreePanel</title>
<link rel="stylesheet" type="text/css" href="extjs/resources/css/ext-all.css" />
<!-- GC -->
<!-- LIBS -->
<script type="text/javascript" src="extjs/adapter/ext/ext-base.js"></script>
<!-- ENDLIBS -->
<script type="text/javascript" src="extjs/ext-all.js"></script>
<script type="text/javascript" src="reorder.js"></script>
<!-- Common Styles for the examples -->
<link rel="stylesheet" type="text/css" href="extjs/resources/css/example.css" />
</head>
<body>
<script type="text/javascript" src="../examples.js"></script><!-- EXAMPLES -->
<h1>Drag and Drop ordering in a TreePanel</h1>
<p>This example shows basic drag and drop node moving in a tree. In this implementation there are no restrictions and
anything can be dropped anywhere except appending to nodes marked "leaf" (the files). <br></p>
<p>Drag along the edge of the tree to trigger auto scrolling while performing a drag and drop.</p>
<p>In order to demonstrate drag and drop insertion points, sorting was <b>not</b> enabled.</p>
<p>The data for this tree is asynchronously loaded with a JSON TreeLoader.</p>
<p>The js is not minified so it is readable. See <a href="reorder.js">reorder.js</a>.</p>
<div id="tree-div" style="overflow:auto; height:300px;width:250px;border:1px solid #c3daf9;"></div>
</body>
</html>
js:
/*
* Ext JS Library 2.0.1
* Copyright(c) 2006-2008, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
Ext.onReady(function(){
// shorthand
var Tree = Ext.tree;
var tree = new Tree.TreePanel({
el:'tree-div',
autoScroll:true,
animate:true,
enableDD:true,
containerScroll: true,
loader: new Tree.TreeLoader({
dataUrl:'http://localhost:8080/lab/menus.action'
})
});
// set the root node
var root = new Tree.AsyncTreeNode({
text: 'Ext JS',
draggable:false,
id:'source'
});
tree.setRootNode(root);
// render the tree
tree.render();
root.expand();
});
posted @
2008-05-14 11:17 caihaibo 阅读(889) |
评论 (5) |
编辑 收藏
Firebug是Firefox下的一款开发类插件,现属于Firefox的 五星级强力推荐插件之一。它集HTML查看和编辑、Javascript控制台、网络状况监视器于一体,是开发JavaScript、CSS、HTML和 Ajax的得力助手。Firebug如同一把精巧的瑞士军刀,从各个不同的角度剖析Web页面内部的细节层面,给Web开发者带来很大的便利。这是一款让 人爱不释手的插件,如果你以前没有接触过它,也许在阅读本文之后,会有一试的欲望。笔者在撰写此文的时候,正逢Firebug发布1.0正式版,这不能不 说是种巧合。
应用
Firebug插件虽然功能强大,但是它已经和Firefox浏览器无缝地结合在一起,使用简单直观。如果你担心它会占用太多的系统资源,也可以方便地启用/关闭这个插件,甚至针对特定的站点开启这个插件。
在安装好插件之后,先用Firefox浏览器打开需要测试的页面,然后点击右下方的绿色按钮或使用快捷键F12唤出Firebug插件,它会将当前页面分成上下两个框架,如图1所示。
图1:Firebug插件展开图示
从图1中看到,Firebug有6个主要的Tab按钮,下文将主要介绍介绍这几方面的功能。
Console |
HTML |
CSS |
Script |
Dom |
Net |
控制台 |
Html查看器 |
Css查看器 |
脚本条时期 |
Dom查看器 |
网络状况监视 |
Console 控制台
控制台能够显示当前页面中的javascript错误以及警告,并提示出错的文件和行号,方便调试,这些错误提示比起浏览器本身提供的错误提示更加 详细且具有参考价值。而且在调试Ajax应用的时候也是特别有用,你能够在控制台里看到每一个XMLHttpRequests请求post出去的参数、 URL,http头以及回馈的内容,原本似乎在幕后黑匣子里运作的程序被清清楚楚地展示在你面前。
象C shell或Python shell一样,你还能在控制台中查看变量内容,直接运行javascript语句,就算是大段的javascript程序也能够正确运行并拿到运行期的信息。
控制台还有个重要的作用就是查看脚本的log, 从前你也许习惯了使用alert来打印变量,但是Firebug给我们带来了一个新朋友 —— console.log, 最简单的打印日志的语法是这样的:
CODE:
-
console.log("hello world")
如果你有一堆参数需要组合在一起输出,可以写成这样:
CODE:
-
console.log(2,4,6,8,"foo",bar).
Firebug的日志输出有多种可选的格式以及语法,甚至可以定制彩色输出,比起单调的alert,显然更加方便,限于篇幅,这里不做详细说明,但是有志于提高debug效率的读者,可以到Firebug的官方站点(见附录)查看更详细的教程。
图2: 在控制台里调试javascript
查看和修改HTML
第一次看到Firebug强大的HTML代码查看器,就觉得它与众不同,相比于Firefox自带的HTML查看器,它的功能强大了许多。 HTML
首先你看到的是已经经过格式化的HTML代码,它有清晰的层次,你能够方便地分辨出每一个标签之间的从属并行关系,标签的折叠功能能够帮助你集中精 力分析代码。源代码上方还标记出了DOM的层次,如图3所示,它清楚地列出了一个hml元素的parent、child以及root元素,配合 Firebug自带的CSS查看器使用,会给div+css页面分析编写带来很大的好处。你还可以在HTML查看器中直接修改HTML源代码,并在浏览器 中第一时间看到修改后的效果,光凭这一点就会让许多页面设计师死心塌地地成为Firebug的粉丝了。
有时候页面中的javascript会根据用户的动作如鼠标的onmouseover来动态改变一些HTML元素的样式表或背景色,HTML查看器会将页面上改变的内容也抓下来,并以黄色高亮标记,让网页的暗箱操作彻底成为历史。
利用Inspect检查功能,我们还可以用鼠标在页面中直接选择一些区块,查看相应的HTML源代码和CSS样式表,真正的做到所见即所得,如果你 使用了外部编辑器修改了当前网页,可以点击Firebug的reload图片重新载入网页,它会继续跟踪你之前用Inspect选中的区块,方便调试。
图3::HTML查看器
CSS调试
Firebug的CSS调试器是专为网页设计师们量身定做的。
如今的网页设计言必称div+css,如果你是用table套出来的HTML页面,就得按这规矩重构一遍,否则显得你不够时髦!用div做出来的页 面的确能精简HTML代码,HTML标签减肥的结果就是CSS样式表的编写成了页面制作的重头戏。Firebug的CSS查看器不仅自下向上列出每一个 CSS样式表的从属继承关系,还列出了每一个样式在哪个样式文件中定义。你可以在这个查看器中直接添加、修改、删除一些CSS样式表属性,并在当前页面中 直接看到修改后的结果。
一个典型的应用就是页面中的一个区块位置显得有些不太恰当,它需要挪动几个象素。这时候用CSS调试工具可以轻易编辑它的位置——你可以根据需要随意挪动象素。
如图4中正在修改一个区块的背景色。
提示:如果你正在学习CSS样式表的应用,但是总记不住常用的样式表有哪些值,可以尝试在CSS调试器中选中一个样式表属性,然后用上下方向键来改变它的值,它会把可能的值一个个遍历给你看。
图4: CSS查看器,能够直接修改样式表
可视化的CSS尺标
我们可以利用Firebug来查看页面中某一区块的CSS样式表,如果进一步展开右侧Layout tab的话,它会以标尺的形式将当前区块占用的面积清楚地标识出来,精确到象素,更让人惊讶的是,你能够在这个可视化的界面中直接修改各象素的值,页面上 区块的位置就会随改动而变化。在页面中某些元素出现错位或者面积超出预料值时,该功能能够提供有效的帮助,你可以籍此分析offset、margin、 padding、size之间的关系,从而找出解决问题的办法。
图5:Firebug中的CSS标尺
网络状况监视器
也许有一天,你的老板或者客户找到你,抱怨你制作的网页速度奇慢,你该如何应对?你或许会说这可能是网络问题,或者是电脑配置问题,或者是程序太慢,或者直说是他们的人品问题?不管怎么说,最后你可能被要求去解决这个有多种可能的问题。
网络状况监视器能帮你解决这个棘手问题。Firebug的网络监视器同样是功能强大的,它能将页面中的CSS、javascript以及网页中引用 的图片载入所消耗的时间以矩状图呈现出来,也许在这里你能一把揪出拖慢了你的网页的元凶,进而对网页进行调优,最后老板满意客户欢喜,你的饭碗也因此而牢 固。
网络监视器还有一些其它细节功能,比如预览图片,查看每一个外部文件甚至是xmlHttpRequests请求的http头等等。
图6:网络状况监视器
Javascript调试器
这是一个很不错的javascript脚本调试器,占用空间不大,但是单步调试、设置断点、变量查看窗口一个不少。正所谓麻雀虽小,五脏俱全。
如果你有一个网站已经建成,然而它的javascript有性能上的问题或者不是太完美,可以通过面板上的Profile来统计每段脚本运行的时间,查看到底是哪些语句执行时间过长,一步步排除问题。
图7:javascript调试器
DOM查看器
DOM(Document Object Model)里头包含了大量的Object以及函数、事件,在从前,你要想从中查到需要的内容,绝非易事,这好比你去了一个巨大的图书馆,想要找到几本名 字不太确切的小书,众多的选择会让你无所适从。而使用Firebug的DOM查看器却能方便地浏览DOM的内部结构,帮助你快速定位DOM对象。双击一个 DOM对象,就能够编辑它的变量或值,编辑的同时,你可能会发现它还有自动完成功能,当你输入document.get之后,按下tab键就能补齐为 document.getElementById,非常方便。如果你认为补齐得不够理想,按下shift+tab又会恢复原状。用了Firebug的 DOM查看器,你的javascript从此找到了驱使的对象,Web开发也许就成了一件乐事。
图8: Dom查看器
小结
Firebug插件提供了一整套web开发所必需的工具。从HTML的编写,到CSS样式表的美化调优,以及用javascript脚本开发,亦或 是Ajax应用,Firebug插件都会成为你的得力助手。所谓工欲善其事,必先利其器。在Web2.0的时代,言必称Ajax,动辄就是用户体验提升, 如果把Firebug工具用好,必能让你如虎添翼,将HTML、CSS、javascript整理得服服帖帖,从此成为web开发中的专家级人物。
附
Firebug的中文含义是萤火虫,作者是Joe Hewitt,官方网页 http://www.getfirebug.com ,Firefox亦即火狐浏览器
点击下面的星星,参与投票评分
posted @
2008-05-12 16:27 caihaibo 阅读(343) |
评论 (0) |
编辑 收藏
Tomcat 6.0.10 配置指南 |
|
作者:佚名 文章来源:不详 点击数: 更新时间:2007-7-8 |
今天在机子上配置了由Apache Software Foundation研发的开源产品Tomcat 服务器,以用于jsp开发。
首先,在运行Tomcat之前,我们要确保本机已经安装了JDK(Java developing kit),这是运行Tomcat的首要环境。目前,sun公司已经将jdk升级为JDK 6.0,我们可以直接到下面的网址上去下载http://java.sun.com/javase/downloads/index.jsp 。下载完成后按照向导完成安装。然后如下配置环境变量:
JAVA_HOME: C:\Program Files\Java\jdk1.6.0(jdk的安装路径)
CLASSPATH: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
PATH: %JAVA_HOME%\bin;
接下来我们就可以到下面的网址去下载Tomcat的最新版本:http://tomcat.apache.org/download-60.cgi ,我下载的是Tomcat 6.0.10解压版本。下载完成后直接解压缩就可以用了。
Tomcat的目录下面有一个bin目录,我们双击里面的startup.bat就可以使Tomcat运行。
还有一个问题,如果我们注意的话,在运行Tomcat之前,窗口中会打印出如下信息:tomcat6.0The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path。如果你忽略它并不会影响你的正常使用。这是因为Tomcat 可以用 Apache Portable Runtime 来提供更强性能,提升Web静态页面的处理能力,不再需要专门的Web Server来处理静态页面了。
但是APR的支持需要安装三个本地组件
APR support requires three main native components to be installed:
1、APR library
2、JNI wrappers for APR used by Tomcat (libtcnative)
3、OpenSSL libraries
我们可以点击这里http://tomcat.heanet.ie/native 下载编译好的 tcnative-1.dll 文件,然后把它放到bin目录中就OK了。
相关的文档请参见:http://tomcat.apache.org/tomcat-5.5-doc/apr.html
|
posted @
2008-05-09 11:28 caihaibo 阅读(287) |
评论 (0) |
编辑 收藏
1) 安装完MyEclipse后,在Eclpise的菜单栏可看到MyEclipse一项,
下面的工具栏中可看到MyEclipse的Tomcat图标
2) 进行MyEclipse的配置,
从菜单栏中进入“Windows --> Preferences”
3) 先要进行JDK的配置,
在左侧栏中选择“Java --> Installed JREs”,
按“Add”按钮进行添加
4) 在弹出的“Add JRE”画面中,选择JRE的目录,
就是选择你所在的JDK的目录,
在JRE名称一栏中,填下想取的名称,我这里叫“JDK”,
然后“OK”确定
5) 返回到设置框中,将刚刚配置的JRE选中
6) 开始配置MyEclipse,
左侧MyEclipse节点下“Application Server”中有Tomcat,
选择自己安装的版本,
将Tomcat Server设为可用,并设置Tomcat的安装目录
7) 在Tomcat的JDK中选择刚刚配置的JDK
8) 配置完成了,三个地方可以启动它的服务,根据自己的喜好吧~~~ 呵呵~~~
Trackback: http://tb.donews.net/TrackBack.aspx?PostId=772830
posted @
2008-05-08 11:44 caihaibo 阅读(291) |
评论 (0) |
编辑 收藏
iis 占用端口 80 ?
posted @
2008-05-04 10:39 caihaibo 阅读(233) |
评论 (0) |
编辑 收藏
相信大家都遇见过:在删除一些软件的时候弹出某某文件正在运行或磁盘写保护不能删除这样的报错提示吧(如图1)。而常常删除不掉的都一些后缀为.dll的文件。到底这个dll文件是什么文件,如何才能知道是哪些程序在调用这个dll文件呢?
dll文件英文名称为Dynamic Linking Library,以下简称dll,中文名字"动态链接程序库"文件。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即dll文件,放置于系统中。当我们执行某一个程序时,相应的dll文件就会被调用。一个应用程序可有多个dll文件,一个dll文件也可能被几个应用程序所共用。比如,假设系统中有一dll具备了与远端系统进行网络联接的功能,我们假设其名称为Network.dll,如果有另外一个应用程序想使用该功能,则这个程序只需在执行时与Network.dll进行动态链接(Dynamic Linking),就可以运用Network.dll的网络联接功能来实现远端联接系统。简单地说,dll的特性是:
1、dll本身无法自行执行,必须靠其他程序调用。
2、dll文件都具有一定的功能。
3、在系统刚建立时 (如刚装好Windows时),系统中即存在有一定数量的dll,而某些应用程序亦会将自已所需的dll添至系统中,导致dll的数量随应用程序的增加而增加。
既然知道了dll文件的概念和特性,那么怎么才能解决删除难这个问题呢?虽然解决这个问题的方法有很多种,如用软件unlocker来删除。这里介绍的是手工删除方法dll文件的方法。
因为dll文件的特性注定了它可能被多个软件调用,这也是dll文件为什么删除不掉的原因——正在使用的文件是当然不可能给你删除的。那么到底是哪个程序在调用这个dll文件呢?如何才能删除这个dll文件呢?下面就手动删除dll文件的方法。
Step 1.在运行里输入cmd进入命令提示符。
step 2.然后输入命令tasklist /m>c:\listdll.txt回车后,在C盘下会出现一个listdll.txt文本文件,这个文件里如图2所示列出了目前运行的各个程序正在调用的dll文件。在用CTRL+F弹出查找框,输入自己要删除的的dll文件,查找出是哪个程序在调用这个dll文件。
step 3.CTRL+ALT+DEL打开Windows资源管理器,结束占用需要删除dll文件的程序或着进程,这时再去删除这个dll文件就很轻松了。
step 4.如果查出来的占用dll文件的进程是svhost.exe文件/进程,这个进程一般系统有7、8个至多,到底是哪个svhost.exe进程占用了这个dll文件呢?这是可以在命令提示符下输入tasklist /svc,当然,你也可以把它输出为文本文件tasklist /svc>C:\listsvc.txt。这时listsvc.txt文件里的svhost.exe会跟出如图3所示的各个进程的PID号。这时就可以具体的根据PID号来结束进程,达到删除dll文件的目的。
posted @
2008-05-04 09:37 caihaibo 阅读(1710) |
评论 (0) |
编辑 收藏
javaScript 中的 call() 是一个奇妙的方法,但也是一个让人迷惑的方法,先看一下官方的解释:
call 方法
请参阅
应用于:Function 对象
要求
版本 5.5
调用一个对象的一个方法,以另一个对象替换当前对象。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数
thisObj
可选项。将被用作当前对象的对象。
arg1, arg2, , argN
可选项。将被传递方法参数序列。
说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
-------------------------------------------------------------------------------------------
乍一看,很容易把人看迷胡,先做一些简单的说明
obj1.method1.call(obj2,argument1,argument2)
如上,call的作用就是把obj1的方法放到obj2上使用,后面的argument1..这些做为参数传入.
举一个具体的例子
function add(a,b)
{
alert(a+b);
}
function sub(a,b)
{
alert(a-b);
}
add.call(sub,3,1);
这个例子中的意思就是用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。
看一个稍微复杂一点的例子
function Class1()
{
this.name = "class1";
this.showNam = function()
{
alert(this.name);
}
}
function Class2()
{
this.name = "class2";
}
var c1 = new Class1();
var c2 = new Class2();
c1.showNam.call(c2);
注意,call 的意思是把 c1 的方法放到c2上执行,原来c2是没有showNam() 方法,现在是把c1 的showNam()方法放到 c2 上来执行,所以this.name 应该是 class2,执行的结果就是 :alert("class2");
怎么样,觉得有意思了吧,可以让a对象来执行b对象的方法,这是java程序员所不敢想的。还有更有趣的,可以用 call 来实现继承
function Class1()
{
this.showTxt = function(txt)
{
alert(txt);
}
}
function Class2()
{
Class1.call(this);
}
var c2 = new Class2();
c2.showTxt("cc");
这样 Class2 就继承Class1了,Class1.call(this) 的 意思就是使用 Class1 对象代替this对象,那么 Class2 中不就有Class1 的所有属性和方法了吗,c2 对象就能够直接调用Class1 的方法以及属性了,执行结果就是:alert(“cc”);
对的,就是这样,这就是 javaScript 如何来模拟面向对象中的继承的,还可以实现多重继承。
function Class10()
{
this.showSub = function(a,b)
{
alert(a-b);
}
}
function Class11()
{
this.showAdd = function(a,b)
{
alert(a+b);
}
}
function Class2()
{
Class10.call(this);
Class11.call(this);
}
很简单,使用两个 call 就实现多重继承了
当然,js的继承还有其他方法,例如使用原型链,这个不属于本文的范畴,只是在此说明call 的用法
说了call ,当然还有 apply,这两个方法基本上是一个意思
区别在于 call 的第二个参数可以是任意类型,而apply的第二个参数必须是数组,也可以是arguments
还有 callee,caller,这个和call的 用法就不同了,放到下次讲吧 ,呵呵。
posted @
2008-05-03 16:56 caihaibo 阅读(180) |
评论 (0) |
编辑 收藏
潘石屹的“草根哲学”
——读他的新著《我用一生去寻找:潘石屹的人生哲学》
在生活中,你遇到一个有平民气质的平民不难,遇到一个有贵族气质的贵族也不难,难的是能遇到有贵族气质的平民,和有平民气质的贵族。换句话说,见草是草,见树是树,这不稀奇,但你能见到一根有大树气质的小草,和有小草气质的大树么?这儿就有一个,他叫潘石屹,中国SOHO是他的外形,大树树冠的外形;这本书是他的气质,小草草根的气质。
翻翻这本书,你能闻到一缕缕青草的香气,看到一片片柔软的葱绿,听到一阵阵轻微的窸窣,那不是绸缎和耳鬓斯磨的声音,而是微风吹过草叶的声音。这本书里的每行字,都像是一片片草叶;每片草叶,又都像作者絮语时轻轻卷动的舌头。不同的是,草的话是说给风听的,潘石屹的话是说给我们听的:
“当别人告诉这位智者我整天在网上写博客,我的博客有许多人看时,他提醒我,要有仁慈的舌头,千万不要在人心中播下不和的种子。”
我想,草叶的舌头应该是仁慈的,就像美国大诗人惠特曼的舌头一样。但潘石屹写的并不是《草叶集》,而是沿着草叶深入到根部,写了一本通俗版的人生哲学,我很想将之称为“草根哲学”。这个哲学平易得就像你每天早餐喝的那杯牛奶。
——要有根。这似乎是潘氏“草根哲学”的第一章。什么是人生的“根”? 潘石屹告诉我们,人生的根就是“爱”与“自信”。恨也是一种根,“仇恨入心要发芽”,那还不生根?但从恨的根上会开出恶之花,“以恶对恶,增值的还是恶”,被恶霸占的人生,就像是被毒蛇缠身的兔子,能有什么指望?所以潘石屹说:“我永远相信爱的力量,而相信就是力量。”而有爱的人就有自信,自信的人才会诚实,诚实的人才能成功。所以,在潘石屹看来,爱是人生的第一只桶,自信是人生的第一桶金:
“经常有人问我第一桶金怎么来的,从哪里得到的,有多少。其实每次别人问我这个问题时,我都想说,人的第一桶金是自信。即使你没钱也不要怕,自信就是你的资本。”
我可以为他这段话背书,他当年被海南万通派到北京开发新项目,只带了几万块钱,但肯定在行李箱里放了很多自信进京。如果我没有记错,他最早住的是南兵马司招待所,那地方我也住过,干净,但很简陋。几年后,阜成门的万通广场落成,它当时是万通系最大也是唯一一家发行法人股的地产项目。
——要平凡。平凡,低调,简单……这些词都可以用来定性被你看到,或被你踩在脚底下的小草。不过,当你走进一片丰美的草地时,你就忍不住想躺下来,读几页书,或者无所事事地晒晒太阳,这是说,平凡的东西让人亲近。潘石屹所推崇的平凡,包括必要的“迟钝”,甚至“缓慢”,特别是“简单”:
“从历史的角度来看,一个民族向上的时候,它总是简单和大气为重要的风格;凡是这个民族衰败之时,从建筑、家居、服装、装饰到语言表现出来的都是繁杂和多余。能把简单作为自己的世界观,成为自己做事情的指导思想,是走向成功的一个要素。你会在简单中获得成功。”
潘石屹特别看重谈话和人际交往中的“平凡”。最平凡最受人欢迎的交谈者是“倾听者”:“大多数情况下,当一个好的听众,欣赏别人的表现,就是建立人际关系的第一个好办法。”最糟糕的想法,就是“今天要用语言征服那个人。”结果是针锋相对,面红耳赤。“你看有些人,瞪着眼睛看你说话,你以为他听进去了,他没有,他在找你说话的间歇来插言,来抢话。他是一个全神贯注寻找发言机会的人,就像一个蹲在路边虎视眈眈准备拦路抢劫的强盗一样。”读到这儿,对照一下我自己,只能叹口气,看来,世界上最不平凡的事,就是甘于平凡呵。
——要合群。在潘石屹看来,生命是一个共同体,就像草一样,一根草活不了,草连成片,才成气候。但他这样说,并不是要搞生命共产主义,他不反对“个性”,也不反对“自我”,他反对的是过分的“自我”。他把“自我”比作盐,没有它,没有人生的美味,多了,就破坏了美味。既要自我,又要群体,怎么办?磋商。自我通过磋商达成与别的自我的合作,所以他认为,“人人参与的磋商才具有普世价值”。杜甫有诗云:“繁枝容易纷纷落,嫩蕊商量细细开”。独树一帜的繁枝容易凋落,细细磋商的小草和嫩蕊慢慢茂盛。
——要无为。世界最无为的生命大概就是草了。它不追求什么,也不拒绝什么,不逃避什么,也不挽留什么。起伏随风吹,荣枯顺岁时。作为企业领导人,潘石屹认为,公司做得越大,越要无为而治理。无为而治,其实是顺势而为,“我们好像水上的小舟,依托流水的力量前行。我们要尊重它,感应到它,顺应它。如果你以为你有一点权力,可以无所顾忌,搞乱生活,是一定会受到惩罚的。”禹作敏、牟其中等人如果能早一点悟出这个道理,下场肯定要好得多。
关于潘石屹这本书,当然还有许多话可说,比如要顽强,要敬畏之类,不过,如果一定要我对它提出一点批评意见,我最想说的是,潘石屹的哲学是一个有明确人生目标的人的哲学,不是一个活在当下的人的哲学,后一种人欣赏的不是地上的小草,而是空中的微风和天上的白云。
2008年4月17日
——原载2008-4-28《经济观察报》第48版“商业评论”(提前出版)
posted @
2008-04-29 17:36 caihaibo 阅读(108) |
评论 (0) |
编辑 收藏
MyEclipse+struts+Hibernate配置开发
2005-12-18 10:31 作者: CoderGuo 出处: sina博客 责任编辑:方舟
说明:
这个手册只是为初学者制作的环境配置和快速开发的一些基本方法,为的是广大爱好者能快速上手,少走我走过的弯路,里面没有任何关于
java模式和其他相关的说明。本人水平有限,也没有能力去讨论关于模式设计和开发细节的一些内容。
建议:
如果你还不清楚struts和hibernate的一些基本原理,希望能先去了解一下这方面的相关内容。
推荐:
Hibernate中文手册》作者认为要学Hibernate看这个就足够了,里面几乎包括了所有的细节,不过可能不太适合快速入门。
地址:http://www.hibernate.org/hib_docs/v3/reference/zh- cn/html_single/
关于struts的资料就很多了,这里推荐一个可以下载一些入门教程的网站。
地址:http://www.wnetw.com/jclub/index.jsp
强烈建议入门的朋友先了解一下基本的原理!否则本文可能对你没有任何帮助。
相关工具下载:(注意版本)
mysql5.0 http://www.mysql.org
eclipse 3.1.1 http://www.eclipse.org
myeclipse4.0.3 http://www.myeclipseide.com
tomcat5.5
安装:
关于tomcat和mysql的安装就不多说了,需要注意的是最好保证你的 jdk是1.5的版本,并配置好你的环境变量,不然可能会遇到一些问题。
把eclipse解开,再去安装刚下载的myeclipse,在安装的时候需要把路径指定到刚才解开的eclipse上,由于myeclipse是个收费软件,所以需要注册。不过一般按照Chinese的习惯,去google一个注册码就可以了:}
开发环境部署:
好了,现在保证你的mysql和tomcat服务能够正常启动,myeclipse能够正常打开(如果不能,可以去找一下相关的说明或者给作者留言)。下面我们就要开始真正的开始部署一个传说中的tomcat+struts+hibernate+mysql结构的工程了!(faint!前言就写的我好累)
首先,在myeclipse里新建一个工程。在左边的Package Exporler面版里点右键选择new->project…
在跳出菜单里选择MyEclipse->J2EE Projects->Web Project。
点击next后进入如下画面:
工程名为:test
结束后点击Finish。
好了,如果成功的话你就会在 Package Exporler里看到一个新的test工程!现在我们先配置一下数据库方面的东西。首先在你的mysql 里建立一个数据库webases,再在里面新建一个表admin,里面三个字段分别为id,name,password其中id为自动取值的主键(mysql具体的操作可以自己找资料,不是本文涉及范围)。
再回到myeclipse ,选中window->Open Perspective->Other…
可以看到现在跳出一个名为Select Perspective的菜单,在里面选中MyEclipse Databases Exporler,可以看到现在到了下面的页面。
按以上图示输入相关字段后点击Finish便建立了一个数据库连接,在新出现的JDBC for Mysql上点右键,选择Open connection…,确认用户名和密码正确后点OK,如果一切顺利的话你会看到下面的画面:
这说明你已经和数据库建立了正确的连接。现在我们再回到window->Open Perspective- >Other…里的MyEclipse,也就是我们刚进来的时候看到的画面。
右键点击你刚建立的工程 test并选择MyEclipse->Add struts Capabilities…在跳出的菜单里按照如下输入并确定:
好了,现在你已经为你的工程增加了struts,接下来和上面一样在右键工程后选择MyEclipse- >Add Hibernate Capabilities…一路确定下来为你的工程添加Hibernate。(为方便起见我们在选择路径时把HibernateSessionFactory.java放在了src/com下面,其实最好建立个单独的目录如 src/com/hibernate)
为了更好的演示我们不建立通常的登陆页面而是建立个注册页面。选择 src目录下的hibernate.cfg.xml文件。照如下填写并保存。这样hibernate就为你建立了数据库的连接池。
下面我们再选择WebRoot/WEB-INF/struts-config.xml文件,在画面中点击右键选择new- >Form, Action and JSP。如下填写
再选择JSP选项,如下
最后选择Finish。
再新建一个一个success.jsp的页面,
在刚才struts- config.xml文件里右键选择addAdmin选择Properties,在菜单里选择Forwords,再点add,如下图填写
最后你的struts-config.xml就是下面这个样子:
下面我们转到hibernate。换到刚才我们建立数据库的页面,选择你的admin的表点右键选择Create Hibernate Mapping。选择好打包路径后选择Finish。如图:
在你刚才选择的路径下(我为方便是src/com/yourcompanyname/)下新建立的文件 AdminDAOFactory.java文件并输入以下内容:
package com.yourcompanyname;
import java.util.Iterator;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.hibernate.SessionFactory;
public class AdminDAOFactory {
Session session;
Transaction tx;
public void add(Admin admin) throws HibernateException {
/**
* Creation Date: 11-17-2005
* TODO Add a new admin user.
* @param An object of Admin
* @return void
* @author Coder Guo
*/
try {
session = SessionFactory.currentSession();
tx = session.beginTransaction();
//Add a new admin
session.save(admin);
tx.commit ();
}catch(HibernateException e){
throw e;
}finally{
if (tx!=null) {
tx.rollback();
}
SessionFactory.closeSession();
}
}
}
再打开com.yourcompany.struts.action下的AddAdminAction.java添加(其中如果有错误选中好按ctrl+shift+o自动添加包)
public class AddAdminAction extends Action {
// --------------------------------------------------------- Instance Variables
// --------------------------------------------------------- Methods
/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
* @author Coder Guo
*/
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
AddAdminForm addAdminForm = (AddAdminForm) form;
// TODO Add a new admin
Admin admin = new Admin();
admin.setName(addAdminForm.getName ());
admin.setPassword(addAdminForm.getPassword ());
AdminDAOFactory adminDAO = new AdminDAOFactory ();
adminDAO.add(admin);
return mapping.findForward("success");
}
}
再打开com.yourcompanyname.struts.form下的AddAdminForm.java,修改(如果有错误按照上面说的方法导入包)
public ActionErrors validate(
ActionMapping mapping,
HttpServletRequest request) {
// TODO Auto-generated method stub
ActionErrors errors = new ActionErrors();
Session session = SessionFactory.currentSession();
Transaction tx = session.beginTransaction ();
Query query = session.createQuery("select admin from Admin as admin where admin.name = '" + this.name + "'");
Iterator it = query.iterate ();
if (it.hasNext()){
errors.add ("addAdmin.err.name",new ActionMessage("form.addAdmin.err.name"));
}
tx.commit();
SessionFactory.closeSession ();
return errors;
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
this.name=null;
this.password=null;
}
再打开com\yourcompanyname\struts下的ApplicationResource.properties在这里面添加错误信息:
Form.addAdmin.err.name=err
最后,(汗,好累啊-_-!)打开addAdmin.jsp修改成如下:
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page language="java"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<script language = "javascript">
<!--
function check(){
if (loginForm.userName.value == "" || loginForm.password.value == ""){
alert("请输入完整的信息!");
loginForm.userName.focus();
return false;
}
}
//-->
</script>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html:html>
<head>
<html:base />
<title>login.jsp</title>
<link href="css/webcss.css" rel="stylesheet" type="text/css">
<meta http-equiv="pragma" content="no- cache">
<meta http-equiv="cache-control" content="no- cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http- equiv="description" content="This is my page">
</head>
<body>
<center>
<p> </p>
<p> </p>
<table width="300" border="0" cellpadding="0" cellspacing="0">
<html:form action="/addAdmin" focus="name" method="GET">
<tr align="center" valign="middle">
<td colspan="2" class="typt_normal">新增管理员</td>
</tr>
<tr>
<td width="100" align="center" valign="middle" class="typt_normal">名称: </td>
<td width="200" align="left"><html:text property="name" styleClass="text_s"/><html:errors property="addAdmin.err.name"/></td>
</tr>
<tr>
<td width="100" align="center" valign="middle" class="typt_normal">密码: </td>
<td width="200" align="left"><html:password property="password" styleClass="text_s"/></td>
</tr>
<tr>
<td colspan="2" align="center" valign="middle"><html:submit value="提交" onclick="return check ();"/><html:reset value="重置"></html:reset></td>
</tr>
</html:form>
</table>
</center>
</body>
</html:html>
其中可以看到如何在struts的标签中使用javascript的方法。
配置好myeclipse于tomcat的连接。在window->Preferences做如下设定:
在项目文件点右键->“myeclipse”->“Add and remove project deployment”,如下图:
好了,我们的配置工作基本结束了,在myeclipse上开启tomcat服务
现在打开浏览器,输入
http://127.0.0.1:8080/test/addAdmin.jsp就可以看到你的jsp页面了!
posted @
2008-04-28 23:17 caihaibo 阅读(169) |
评论 (0) |
编辑 收藏