关于作者

用户名:wn_319
笔名:wn_319
地区:

日历  

快速登录

+ 用户名:
+ 密 码:

我的博采 我的论坛 我的RSS

在线留言



访问统计:
文章个数:8
评论个数:13
留言条数:0



Powered by BlogDriver 2.1

washroom

 

文章

java 动态加载类的一些规则
java 动态加载类的一些规则........

java 动态加载类的一些规则

在java程序中加载类有两种方式:

1 自动加载,由jvm完成,对程序员是透明的
2 手动加载,由程序员代码完成。

两种加载方式的特点

1 自动加载:方便,
  也就是说程序员只要在类中引用了其他包中的类型,在运行时当第一次用到这个类的时候jvm会自动加载这个类
 
2 手动加载:灵活,
  对大系统的程序部署,版本控制都有好处,在这里就不多说了。
 
手动加载类的问题:

1 可能会有版本问题,
如果一个类的类加载器在运行时刻加载了同一类的不同版本,那么在调用这个类的时候究竟应该调用哪个版本呢。

2 类只识别类自己的加载器加载的其他类。


类手动加载的原则:

1 类加载器不应该加载同一个类两次。

2 类加载器在加载类的时候要先委托父的加载器加载。

3 类的加载器加载类的时候被加载的类所引用的基础类是用jvm自动加载的,这样保证了版本不会冲突。

- 作者: wn_319 2004年12月31日, 星期五 18:36  回复(0) |  引用(0) 加入博采

javawebstudio 介绍
JavaWebStudio 2005 新增功能

JavaWebStudio是目前最方便快捷的Struts、JSP、Hibernate开发平台,是功能强大的Java Web集成开发环境(IDE)。
JavaWebStudio 2005新增功能如下:
1、改进功能
(1)环境变量设置
(2)中文编辑双字节处理
(3)键盘快捷键处理
(4)文件管理器
(5)类管理器
(6)Html控件(标签)拖动功能
(7)启动画面的随机图像显示和主画面的可定制显示
(8)java文件编辑自动提示的快速搜索
(9)可快速跳转到任何已知类源文件
(10)增强系统的稳定性
(11)可对各种网站内容特别是不能进行"另存为"和"查看源文件"操作的网站进行编辑

2、新增功能
(1)Struts JSP页的可视化图层设计
(2)可视化样式设计
(3)交互式按钮设计
(4)Bean工厂、Bean_DAO工厂
(5)Bean变量及Action配置动态监视功能
(6)批量Bean变量添加
(7)Hibernate文件向导功能
(8)新增了Struts_menus模板、Struts1.2.4模板、JSF模板、Hibernate模板
(9)JDK采用了J2SE 5.0(即1.5)版本,服务器采用了jakarta-tomcat-5.5
(10)支持J2ME开发,在采用WTK2.2版本,提供15个J2ME模板
(11)调试功能
(12)JavaWebStudio开源项目:Struts_db

3、保持JavaWebStudio原版本中的便快捷的Struts、JSP开发功能:
    JavaWebStudio系列开发工具包括Visaul Struts、Visaul JSF、Visaul Tapestry 、Visaul jython及Visaul C51(C51是附加版本,与Java Web无关,主要用于可视化单片机C51的开发)等多个版本。
其中Visaul Struts版本是专业的Struts可视化开发集成环境,是目前最方便快捷的Struts开发平台。
主要特点如下:
用JavaWebStudio开发Struts非常容易,运行速度也快(是用VC.NET写的),有点像VB.NET。在组件栏中除html、JSP外,还有Struts标签组件,例如插入一个<html:text>标签组件,在编辑页中看到的就是一个输入文本框,即可视化设计,对输入文本框点鼠标右键选择"属性",可直接添加变量;对组件双击鼠标左键自动跳转到相应的Java文件中。利用文件向导,选择数据源后数据库应用所有代码都自动生成,并生成具有分页、记录添加、编辑、更新、删除的页和所有源代码,像ASP.NET吧?编辑java代码时,有打"."自动提示的功能,包括自定义的变量、项目中自定义的类、JDK类、Struts类等,像VC.NET中的有打"."自动提示。
(1)可视化Struts标签的web设计界面,这是JCreator、eclipse、JB没有的功能。在JavaWebStudio中设计Struts的JSP页面,就像在Microsoft FrontPage中设计普通网页一样所见即所得,一样方便。
    与Dreamweaver MX类似,主窗口中上半部分是JSP源代码编辑窗口,下半部分是可视化编辑窗口。
