@OverWrite BlogJava

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  128 随笔 :: 0 文章 :: 29 评论 :: 0 Trackbacks

#

     摘要:   默认的序列化机制并不难操纵。然而,假若有特殊要求又该怎么办呢?我们可能有特殊的安全问题,不希望对象的某一部分序列化;或者某一个子对象完全不必序列化,因为对象恢复以后,那一部分需要重新创建。 此时,通过实现Externalizable接口,用它代替Serializable接口,便可控制序列化的具体过程。这个Externalizable接口扩展了Serializable,并增添了两个...  阅读全文
posted @ 2008-05-28 12:00 vesung 阅读(664) | 评论 (0)编辑 收藏

JNDI是J2EE中一个很重要的标准,通常我们是在EJB编程中用到, 
Tomcat4.0中提供了在JSP和Servelt中直接使用JNDI的方法,下面谈一下在Tomcat4.0中配置和使用JNDI的方法 
(以通过JNDI连接数据库为例) 
假设使用的数据库是mysql,实验例子在TOMCAT_HOME/webapps/DBTest目录中 

A.将mysql的JDBC连接库mm.mysql-2.0.9-bin.jar放入TOMCAT_HOME/common/lib中 

B.配置TOMCAT_HOME/conf/serer.xml文件在<Service>;段中加入一个Context: 
<Context path="/DBTest" docBase="DBTest" 
debug="5" reloadable="true" crossContext="true"> 
</Context> 
这是DBTest的根路径,这是为了在DBTest中使用做准备. 

C.在上面加入的<Context>;段加入 
<Resource name="jdbc/TestDB" 
auth="Container" 
type="javax.sql.DataSource"/> 

<ResourceParams name="jdbc/TestDB">
<parameter> 
<name>;factory</name> 
<value>;org.apache.commons.dbcp.BasicDataSourceFactory</value> 
</parameter> 

<!-- Maximum number of dB connections in pool. Make sure you 
configure your mysqld max_connections large enough to handle 
all of your db connections. Set to 0 for no limit. 
--> 
<parameter>
<name>;maxActive</name>
<value>;100</value>
</parameter>

<!-- Maximum number of idle dB connections to retain in pool. 
Set to 0 for no limit. 
-->
<parameter> 
<name>;maxIdle</name> 
<value>;30</value> 
</parameter> 

<!-- Maximum time to wait for a dB connection to become available 
in ms, in this example 10 seconds. An Exception is thrown if 
this timeout is exceeded. Set to -1 to wait indefinitely. 
--> 
<parameter> 
<name>;maxWait</name> 
<value>;10000</value> 
</parameter> 

<!-- MySQL dB username and password for dB connections --> 
<parameter> 
<name>;username</name>; 
<value>;test</value> 
</parameter> 
<parameter> 
<name>;password</name> 
<value>;test</value> 
</parameter> 

<!-- Class name for mm.mysql JDBC driver -->; 
<parameter>; 
<name>;driverClassName</name>; 
<value>;org.gjt.mm.mysql.Driver</value> 
</parameter> 

<!-- The JDBC connection url for connecting to your MySQL dB.--> 
<parameter> 
<name>;url</name> 
<value>;jdbc:mysql://localhost:3306/test</value> 
</parameter> 
</ResourceParams> 

这里每一个小段都有英文注解,是Tomcat提供的,我们可以将按照Sample加入,主要修改的是driverClassName, 
url,和用户帐号;需要强调的是"jdbc/TestDB"就是JDNI要查找的Name.

在web.xml中加入 
<resource-ref> 
<description>;DB Connection</description> 
<res-ref-name>;jdbc/TestDB</res-ref-name> 
<res-type>;javax.sql.DataSource</res-type> 
<res-auth>;Container</res-auth> 
</resource-ref> 
这里的jdbc/TestDb要和C中Resource段的name匹配 

posted @ 2008-04-25 09:02 vesung 阅读(414) | 评论 (0)编辑 收藏