JavaWebStudio开发工具支持Struts标签的可视化设计,在JavaWebStudio的WEB可视化编辑界面里,<html:text property="name"/>是一个输入文本框,点击鼠标右键选择"添加变量",自动添加标签的property名称,同时自动在ActionForm中自动添加相应的变量和函数,非常方便。在JavaWebStudio的WEB可视化编辑界面里,对着按钮双击自动跳转到Action中,对着输入框双击自动跳转到ActionForm中,类似VB、DELPH的事件编程。

(2)Struts类、项目自定义类及Java类所有类对象都带"打.提示",只要选择就可输入函数,对不熟悉StrutsAPI的人来说是最好不过的了。

(3)Struts完全中文显示解决方案:
  (a)JSP页面中文显示问题:
    新建JSP文件时,自己加入如下代码:
<%@ page contentType="text/html;charset=GB2312" %>
这样JSP页面上的中文就可以正常显示了。
   (b)中文资源显示问题:
  在JavaWebStudio中,默认的中文资源文件名是"ApplicationResources_ch.properties",用户先将中文资源定入文件"ApplicationResources.properties"
然后选择工具条的"资源文件编码转换"键或选择"运行"菜单上的"资源文件编码转换"项,即可实现编码转换功能。
  (c)表单和数据库中文显示问题:
  在JavaWebStudio中建立Struts项目时,自动加入了编码转换设置过滤器。
  可见在JavaWebStudio中,不需编程人员编写任何代码,仅仅点击一个资源文件编码转换键即可完全解决Struts中文显示问题。

(4)Struts 数据库应用向导功能:
   通过"Struts数据库应用文件向导"可完全自动实现数据库应用。
在向导中,只需输入文件名,通过手动加入数据库字段名或通过选择数据源自动添加数据库字段名,即可自动产生实体Bean,操作ADO(包括插入、删除、更新、查找功能)、输入JSP、JSP对应的ACtionForm、JSP对应的Action(例如打查找结果放入Bean中)、JSP输出(根据数据库自动产生输出表格)、自动配置XML文件等;
在JavaWebStudio中,通过"Struts数据库应用文件向导"可完全自动实现数据库应用。在向导中,只需输入文件名,通过手动加入数据库字段名或通过选择数据源自动添加数据库字段名,即可自动产生实体Bean,操作ADO(包括插入、删除、更新、查找功能)、输入JSP、JSP对应的ACtionForm、JSP对应的Action(例如打查找结果放入Bean中)、JSP输出(根据数据库自动产生输出表格)、自动配置XML文件等。
由于产生了操作ADO(包括插入、删除、更新、查找功能),只需编写很少的代码,即可实现完整的数据插入、删除、更新功能。另外,还有自动分页的功能。
数据库连接池只需通过配置即可使用。

- 作者: wn_319 2004年12月27日, 星期一 18:03  回复(0) |  引用(0) 加入博采