一、DataSource接口是一个更好的连接数据源的方法:
  JDBC1.0是原来是用DriverManager类来产生一个对数据源的连接。JDBC2.0用一种替代的方法,使用DataSource的实现,代码变的更小巧精致,也更容易控制。
  一个DataSource对象代表了一个真正的数据源。根据DataSource的实现方法,数据源既可以是从关系数据库,也电子表格,还可以是一个表格形式的文件。当一个DataSource对象注册到名字服务中,应用程序就可以通过名字服务获得DataSource对象,并用它来产生一个与DataSource代表的数据源之间的连接。
  关于数据源的信息和如何来定位数据源,例如数据库服务器的名字,在哪台机器上,端口号等等,都包含在DataSource对象的属性里面去了。这样,对应用程序的设计来说是更方便了,因为并不需要硬性的把驱动的名字写死到程序里面去。通常驱动名字中都包含了驱动提供商的名字,而在DriverManager类中通常是这么做的。如果数据源要移植到另一个数据库驱动中,代码也很容易做修改。所需要做的修改只是更改DataSource的相关的属性。而使用DataSource对象的代码不需要做任何改动。
  由系统管理员或者有相应权限的人来配置DataSource对象。配置DataSource,包括设定DataSource的属性,然后将它注册到JNDI名字服务中去。在注册DataSource对象的的过程中,系统管理员需要把DataSource对象和一个逻辑名字关联起来。名字可以是任意的,通常取成能代表数据源并且容易记住的名字。在下面的例子中,名字起为:InventoryDB,按照惯例,逻辑名字通常都在jdbc的子上下文中。这样,逻辑名字的全名就是:jdbc/ InventoryDB。
  一旦配置好了数据源对象,应用程序设计者就可以用它来产生一个与数据源的连接。下面的代码片段示例了如何用JNDI上下文获得一个一个数据源对象,然后如何用数据源对象产生一个与数据源的连接。开始的两行用的是JNDI API,第三行用的才是JDBC的API:
   Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/InventoryDB");Connection con = ds.getConnection("myPassword", "myUserName");
  在一个基本的DataSource实现中,DataSource.getConnection方法返回的Connection对象和用DriverManager.getConnection方法返回的Connection对象是一样的。因为DataSource提供的方便性,我们推荐使用DataSource对象来得到一个Connection对象。我们希望所以的基于JDBC2.0技术的数据库驱动都包含一个基本的DataSource的实现,这样就可以在应用程序中很容易的使用它。
  对于普通的应用程序设计者,是否使用DataSource对象只是一个选择问题。但是,对于那些需要用的连接池或者分布式的事务的应用程序设计者来说,就必须使用DataSource对象来获得Connection,原因在下面我们会提到。
   二、Connection pooling(连接池):
  连接池是这么一种机制,当应用程序关闭一个Connection的时候,这个连接被回收,而不是被destroy,因为建立一个连接是一个很费资源的操作。如果能把回收的连接重新利用,会减少新创建连接的数目,显著的提高运行的性能。
  假设应用程序需要建立到一个名字为EmpolyeeDB的DataSource的连接。使用连接池得到连接的代码如下:
   Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB");Connection con = ds.getConnection("myPassword", "myUserName");除了逻辑名字以外,我们发现其代码和上面举的例子的代码是一样的。逻辑名字不同,就可以连接到不同的数据库。DataSource对象的getConnection方法返回的Connection是否是一个连接池中的连接完全取决于DataSource对象的实现方法。如果DataSource对象实现与一个支持连接池的中间层的服务器一起工作,DataSource对象就会自动的返回连接池中的连接,这个连接也是可以重复利用的。
  是否使用连接池获得一个连接,在应用程序的代码上是看不出不同的。在使用这个Connection连接上也没有什么不一样的地方,唯一的不同是在java的finally语句块中来关闭一个连接。在finally中关闭连接是一个好的编程习惯。这样,即使方法抛出异常,Connection也会被关闭并回收到连接池中去。代码应该如下所示:
  try{…
  }catch(){…
  }finally{ if(con!=null)con.close();}
  三、分布式事务:
  获得一个用来支持分布式事务的连接与获得连接池中的连接是很相似的。同样,不同之处在于DataSource的实现上的不同,而不是在应用程序中获得连接的方式上有什么不同。假设DataSource的实现可以与支持分布式事务中间层服务器一起工作,得到连接的代码还是如下所示:
   Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB"); Connection con = ds.getConnection("myPassword", "myUserName");由于性能上的原因,如果一个DataSource能够支持分布式的事务,它同样也可以支持连接池管理。
  从应用程序设计者的观点来看。是否支持分布式的事务的连接对它来说没什么不同,唯一的不同是在事务的边界上(开始一个事务的地方和结束一个事务的地方),开始一个事务或者结束一个事务都是由事务服务器来控制的。应用程序不应该做任何可能妨碍服务的事情。应用程序不能够直接调用事务提交commit或者回滚rollback操作,也不能够使用事务的自动提交模式auto-commit mode(在数据库操作完成的时候自动的调用commit或者rollback)。 
 