Java中ThreadLocal的设计与使用
Java中ThreadLocal的设计与使用
早在Java 1.2推出之时,Java平台中就引入了一个新的支持:java.lang.ThreadLocal,给我们在编写多线程程序时提供了一种新的选择。使用这个工具类可以很简洁地编写出优美的多线程程序,虽然ThreadLocal非常有用,但是似乎现在了解它、使用它的朋友还不多。

   ThreadLocal是什么

   ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。线程局部变量并不是Java的新发明,在其它的一些语言编译器实现(如IBM XL FORTRAN)中,它在语言的层次提供了直接的支持。因为Java中没有提供在语言层次的直接支持,而是提供了一个ThreadLocal的类来提供支持,所以,在Java中编写线程局部变量的代码相对比较笨拙,这也许是线程局部变量没有在Java中得到很好的普及的一个原因吧。

   ThreadLocal的设计

   首先看看ThreadLocal的接口:

    Object get() ; // 返回当前线程的线程局部变量副本 protected Object initialValue(); // 返回该线程局部变量的当前线程的初始值
    void set(Object value); // 设置当前线程的线程局部变量副本的值

   ThreadLocal有3个方法,其中值得注意的是initialValue(),该方法是一个protected的方法,显然是为了子类重写而特意实现的。该方法返回当前线程在该线程局部变量的初始值,这个方法是一个延迟调用方法,在一个线程第1次调用get()或者set(Object)时才执行,并且仅执行1次。ThreadLocal中的确实实现直接返回一个null:

protected Object initialValue() { return null; }

  ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。比如下面的示例实现:

public class ThreadLocal
{
  private Map values = Collections.synchronizedMap(new HashMap());
  public Object get()
  {
   Thread curThread = Thread.currentThread();
   Object o = values.get(curThread);
   if (o == null && !values.containsKey(curThread))
   {
    o = initialValue();
    values.put(curThread, o);
   }
   return o;
  }

  public void set(Object newValue)
  {
   values.put(Thread.currentThread(), newValue);
  }

  public Object initialValue()
  {
   return null;
  }
}

  当然,这并不是一个工业强度的实现,但JDK中的ThreadLocal的实现总体思路也类似于此。

   ThreadLocal的使用

   如果希望线程局部变量初始化其它值,那么需要自己实现ThreadLocal的子类并重写该方法,通常使用一个内部匿名类对ThreadLocal进行子类化,比如下面的例子,SerialNum类为每一个类分配一个序号:

public class SerialNum
{
  // The next serial number to be assigned

  private static int nextSerialNum = 0;
  private static ThreadLocal serialNum = new ThreadLocal()
  {
   protected synchronized Object initialValue()
   {
    return new Integer(nextSerialNum++);
   }
  };

  public static int get()
  {
   return ((Integer) (serialNum.get())).intValue();
  }
}

  SerialNum类的使用将非常地简单,因为get()方法是static的,所以在需要获取当前线程的序号时,简单地调用:

int serial = SerialNum.get();

  即可。

   在线程是活动的并且ThreadLocal对象是可访问的时,该线程就持有一个到该线程局部变量副本的隐含引用,当该线程运行结束后,该线程拥有的所以线程局部变量的副本都将失效,并等待垃圾收集器收集。

   ThreadLocal与其它同步机制的比较

   ThreadLocal和其它同步机制相比有什么优势呢?ThreadLocal和其它所有的同步机制都是为了解决多线程中的对同一变量的访问冲突,在普通的同步机制中,是通过对象加锁来实现多个线程对同一变量的安全访问的。这时该变量是多个线程共享的,使用这种同步机制需要很细致地分析在什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放该对象的锁等等很多。所有这些都是因为多个线程共享了资源造成的。ThreadLocal就从另一个角度来解决多线程的并发访问,ThreadLocal会为每一个线程维护一个和该线程绑定的变量的副本,从而隔离了多个线程的数据,每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的整个变量封装进ThreadLocal,或者把该对象的特定于线程的状态封装进ThreadLocal。

   由于ThreadLocal中可以持有任何类型的对象,所以使用ThreadLocal get当前线程的值是需要进行强制类型转换。但随着新的Java版本(1.5)将模版的引入,新的支持模版参数的ThreadLocal<T>类将从中受益。也可以减少强制类型转换,并将一些错误检查提前到了编译期,将一定程度地简化ThreadLocal的使用。

   总结

   当然ThreadLocal并不能替代同步机制,两者面向的问题领域不同。同步机制是为了同步多个线程对相同资源的并发访问,是为了多个线程之间进行通信的有效方式;而ThreadLocal是隔离多个线程的数据共享,从根本上就不在多个线程之间共享资源(变量),这样当然不需要对多个线程进行同步了。所以,如果你需要进行多个线程之间进行通信,则使用同步机制;如果需要隔离多个线程之间的共享冲突,可以使用ThreadLocal,这将极大地简化你的程序,使程序更加易读、简洁。