在一个连接参与了分布式事务的时候,下面的代码是你不能做的(con表示支持分布式事务的连接Connection)。
  con.commit();或者con.rollback();或者con.setAutoCommit(true);对于通常的Connection来说,缺省的是auto-commit模式。而对于支持分布式事务的Connection来说,缺省不是auto-commit模式。注意,即使Connection是支持事务的,它也可以用于没有事务的情况。关于事务边界的限制只是是对分布式事务的情况下才成立的。
  配置支持连接池的DataSource的时候,涉及到配置ConnectionPoolDataSource对象,这个对象是三层体系结构中的中间层来管理连接池的。同样的,在配置支持分布式事务的时候,需要配置XADataSource,XADataSource是中间层用来管理分布式事物的对象。ConnectionPoolDataSource和XADataSource是由驱动提供商提供的,对应用程序的设计者来说是透明的。和基本的DataSource一样,系统管理员来配置ConnectionPoolDataSource和XADataSource对象。
  四、结果集(RowSet接口):
  结果集对象是一行行数据的容器。根据其目的,可以通过多种方法实现。RowSet及其相关的接口与JDBC2.0的标准扩展API有点不同,他们并不是驱动的一部分,RowSet是在驱动的上层实现的,可以由其它的任何人来实现他们。
  任何类型的rowset都实现了RowSet接口,RowSet接口扩展了ResultSet接口。这样RowSet对象就有了ResultSet对象所有的功能。能够通过getXXX方法得到数据库中的某列值,通过updateXXX方法可以修改某列值,可以移动光标,是当前行变为另一行。
  当然,我们更感兴趣的是RowSet接口提供的新的功能。作为一个JavaBean组件,RowSet对象可以增加或者删除一个listener(监听者),可以get或者set其属性值,这些属性中,有一个是字符串,表示一个对数据库Query请求,RowSet接口定义了设定参数的方法,也提供了执行这个请求的方法。这意味着RowSet对象能够执行查询请求,可以根据它产生的结果集进行计算。同样,RowSet也可以根据任何表格数据源进行计算,所以,它不局限于关系数据库。
  从数据源得到数据之后,RowSet对象可以和数据源断开连接,rowset也可以被序列化。这样,RowSet就可以通过网络传递给瘦客户端。
  RowSet可以被重新连接到数据源,这样,做的修改就可以存回到数据源中去。如果产生了一个listener,当RowSet的当前行移动,或者数据被修改的时候,监听者就会收到通知。例如,图形用户界面组件可以注册成为监听者,当RowSet更改的时候,图形用户界面接到通知,就可以修改界面,来符合它所表示的RowSet。
  根据不同的需要,RowSet接口可以通过多种方法来实现。Java software已经写了一个CachedRowSet实现,从http://developer.java.sun.com/developer/earlyAccess/crs/index.html中可以得到这个实现。
  与CachedRowSet类不样的是,JDBCRowSet类总是保持一个和数据源的连接。这样,在ResultSet外围简单到加了一层,是基于JDBC技术的驱动看起来象是一个简单的JavaBean组件一样。

  总结:JDBC2.0标准扩展API通过见DataSource注册到JNDI名字服务上,将JDBC技术扩展为一个全新的概念。使应用程序的代码更加精巧,易于控制。新的API支持了连接池,支持分布式的事务。最后,还使java应用程序可以在网络上传播结果集,是不可以滚动的ResultSet变成了可以滚动的RowSet。
posted @ 2008-04-21 08:58 vesung 阅读(3240) | 评论 (0)编辑 收藏

JDBC 2.0 API被划分为两部分:JDBC 2.0核心API和JDBC 2.0标准扩展API。核心API在java.sql里面。这是原来的版本就实现了的基本的功能。标准扩展API在javax.sql里面。由JDBC2.0规范新规定的一些接口在这里面。当然,JDBC2.0也对原来版本的java.sql核心做了一些改动。不过不是很大。原来JDBC1.0的程序可以不加修改的在JDBC2.0上运行。这是Java的一贯的良好的作风。最新的JDBC包可以从sun公司的网站上下载。 
  JDBC2.0的扩展API增加了一些数据访问和数据源访问的重大的功能。这中间有一些是主要用来做企业计算的。用JDBC2.0的新的扩展包,JDBC提供了一个从JAVA2平台的通用的数据访问的方法。
  首先,我们来看看JDBC标准扩展的API怎样来和JDBC2.0结合在一起的。JDBC2.0包括两个包:
  1、 java.sql包,个包里面是JDBC2.0的核心API。它包括了原来的JDBC API(JDBC 1.0版本),再加上一些新的2.0版本的API。这个包在Java 2 Platform SDK里面有。
  2、 javax.sql包,这里面是JDBC2.0的标准扩展API。这个包是一个全新的,在Java 2 Platform SDK, Enterprise Edition里面单独提供。
  JDBC2.0的核心API包括了JDBC1.0的API,并在此基础上增加了一些功能,对某些性能做了增强。使java语言在数据库计算的前端提供了统一的数据访问方法,效率也得到了提高。
  JDBC是向后兼容的,JDBC1.0的程序可以不加修改的运行在JDBC2.0上。但是,假如程序中用到了JDBC2.0的新特性,就必须要运行在JDBC2.0版本上。
  概括的来说,JDBC核心API的新特性在两个方面做了工作。一个是支持一些新的功能,另一个就是支持SQL3的数据类型。
  1、 在支持新功能方面:包括结果集可以向后滚动,批量的更新数据。另外,还提供了UNICODE字符集的字符流操作。
  2、 在支持SQL3的数据类型方面:包括新的SQL3数据类型,增加了对持久性对象的存贮。
  为了对数据的存取,操作更加方便,JDBC的新特性是应用程序的设计更容易了。例如:数据块的操作能够显著的提高数据库访问的性能。新增加的BLOB, CLOB,和数组接口能够是应用程序操作大块的数据类型,而不必客户端在存贮之前进行其它的处理。这样,就显著的提高了内存的使用效率。
   下面我们来介绍JDBC2.0的标准扩展API。标准扩展API分为如下几个方面:
  1、 DataSource接口:和Java名字目录服务(JNDI)一起工作的数据源接口。它提供了对数 吹囊恢指玫牧臃椒ā?br>;  2、 Connection pooling(连接池):可以重复使用连接,而不是对每个请求都使用一个新的连接。
  3、 Distrubute transaction(分布式的事务):在一个事务中涉及到了多个数据库服务器。
  4、 Rowsets:JavaBean组件包含了结果集,主要用来将数据传给瘦客户,或者提供一个可以滚动的结果集。
posted @ 2008-04-10 11:29 vesung 阅读(690) | 评论 (0)编辑 收藏

1.$("#idName")
    获取元素id为idName的元素 
 如:html
<a id="myLinck" href="#"></a>
$("#myLinck") 会返回<a id="myLinck"></a>元素
-----------------------------------
2.$(".className")
    获取元素class属性为className的元素集合
如:html
<a class="a1" href="#">1</a>
<a class="a1" href="#">2</a>
<a class="a2" href="#">3</a>
$(".a1")返回[<a class="a1" href="#">1</a>,<a class="a1" href="#">2</a>]
---------------------------------------
3.$("input[@type='text']")
    获取所有type=text的input元素