- 作者: wn_319 2004年12月17日, 星期五 11:55  回复(1) |  引用(0) 加入博采

事务处理DAO实现- -

转刘松先生的大作。。。。。。。。。


事务处理DAO实现
我们假定以MVC架构。
M分了两层:Service和PO.
C分了三层:Dispatcher Controller(中央分发器),Logic Controller(具体业务控制器)
V暂时不考虑。
下面是流程图:
http request ---------> Dispatcher Controller ----------------> http response(View)
                             |
        |
        |
        |
    [Logic Controller]*
        |
        |
        |
        |
   [Service]*
        |
        |
        |
        |
      [PO]*
     
Dispatcher Controller 1)分析请求哪个行为,(封装请求对象--FormBean~),调用不同的Logic Controller。
 2)中央异常处理、安全权限、访问路径跟踪等处理。
Logic Controller 1)调用Service的方法,存储或检索PO对象;
 2)决定进入哪个View,并将数据feed给View。由View进行页面生成。
PO: 数据库表的对应实体类
业务中的数据改写的事务解决方案是:
每一个http请求只有一个事务,没有嵌套事务。
实现:
    用FilterServlet设置ThreadLocal作为事务的工厂,采用延迟生成的方式处理事务,在第一次需要事务时begin,在线程结束时commit,在异常出现时rollback。Service的DAO方法被传入Connection/Transaction,但从不要关闭,因为此行为是在创建它们的地方(FilterServlet)中完成的。
问题:
    事务模型虽然很典型,但对于不对应http request的事务处理,用线程行为来处理会不当,例如一个启动web时就启动的Servlet线程,用于定时执行数据库操作。
   
在Service的方法中Transaction是传入的,从不要在其中begin,commit或rollback,如果想rollback,可throw Exception通知创建transaction的caller这样做。同样,begin/commit也是在那里规划的。这里,创建transaction的地方就是Logic Controller.
保证这种编码约定,其一是不传transaction给service的方法,而是一个ConnectionFactory.使其不能获得transaction对象,也不能调用commit等。
其二是用delegate/interface机制(closure style),大量采用匿名类。

- 作者: wn_319 2004年12月17日, 星期五 11:38  回复(1) |  引用(0) 加入博采

如何绩效考核一个程序员
这是12月4日李维讲座的主题,觉得对最近的软件发展的根本有一个概括性理解,
hao(办公室里太热!) 说:
这是12月4日李维讲座的主题,觉得对最近的软件发展的根本有一个概括性理解,同时这是一个影响每一个IT从业人员的大事,特整理一下他讲座的主题:
 
首先看几个场景:
 
场景一:
你们公司是如何绩效考核一个程序员的:
1、他写过多少项目;
2、他写过代码行数;
3、他写过项目产生Bug数;
4、由高级程序员主观对他的代码进行质量评价;
 
以上数据都不能很量化的评价一个程序员。如果看过《水煮三国》的,还会记得"猎人的狗力资源管理"那一节,这样的机制会出问题的。
 
场景二:
如果测试人员发现bug,谁会被拎出来罚站?
1、程序员
2、架构设计师
3、项目经理;
4、总经理
 
注意:某些bug,是因为架构、技术的问题而造成的,不能把所有责任都推给程序员。
 
场景三:
为何我们估算的软件成本、软件开发工期经常不准?
1、我们采用的技术是一个新技术,执行中可能会碰到很多技术难题;
2、我们很难对一个程序员
hao(办公室里太热!) 说:
我们可以带着上面的几个场景来看下面的分析:
 
最近这几年,不知你有没有留意到,一些对代码质量进行量化的工具,出来了不少。
比如:
 
Borland的Together中的Code metrics/Audits可以对代码进行评估和管理,
CMMI是对软件开发做管理,
JAVA 的JMX/ BCI也是对代码做管理,
VS.net TS 中也有对代码进行静态分析和东西分析的工具。
那么SA/SD/OOA/OOD又由什么管理呢?当分析人员画了分析图Class Diagram时有什么方法可以确定他们画出来的架构是正确的?
IT的管理人員常常以程序员写的程序或是代码数量来衡量程序员的绩效,
可是当新的软件技术,如Generic Programmuing出现时又如何管理/评估程序员的绩效呢?
 
其实,这些问题的背后都是管理和数字。
 
以上质量量化分析工具的出现对软件开发来说,会带来哪些变革呢?
 
变革就是
hao(办公室里太热!) 说:
变革就是,可预计的未来几年,以后程序员的绩效、架构师的绩效,将会变得可计量。人为因素对绩效工资的影响可以变得越来越小。
也许你在某个单位,并没有采用上面代码质量对应绩效工资。但是这会是一个趋势,我们必须从现在开始就准备应对这个变革。
 
以上是对人来说,对整个软件行业来说,由于软件质量分析工具的引入,软件质量这个黑盒子将变得透明,对软件开发工期,成本等信息的计算将变得更加非主观化,IT 行业将可以更加方便的进行管理,管理的功能将更加深入的进入主流应用。
 
IT人员必须知道明年开始IT人员可能会进入一个managed的阶段。这就是Java JMX/BCI、Borland SDO、SOA逐渐出现的原因,IT即将从unmanaged business進入managed business,管理的功能将正式进入主流应用。这太重要了。管理已经深入各种IT领域,如programming, framewor
弓虽-如果只做一件事,还不明白为什么,实在是不高明说:
架构设计师的责任
 
弓虽-如果只做一件事,还不明白为什么,实在是不高明说:
可是我们既是程序员也是狗屎架构设计师
hao(办公室里太热!) 说:
这种软件要出来,老板就真能挣死咱们了
科(S)  (NO ideas for life) 说:
没有啊,只有强哥是狗屎架构设计师
idpeppy(进仔) 说:
这是一项目为核心的公司使用的东西
idpeppy(进仔) 说:
我们还不是这样
弓虽-如果只做一件事,还不明白为什么,实在是不高明说:
我们是产品为核心
弓虽-如果只做一件事,还不明白为什么,实在是不高明说:
无数个产品,无数个核心
idpeppy(进仔) 说:
应该是以产品运营为核心
 
 科(S)  (NO ideas for life) 已离开对话。
 
弓虽-如果只做一件事,还不明白为什么,实在是不高明说:
哪SP就不要搞什么开发了,一门心思作运营,让CP提供完善产品不就可以了吗
弓虽-如果只做一件事,还不明白为什么,实在是不高明说:
哪儿像现在,乱七八糟
hao(办公室里太热!) 说:
有利于外包公司
idpeppy(进仔) 说:
哈哈,这种东西还不是核心竞争力,老伴不会现在就关心这个的
hao(办公室里太热!) 说:
咱们这样的公司不适合
hao(办公室里太热!) 说:
咱们这种公司都是极限开发
hao(办公室里太热!) 说:
哪用的着这个
 

- 作者: wn_319 2004年12月7日, 星期二 14:14  回复(1) |  引用(0) 加入博采