如:html
<input type='text'/>
<input type='text/>
<input type='checkbox'/>
$("input[@type='text']")返回[<input type='text'/><input type='text/>]
posted @ 2008-03-24 17:53 vesung 阅读(526) | 评论 (0)编辑 收藏

普通的dom对象一般可以通过$()转换成jquery对象。
如:$(document.getElementById("msg"))则为jquery对象,可以使用jquery的方法。
由于jquery对象本身是一个集合。所以如果jquery对象要转换为dom对象则必须取出其中的某一项,一般可通过索引取出。
如:$("#msg")[0],$("div").eq(1)[0],$("div").get()[1],$("td")[5]这些都是dom对象,可以使用dom中的方法,但不能再使用Jquery的方法。
以下几种写法都是正确的: 字串8

$("#msg").html();
$("#msg")[0].innerHTML;
$("#msg").eq(0)[0].innerHTML;
$("#msg").get(0).innerHTML;

posted @ 2008-03-24 17:38 vesung 阅读(681) | 评论 (0)编辑 收藏

为了支持 AJAX 功能。这个包定义了 Ajax.Request 类。

假如你有一个应用程序可以通过url http://yoursever/app/get_sales?empID=1234&year=1998与服务器通信。它返回下面这样的XML 响应。

 

 

<?xml version="1.0" encoding="utf-8" ?>
<ajax-response>
    
<response type="object" id="productDetails">
        
<monthly-sales>
            
<employee-sales>
                
<employee-id>1234</employee-id>
                
<year-month>1998-01</year-month>
                
<sales>$8,115.36</sales>
            
</employee-sales>
            
<employee-sales>
                
<employee-id>1234</employee-id>
                
<year-month>1998-02</year-month>
                
<sales>$11,147.51</sales>
            
</employee-sales>
        
</monthly-sales>
    
</response>
</ajax-response>

 

Ajax.Request对象和服务器通信并且得到这段XML是非常简单的。下面的例子演示了它是如何完成的。

 

<script>
    
function searchSales()
    
{
        
var empID = $F('lstEmployees');
        
var y = $F('lstYears');
        
var url = 'http://yoursever/app/get_sales';
        var pars = 'empID=+ empID + '&year=+ y;
       
var myAjax = new Ajax.Request(
                    url,
                    
{method: 'get', parameters: pars, onComplete: showResponse}
                    );

    }


    
function showResponse(originalRequest)
    
{
        
//put returned XML in the textarea
        $('result').value = originalRequest.responseText;
    }

</script>

<select id="lstEmployees" size="10" onchange="searchSales()">
    
<option value="5">Buchanan, Steven</option>
    
<option value="8">Callahan, Laura</option>
    
<option value="1">Davolio, Nancy</option>
</select>
<select id="lstYears" size="3" onchange="searchSales()">
    
<option selected="selected" value="1996">1996</option>
    
<option value="1997">1997</option>
    
<option value="1998">1998</option>
</select>
<br><textarea id=result cols=60 rows=10 ></textarea>


你看到传入 Ajax.Request构造方法的第二个对象了吗? 参数{method: 'get', parameters: pars, onComplete: showResponse} 表示一个匿名对象的真实写法。他表示你传入的这个对象有一个名为 method 值为 'get'的属性,另一个属性名为 parameters 包含HTTP请求的查询字符串,和一个onComplete 属性/方法包含函数showResponse

还有一些其它的属性可以在这个对象里面定义和设置,如 asynchronous,可以为truefalse 来决定AJAX对服务器的调用是否是异步的(默认值是 true)。

这个参数定义AJAX调用的选项。在我们的例子中,在第一个参数通过HTTP GET命令请求那个url,传入了变量 pars包含的查询字符串, Ajax.Request 对象在它完成接收响应的时候将调用showResponse 方法。

也许你知道, XMLHttpRequest在HTTP请求期间将报告进度情况。这个进度被描述为四个不同阶段:Loading, Loaded, Interactive, 或 Complete。你可以使 Ajax.Request 对象在任何阶段调用自定义方法 ,Complete 是最常用的一个。想调用自定义的方法只需要简单的在请求的选项参数中的名为 onXXXXX 属性/方法中提供自定义的方法对象。 就像我们例子中的 onComplete 。你传入的方法将会被用一个参数调用,这个参数是 XMLHttpRequest 对象自己。你将会用这个对象去得到返回的数据并且或许检查包含有在这次调用中的HTTP结果代码的 status 属性。

还有另外两个有用的选项用来处理结果。我们可以在onSuccess 选项处传入一个方法,当AJAX无误的执行完后调用, 相反的,也可以在onFailure选项处传入一个方法,当服务器端出现错误时调用。正如onXXXXX 选项传入的方法一样,这两个在被调用的时候也传入一个带有AJAX请求的XMLHttpRequest对象。

我们的例子没有用任何有趣的方式处理这个 XML响应, 我们只是把这段XML放进了一个文本域里面。对这个响应的一个典型的应用很可能就是找到其中的想要的信息,然后更新页面中的某些元素, 或者甚至可能做某些XSLT转换而在页面中产生一些HTML。
完。
摘自:https://compdoc2cn.dev.java.net

posted @ 2008-03-21 17:45 vesung 阅读(870) | 评论 (0)编辑 收藏

 Fed救市之举令中国控制通胀难度加大 (原文地址)
        在援救完贝尔斯登公司(Bear Stearns Cos.)后,美国联邦储备委员会(Fed)主席贝南克(Ben Bernanke)今晚可能会再次送出减息良药。(编者:最新消息,Fed周二已宣布将关键利率下调75个基点。)而这对于香港和中国大陆市场来说又意味着什么呢?对正面临着十几年来最高通货膨胀率的中国货币政策制定者而言,Fed的“灵丹”却可能产生副作用。但是,只要中国继续坚持现行的汇率制度,就不得不生生吞下这颗药丸,而且还必须硬着头皮去应对。中国央行(People's Bank of China)加息而Fed大幅降息,产生的直接影响就是中美利差进一步扩大,使得热钱问题再次成为众矢之的。上周公布的数据显示,Fed 1月份的紧急降息造成中美货币市场利差达到了50个基点,并使得流入中国大陆的外商直接投资规模进一步增大。今年前两个月流入中国大陆的外商直接投资较上年同期增长了75%。这些外资到底是进行商业投资还是纯粹出于投机目的不得而知,不过可以肯定的一点是,中美利差的扩大势必会增强人民币升值预期。上周五人民币升至汇改以来最高水平,达到1美元兑人民币7.0844元。
.... ...
 Fed救市之举令中国控制通胀难度加大 
posted @ 2008-03-19 09:24 vesung 阅读(277) | 评论 (0)编辑 收藏

struts响应用户请求的工作流程:

Request

|
V

ActionServlet

|

如果不存在相应的Action则否则返回error,流程结束

|
V

创建ActionForm

|

进行validatge校验,如果没有通过校验则返回error


创建Action

|
V

执行Action的execute方法,并返回ActionForword对象

|
V

return respose
结束

 

 

posted @ 2008-03-11 11:22 vesung 阅读(733) | 评论 (1)编辑 收藏

     摘要: 文章来源:新浪网

基于城镇居民和农村居民的人均纯收入实现较大跃升的现实,国务院总理温家宝在今年的政府工作报告中特别强调了收入分配的问题,“逐步提高居民收入在国民收入分配中的比重,提高劳动报酬在初次分配中比重”。

  个中关键就是要“调整国民收入分配格局,深化收入分配制度改革。”并多渠道增加农民收入,确保农民工工资按时足额发放。还要“提高企业职工工资的水平,建立企业职工工资正常增长和支付保障机制,……健全并落实最低工资制度。”

  同时,改革国有企业工资总额管理办法,加强对垄断行业企业工资监管。对此,劳动和社会保障部劳动工资司司长邱小平表示,既要通过采取措施,促进非垄断行业的企业职工工资收入逐步提高;又要对垄断行业的高收入采取措施,加以有效调控。
  阅读全文
posted @ 2008-03-06 08:57 vesung 阅读(445) | 评论 (0)编辑 收藏

仅列出标题
共6页: 上一页 1 2 3 4 5 6 下一页