成为编程高手的条件
成为编程高手的条件,我认为韧性和毅力最重要
1、扎实的基础

  数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握它们,很难写出高水平的程序。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP,即使你再精通OOP,遇到一些基本算法的时候可能也会束手无策。因此多读一些计算机基础理论方面的书籍是非常有必要的。

 

  2、丰富的想像力

  不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想像力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等。开阔的思维对程序员来说很重要。

  3、最简单的是最好的

  这也许是所有科学都遵循的一条准则,复杂的质能转换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式:E=mc2。简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。

  4、不钻牛角尖

  当你遇到障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当我遇到难题的时候会去玩游戏,当负责游戏的那部分大脑细胞极度亢奋的时候,负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。
 5、对答案的渴求

  人类自然科学的发展史就是一个渴求得到答案的过程,即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念,一定要找到问题的答案,你才会付出精力去探索,即使最后没有得到答案,在过程中你也会学到很多东西。

  6、多与别人交流

  三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。多上上网,看看别人对同一问题的看法,会给你很大的启发。


  7、良好的编程风格

  注意养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致。大家都知道如何排除代码中错误,却往往忽视了对注释的排错。注释是程序的一个重要组成部分,它可以使你的代码更容易理解,而如果代码已经清楚地表达了你的思想,就不必再加注释了,如果注释和代码不一致,那就更加糟糕。

  8、韧性和毅力

  这也许是"高手"和一般程序员最大的区别。高手们并不是天才,他们是在无数个日日夜夜中磨炼出来的。成功能给我们带来无比的喜悦,但过程却是无比的枯燥乏味。你不妨做个测试,找个10000以内的素数表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这一条。

- 作者: wn_319 2004年12月7日, 星期二 09:56  回复(6) |  引用(0) 加入博采

java 网络编程基本概念
java 网络编程基本概念

/**
   * 一个IP地址并不足以完整标识一个服务器。这是由于在一台物理性的机器中,往往运行着多个服务器(程序)。
   * 由IP表达的每台机器也包含了"端口"(Port)。我们设置一个客户机或者服务器的时候,
   * 必须选择一个无论客户机还是服务器都认可连接的端口。就象我们去拜会某人时,IP地址是他居住的房子,
   * 而端口是他在的那个房间。
   *
   * 注意端口并不是机器上一个物理上存在的场所,而是一种软件抽象(主要是为了表述的方便)。
   * 端口编号在这里扮演了重要的角色,它是必需的一种二级定址措施。也就是说,我们请求一个特定的端口,
   * 便相当于请求与那个端口编号关联的服务。
   *
   * 系统服务保留了使用端口1到端口1024的权力,所以不应让自己设计的服务占用这些以及其他任何已知正在使用的端口。
   *
   * "套接字"或者"插座"(Socket)也是一种软件形式的抽象,用于表达两台机器间一个连接的"终端"。
   *  针对一个特定的连接,每台机器上都有一个"套接字",可以想象它们之间有一条虚拟的"线缆"。
   *  线缆的每一端都插入一个"套接字"或者"插座"里。
   */

  /**
   * 根据pcname得到ip
   * @param PCName 计算机名字
   */
  public void GetIPByPCName(String PCName){
    try{
      InetAddress a = InetAddress.getByName(PCName);
      System.out.println(a);
      // 得到本机地址
      InetAddress b = InetAddress.getByName(null);
      System.out.println(b);
      b = InetAddress.getLocalHost();
      System.out.println(b);
      // 得到sohu所有的ip
      InetAddress[] bs =  InetAddress.getAllByName("www.sohu.com");
      for( int i = 0 ; i < bs.length ; i ++ )
         System.out.println(bs[i]);
    }catch(Exception e){ }
  }

- 作者: wn_319 2004年12月6日, 星期一 22:01  回复(1) |  引用(0) 加入博采

试验发第一篇文章
试验发第一篇文章,哈哈哈哈!

哈哈哈哈

- 作者: wn_319 2004年12月6日, 星期一 10:48  回复(3) |  引用(0) 加入博采