﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-This Is A FineDay-随笔分类-J2EE</title><link>http://www.blogjava.net/fine/category/20605.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 20 Oct 2010 07:01:27 GMT</lastBuildDate><pubDate>Wed, 20 Oct 2010 07:01:27 GMT</pubDate><ttl>60</ttl><item><title>Understanding JTA</title><link>http://www.blogjava.net/fine/archive/2010/10/19/335625.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Tue, 19 Oct 2010 11:49:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2010/10/19/335625.html</guid><description><![CDATA[
http://archive.devx.com/java/free/articles/dd_jta/jta-2.asp
Understanding JTA—the Java Transaction API (cont.)

Distributed Transactions and the Transaction Manager
As we stated previously, a distributed transaction is a transaction that accesses and updates data on two or more networked resources. These resources could consist of several different RDBMSs housed on a single sever, for example, Oracle, SQL Server, and Sybase; or they could include several instances of a single type of database residing on a number of different servers. In any case, a distributed transaction involves coordination among the various resource managers. This coordination is the function of the transaction manager.
The transaction manager is responsible for making the final decision either to commit or rollback any distributed transaction. A commit decision should lead to a successful transaction; rollback leaves the data in the database unaltered. JTA specifies standard Java interfaces between the transaction manager and the other components in a distributed transaction: the application, the application server, and the resource managers. This relationship is illustrated in the following diagram:
 
The numbered boxes around the transaction manager correspond to the three interface portions of JTA:
1—UserTransaction—The javax.transaction.UserTransaction interface provides the application the ability to control transaction boundaries programmatically. The javax.transaction.UserTransaction method starts a global transaction and associates the transaction with the calling thread.
2—Transaction Manager—The javax.transaction.TransactionManager interface allows the application server to control transaction boundaries on behalf of the application being managed.
3—XAResource—The javax.transaction.xa.XAResource interface is a Java mapping of the industry standard XA interface based on the X/Open CAE Specification (Distributed Transaction Processing: The XA Specification).
Notice that a critical link is support of the XAResource interface by the JDBC driver. The JDBC driver must support both normal JDBC interactions, through the application and/or the application server, as well as the XAResource portion of JTA.
Developers of code at the application level should not be concerned about the details of distributed transaction management. This is the job of the distributed transaction infrastructure—the application server, the transaction manager, and the JDBC driver. The only caveat for application code is that is should not invoke a method that would affect the boundaries of a transaction while the connection is in the scope of a distributed transaction. Specifically, an application should not call the Connection methods commit, rollback, and setAutoCommit(true) because they would interfere with the infrastructure's management of the distributed transaction.
The Distributed Transaction Process
The transaction manager is the primary component of the distributed transaction infrastructure; however, the JDBC driver and application server components should have the following characteristics:
•	The driver should implement the JDBC 2.0 API, including the Optional Package interfaces XADataSource and XAConnection, and the JTA interface XAResource. 
•	The application server should provide a DataSource class that is implemented to interact with the distributed transaction infrastructure and a connection pooling module (for improved performance).
The first step of the distributed transaction process is for the application to send a request for the transaction to the transaction manager. Although the final commit/rollback decision treats the transaction as a single logical unit, there can be many transaction branches involved. A transaction branch is associated with a request to each resource manager involved in the distributed transaction. Requests to three different RDBMSs, therefore, require three transaction branches. Each transaction branch must be committed or rolled back by the local resource manager. The transaction manager controls the boundaries of the transaction and is responsible for the final decision as to whether or not the total transaction should commit or rollback. This decision is made in two phases, called the Two-Phase Commit Protocol.
In the first phase, the transaction manager polls all of the resource managers (RDBMSs) involved in the distributed transaction to see if each one is ready to commit. If a resource manager cannot commit, it responds negatively and rolls back its particular part of the transaction so that data is not altered.
In the second phase, the transaction manager determines if any of the resource managers have responded negatively, and, if so, rolls back the whole transaction. If there are no negative responses, the translation manager commits the whole transaction, and returns the results to the application.
Developers of transaction manager code must be conversant with all three interfaces of JTA: UserTransaction, TransactionManager, and XAResource, which are described in the Sun JTA specification. The JDBC API Tutorial and Reference, Second Edition is also a useful reference. JDBC driver developers need only be concerned with the XAResource interface. This interface is a Java mapping of the industry standard X/Open XA protocol that allows a resource manager to participate in a transaction. The component of the driver connected with the XAResource interface is responsible for "translating" between the transaction manager and the resource manager. The following section provides examples of XAResource calls.
The JDBC Driver and XAResource
To simplify the explanation of XAResource, these examples illustrate how an application would use JTA when there is no application server and transaction manager involved. Basically, the application in these examples is also acting as application server and transaction manager. Most enterprises use transaction managers and application servers because they manage distributed transactions much more efficiently than an application can. By following these examples, however, an application developer can test the robustness of JTA support in a JDBC driver. Some examples may not work for a particular database because of inherent problems associated with that database.
Before using JTA, you must first implement an Xid class for identifying transactions (this would normally be done by the transaction manager). The Xid contains three elements: formatID, gtrid (global transaction ID), and bqual (branch qualifier ID).
The formatID is usually zero, meaning that you are using the OSI CCR (Open Systems Interconnection Commitment, Concurrency, and Recovery standard) for naming. If you are using another format, the formatID should be greater than zero. A value of -1 means that the Xid is null.
The gtrid and bqual can each contain up to 64 bytes of binary code to identify the global transaction and the branch transaction, respectively. The only requirement is that the gtrid and bqual taken together must be globally unique. Again, this can be achieved by using the naming rules specified in the OSI CCR.
The following example illustrates implementation of an Xid:

import javax.transaction.xa.*;
public class MyXid implements Xid
{
    protected int formatId;
    protected byte gtrid[];
    protected byte bqual[];

    public MyXid()
    {
    }

    public MyXid(int formatId, byte gtrid[], byte bqual[])
    {
        this.formatId = formatId;
        this.gtrid = gtrid;
        this.bqual = bqual;
    }


    public int getFormatId()
    {
        return formatId;
    }

    public byte[] getBranchQualifier()
    {
        return bqual;
    }

    public byte[] getGlobalTransactionId()
    {
        return gtrid;
    }

}
Second, you need to create a datasource for the database that you are using:

public DataSource getDataSource()
    throws SQLException
{
    SQLServerDataSource xaDS = new
        com.merant.datadirect.jdbcx.sqlserver.SQLServerDataSource();
    xaDS.setDataSourceName("SQLServer");
    xaDS.setServerName("server");
    xaDS.setPortNumber(1433);
    xaDS.setSelectMethod("cursor");
    return xaDS;
}
Example 1—This example uses the two-phase commit protocol to commit one transaction branch:

XADataSource xaDS;
XAConnection xaCon;
XAResource   xaRes;
Xid          xid;
Connection   con;
Statement    stmt;
int          ret;

xaDS = getDataSource();
xaCon = xaDS.getXAConnection("jdbc_user", "jdbc_password");
xaRes = xaCon.getXAResource();

con = xaCon.getConnection();
stmt = con.createStatement();

xid = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});

try {
    xaRes.start(xid, XAResource.TMNOFLAGS);
    stmt.executeUpdate("insert into test_table values (100)");
    xaRes.end(xid, XAResource.TMSUCCESS);

    ret = xaRes.prepare(xid);
    if (ret == XAResource.XA_OK) {
        xaRes.commit(xid, false);
    }
}
catch (XAException e) {
    e.printStackTrace();
}
finally {
    stmt.close();
    con.close();
    xaCon.close();
}
Because the initialization code is the same or very similar for all the examples, only significantly different code is represented from this point forward.
Example 2—This example, similar to Example 1, illustrates a rollback:

xaRes.start(xid, XAResource.TMNOFLAGS);
stmt.executeUpdate("insert into test_table values (100)");
xaRes.end(xid, XAResource.TMSUCCESS);

ret = xaRes.prepare(xid);
if (ret == XAResource.XA_OK) {
    xaRes.rollback(xid);
}
Example 3—This example shows how a distributed transaction branch suspends, lets the same connection do a local transaction, and them resumes the branch later. The two-phase commit actions of distributed transaction do not affect the local transaction.

xid = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});

xaRes.start(xid, XAResource.TMNOFLAGS);
stmt.executeUpdate("insert into test_table values (100)");
xaRes.end(xid, XAResource.TMSUSPEND);

// This update is done outside of transaction scope, so it
// is not affected by the XA rollback.
stmt.executeUpdate("insert into test_table2 values (111)");

xaRes.start(xid, XAResource.TMRESUME);
stmt.executeUpdate("insert into test_table values (200)");
xaRes.end(xid, XAResource.TMSUCCESS);

ret = xaRes.prepare(xid);
if (ret == XAResource.XA_OK) {
    xaRes.rollback(xid);
}
Example 4—This example illustrates how one XA resource can be shared among different transactions. Two transaction branches are created, but they do not belong to the same distributed transaction. JTA allows the XA resource to do a two-phase commit on the first branch even though the resource is still associated with the second branch.

xid1 = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});
xid2 = new MyXid(100, new byte[]{0x11}, new byte[]{0x22});

xaRes.start(xid1, XAResource.TMNOFLAGS);
stmt.executeUpdate("insert into test_table1 values (100)");
xaRes.end(xid1, XAResource.TMSUCCESS);

xaRes.start(xid2, XAResource.TMNOFLAGS);

// Should allow XA resource to do two-phase commit on
// transaction 1 while associated to transaction 2
ret = xaRes.prepare(xid1);
if (ret == XAResource.XA_OK) {
    xaRes.commit(xid2, false);
}

stmt.executeUpdate("insert into test_table2 values (200)");
xaRes.end(xid2, XAResource.TMSUCCESS);

ret = xaRes.prepare(xid2);
if (ret == XAResource.XA_OK) {
    xaRes.rollback(xid2);
}
Example 5—This example illustrates how transaction branches on different connections can be joined as a single branch if they are connected to the same resource manager. This feature improves distributed transaction efficiency because it reduces the number of two-phase commit processes. Two XA connections to the same database server are created. Each connection creates its own XA resource, regular JDBC connection, and statement. Before the second XA resource starts a transaction branch, it checks to see if it uses the same resource manager as the first XA resource uses. If this is case, as in this example, it joins the first branch created on the first XA connection instead of creating a new branch. Later, the transaction branch can be prepared and committed using either XA resource.

xaDS = getDataSource();

xaCon1 = xaDS.getXAConnection("jdbc_user", "jdbc_password");
xaRes1 = xaCon1.getXAResource();
con1 = xaCon1.getConnection();
stmt1 = con1.createStatement();

xid1 = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});
xaRes1.start(xid1, XAResource.TMNOFLAGS);
stmt1.executeUpdate("insert into test_table1 values (100)");
xaRes1.end(xid, XAResource.TMSUCCESS);

xaCon2 = xaDS.getXAConnection("jdbc_user", "jdbc_password");
xaRes2 = xaCon1.getXAResource();
con2 = xaCon1.getConnection();
stmt2 = con1.createStatement();

if (xaRes2.isSameRM(xaRes1)) {
    xaRes2.start(xid1, XAResource.TMJOIN);
    stmt2.executeUpdate("insert into test_table2 values (100)");
    xaRes2.end(xid1, XAResource.TMSUCCESS);
}
else {
    xid2 = new MyXid(100, new byte[]{0x01}, new byte[]{0x03});
    xaRes2.start(xid2, XAResource.TMNOFLAGS);
    stmt2.executeUpdate("insert into test_table2 values (100)");
    xaRes2.end(xid2, XAResource.TMSUCCESS);
    ret = xaRes2.prepare(xid2);
    if (ret == XAResource.XA_OK) {
        xaRes2.commit(xid2, false);
    }
}

ret = xaRes1.prepare(xid1);
if (ret == XAResource.XA_OK) {
    xaRes1.commit(xid1, false);
}
Example 6—This example shows how to recover prepared or heuristically completed transaction branches during failure recovery. It first tries to rollback each branch; if it fails, it tries to tell resource manager to discard knowledge about the transaction.

MyXid[] xids;

xids = xaRes.recover(XAResource.TMSTARTRSCAN | XAResource.TMENDRSCAN);
for (int i=0; xids!=null && i<xids.length; i++) {
    try {
        xaRes.rollback(xids[i]);
    }
    catch (XAException ex) {
        try {
            xaRes.forget(xids[i]);
        }
        catch (XAException ex1) {
            System.out.println("rollback/forget failed: " + ex1.errorCode);
            }
     }
}

<img src ="http://www.blogjava.net/fine/aggbug/335625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2010-10-19 19:49 <a href="http://www.blogjava.net/fine/archive/2010/10/19/335625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SOCKET CLOSE_WAIT  搜集</title><link>http://www.blogjava.net/fine/archive/2008/07/26/217709.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Sat, 26 Jul 2008 12:31:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2008/07/26/217709.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/217709.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2008/07/26/217709.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/217709.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/217709.html</trackback:ping><description><![CDATA[
		<span class="hilite3">CLOSE_WAIT</span>，TCP的癌症，TCP的朋友。<br /><br /><span class="hilite3">CLOSE_WAIT</span>状态的生成原因<br />首先我们知道，如果我们的服务器程序APACHE处于<span class="hilite3">CLOSE_WAIT</span>状态的话，说明套接字是被动关闭的！<br /><br />因为如果是CLIENT端主动断掉当前连接的话，那么双方关闭这个TCP连接共需要四个packet：<br /><br />      Client ---&gt;  FIN  ---&gt;  Server <br /><br />      Client &lt;---  ACK  &lt;---  Server <br /><br /> 这时候Client端处于FIN_WAIT_2状态；而Server 程序处于<span class="hilite3">CLOSE_WAIT</span>状态。<br /><br />      Client &lt;---  FIN  &lt;---  Server <br /><br />这时Server 发送FIN给Client，Server 就置为LAST_ACK状态。<br /><br />       Client ---&gt;  ACK  ---&gt;  Server <br /><br />Client回应了ACK，那么Server 的套接字才会真正置为CLOSED状态。<br /><br />Server 程序处于<span class="hilite3">CLOSE_WAIT</span>状态，而不是LAST_ACK状态，说明还没有发FIN给Client，那么可能是在关闭连接之前还有许多数据要发送或者其他事要做，导致没有发这个FIN packet。<br /><br />通常来说，一个<span class="hilite3">CLOSE_WAIT</span>会维持至少2个小时的时间。如果有个流氓特地写了个程序，给你造成一堆的<span class="hilite3">CLOSE_WAIT</span>，消耗<br /><br />你的资源，那么通常是等不到释放那一刻，系统就已经解决崩溃了。<br /><br />只能通过修改一下TCP/IP的参数，来缩短这个时间：修改tcp_keepalive_*系列参数有助于解决这个问题。<br /><br /> <br /><br />proc/sys/net/ipv4/下各项的意义<br /><br />/proc/sys/net/ipv4/icmp_timeexceed_rate<br />这个在traceroute时导致著名的“Solaris middle star”。这个文件控制发送ICMP Time Exceeded消息的比率。<br />/proc/sys/net/ipv4/igmp_max_memberships<br />主机上最多有多少个igmp (多播)套接字进行监听。<br />/proc/sys/net/ipv4/inet_peer_gc_maxtime<br />求 助: Add a little explanation about the inet peer storage? Minimum interval between garbage collection passes. This interval is in effect under low (or absent) memory pressure on the pool. Measured in jiffies.<br />/proc/sys/net/ipv4/inet_peer_gc_mintime<br />每一遍碎片收集之间的最小时间间隔。当内存压力比较大的时候，调整这个间隔很有效。以jiffies计。<br />/proc/sys/net/ipv4/inet_peer_maxttl<br />entries的最大生存期。在pool没有内存压力的情况下(比如，pool中entries的数量很少的时候)，未使用的entries经过一段时间就会过期。以jiffies计。<br />/proc/sys/net/ipv4/inet_peer_minttl<br />entries的最小生存期。应该不小于汇聚端分片的生存期。当pool的大小不大于inet_peer_threshold时，这个最小生存期必须予以保证。以jiffies计。<br />/proc/sys/net/ipv4/inet_peer_threshold<br />The approximate size of the INET peer storage. Starting from this threshold entries will be thrown aggressively. This threshold also determines entries' time-to-live and time intervals between garbage collection passes. More entries, less time-to-live, less GC interval.<br />/proc/sys/net/ipv4/ip_autoconfig<br />这个文件里面写着一个数字，表示主机是否通过RARP、BOOTP、DHCP或者其它机制取得其IP配置。否则就是0。<br />/proc/sys/net/ipv4/ip_default_ttl<br />数据包的生存期。设置为64是安全的。如果你的网络规模巨大就提高这个值。不要因为好玩而这么做——那样会产生有害的路由环路。实际上，在很多情况下你要考虑能否减小这个值。<br />/proc/sys/net/ipv4/ip_dynaddr/proc/sys/net/ipv4/icmp_destunreach_rate<br /><br />如果你有一个动态地址的自动拨号接口，就得设置它。当你的自动拨号接口激活的时候，本地所有没有收到答复的TCP套接字会重新绑定到正确的地址上。这可以解决引发拨号的套接字本身无法工作，重试一次却可以的问题。<br />/proc/sys/net/ipv4/ip_forward<br />内核是否转发数据包。缺省禁止。<br />/proc/sys/net/ipv4/ip_local_port_range<br />用于向外连接的端口范围。缺省情况下其实很小：1024到4999。<br />/proc/sys/net/ipv4/ip_no_pmtu_disc<br />如果你想禁止“沿途MTU发现”就设置它。“沿途MTU发现”是一种技术，可以在传输路径上检测出最大可能的MTU值。参见Cookbook一章中关于“沿途MTU发现”的内容。<br />/proc/sys/net/ipv4/ipfrag_high_thresh<br />用 于
IP分片汇聚的最大内存用量。分配了这么多字节的内存后，一旦用尽，分片处理程序就会丢弃分片。
When ipfrag_high_thresh bytes of memory is allocated for this purpose, the fragment handler will toss packets until ipfrag_low_thresh is reached.<br />/proc/sys/net/ipv4/ip_nonlocal_bind<br />如果你希望你的应用程序能够绑定到不属于本地网卡的地址上时，设置这个选项。如果你的机器没有专线连接(甚至是动态连接)时非常有用，即使你的连接断开，你的服务也可以启动并绑定在一个指定的地址上。<br />/proc/sys/net/ipv4/ipfrag_low_thresh<br />用于IP分片汇聚的最小内存用量。<br />/proc/sys/net/ipv4/ipfrag_time<br />IP分片在内存中的保留时间(秒数)。<br />/proc/sys/net/ipv4/tcp_abort_on_overflow<br />一个布尔类型的标志，控制着当有很多的连接请求时内核的行为。启用的话，如果服务超载，内核将主动地发送RST包。<br />/proc/sys/net/ipv4/tcp_fin_timeout<br />如 果
套接字由本端要求关闭，这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接，甚至意外当机。缺省值是60秒。
2.2 内核的通常值是180秒，你可以按这个设置，但要记住的是，即使你的机器是一个轻载的WEB服务器，也有因为大量的死套接字而内存溢出的风
险，FIN- WAIT-2的危险性比FIN-WAIT-1要小，因为它最多只能吃掉1.5K内存，但是它们的生存期长些。参见
tcp_max_orphans。<br /><br />/proc/sys/net/ipv4/tcp_keepalive_time<br />当keepalive起用的时候，TCP发送keepalive消息的频度。缺省是2小时。<br />/proc/sys/net/ipv4/tcp_keepalive_intvl<br />当探测没有确认时，重新发送探测的频度。缺省是75秒。<br />/proc/sys/net/ipv4/tcp_keepalive_probes<br />在认定连接失效之前，发送多少个TCP的keepalive探测包。缺省值是9。这个值乘以tcp_keepalive_intvl之后决定了，一个连接发送了keepalive之后可以有多少时间没有回应。<br />/proc/sys/net/ipv4/tcp_max_orphans<br />系 统
中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字，孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的
DoS攻击，你绝对不能过分依靠它或者人为地减小这个值，更应该增加这个值(如果增加了内存之后)。
This limit exists only to prevent simple DoS attacks, you _must_ not rely on this or lower the limit artificially, but rather increase it (probably, after increasing installed memory), if network conditions require more than default value, and tune network services to linger and kill such states more aggressively. 让
我再次提醒你：每个孤儿套接字最多能够吃掉你64K不可交换的内存。<br />/proc/sys/net/ipv4/tcp_orphan_retries<br />本端试图关闭TCP连接之前重试多少次。缺省值是7，相当于50秒~16分钟(取决于RTO)。如果你的机器是一个重载的WEB服务器，你应该考虑减低这个值，因为这样的套接字会消耗很多重要的资源。参见tcp_max_orphans。<br />/proc/sys/net/ipv4/tcp_max_syn_backlog<br />记 录
的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言，缺省值是1024，小内存的系统则是128。如果服务器不堪重负，
试 试提高这个值。注意！如果你设置这个值大于1024，最好同时调整include/net/tcp.h中的TCP_SYNQ_HSIZE，以保
证 TCP_SYNQ_HSIZE*16 ≤tcp_max_syn_backlo，然后重新编译内核。<br />/proc/sys/net/ipv4/tcp_max_tw_buckets<br />系 统
同时保持timewait套接字的最大数量。如果超过这个数字，time-wait套接字将立刻被清除并打印警告信息。这个限制仅仅是为了防止简单
的 DoS攻击，你绝对不能过分依靠它或者人为地减小这个值，如果网络实际需要大于缺省值，更应该增加这个值(如果增加了内存之后)。<br />/proc/sys/net/ipv4/tcp_retrans_collapse<br />为兼容某些糟糕的打印机设置的“将错就错”选项。再次发送时，把数据包增大一些，来避免某些TCP协议栈的BUG。<br /><br />/proc/sys/net/ipv4/tcp_retries1<br />在认定出错并向网络层提交错误报告之前，重试多少次。缺省设置为RFC规定的最小值：3，相当于3秒~8分钟（取决于RIO）。<br />/proc/sys/net/ipv4/tcp_retries2<br />在杀死一个活动的TCP连接之前重试多少次。RFC 1122规定这个限制应该长于100秒。这个值太小了。缺省值是15，相当于13~30分钟（取决于RIO）。<br />/proc/sys/net/ipv4/tcp_rfc1337<br />这个开关可以启动对于在RFC1337中描述的“tcp的time-wait暗杀危机”问题的修复。启用后，内核将丢弃那些发往time-wait状态TCP套接字的RST包。却省为0。<br />/proc/sys/net/ipv4/tcp_sack<br />特别针对丢失的数据包使用选择性ACK，这样有助于快速恢复。<br />/proc/sys/net/ipv4/tcp_stdurg<br />使用TCP紧急指针的主机需求解释。因为绝大多数主机采用BSD解释，所以如果你在Linux上打开它，可能会影响它与其它机器的正常通讯。缺省是FALSE。<br />/proc/sys/net/ipv4/tcp_syn_retries<br />在内核放弃建立连接之前发送SYN包的数量。<br />/proc/sys/net/ipv4/tcp_synack_retries<br />为了打开对端的连接，内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。<br />/proc/sys/net/ipv4/tcp_timestamps<br />时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。<br />/proc/sys/net/ipv4/tcp_tw_recycle<br />能够更快地回收TIME-WAIT套接字。缺省值是1。除非有技术专家的建议和要求，否则不应修改。<br />/proc/sys/net/ipv4/tcp_window_scaling<br />一般来说TCP/IP允许窗口尺寸达到65535字节。对于速度确实很高的网络而言这个值可能还是太小。这个选项允许设置上G字节的窗口大小，有利于在带宽*延迟很大的环境中使用。<br />一旦内核认为它无法发包，就会丢弃这个包，并向发包的主机发送ICMP通知。<br />/proc/sys/net/ipv4/icmp_echo_ignore_all<br />根本不要响应echo包。请不要设置为缺省，它可能在你正被利用成为DoS攻击的跳板时可能有用。<br />/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts [Useful]<br />如果你ping子网的子网地址，所有的机器都应该予以回应。这可能成为非常好用的拒绝服务攻击工具。设置为1来忽略这些子网广播消息。<br />/proc/sys/net/ipv4/icmp_echoreply_rate<br />设置了向任意主机回应echo请求的比率。<br />/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses<br />设置它之后，可以忽略由网络中的那些声称回应地址是广播地址的主机生成的ICMP错误。<br />/proc/sys/net/ipv4/icmp_paramprob_rate<br />一个相对不很明确的ICMP消息，用来回应IP头或TCP头损坏的异常数据包。你可以通过这个文件控制消息的发送比率。<br /><br />================================================================<br /><br /> <a href="http://skylove.study-area.org/blog/2006/07/linuxip_29.html" target="_blank">http://skylove.study-area.org/blog/2006/07/linuxip_29.html</a><br /><br />tcp_syn_retries ：INTEGER<br />默认值是5<br />对
于一个新建连接，内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255，默认值是5，对应于180秒左右时间。(对于大负载而物理通信良好的
网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的)<br /><br />tcp_synack_retries ：INTEGER<br />默认值是5<br />对
于远端的连接请求SYN，内核会发送SYN ＋ ACK数据报，以确认收到上一个 SYN连接请求包。这是所谓的三次握手
( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。不应该大于255，默认值是
5，对应于180秒左右时间。(可以根据上面的 tcp_syn_retries 来决定这个值)<br /><br />tcp_keepalive_time ：INTEGER<br />默认值是7200(2小时)<br />当
keepalive打开的情况下，TCP发送keepalive消息的频率。(由于目前网络攻击等因素,造成了利用这个进行的攻击很频繁,曾经也有cu的
朋友提到过,说如果2边建立了连接,然后不发送任何数据或者rst/fin消息,那么持续的时间是不是就是2小时,空连接攻
击? tcp_keepalive_time就是预防此情形的.我个人在做nat服务的时候的修改值为1800秒)<br /><br />tcp_keepalive_probes：INTEGER<br />默认值是9<br />TCP发送keepalive探测以确定该连接已经断开的次数。(注意:保持连接仅在SO_KEEPALIVE套接字选项被打开是才发送.次数默认不需要修改,当然根据情形也可以适当地缩短此值.设置为5比较合适)<br /><br />tcp_keepalive_intvl：INTEGER<br />默认值为75<br />探
测消息发送的频率，乘以tcp_keepalive_probes就得到对于从开始探测以来没有响应的连接杀除的时间。默认值为75秒，也就是没有活动的
连接将在大约11分钟以后将被丢弃。(对于普通应用来说,这个值有一些偏大,可以根据需要改小.特别是web类服务器需要改小该值,15是个比较合适的
值)<br /><br />tcp_retries1 ：INTEGER<br />默认值是3<br />放弃回应一个TCP连接请求前﹐需要进行多少次重试。RFC 规定最低的数值是3﹐这也是默认值﹐根据RTO的值大约在3秒 - 8分钟之间。(注意:这个值同时还决定进入的syn连接)<br /><br />tcp_retries2 ：INTEGER<br />默认值为15<br />在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试。默认值为15，根据RTO的值来决定，相当于13-30分钟(RFC1122规定，必须大于100秒).(这个值根据目前的网络设置,可以适当地改小,我的网络内修改为了5)<br /><br />tcp_orphan_retries ：INTEGER<br />默认值是7<br />在近端丢弃TCP连接之前﹐要进行多少次重试。默认值是7个﹐相当于 50秒 - 16分钟﹐视 RTO 而定。如果您的系统是负载很大的web服务器﹐那么也许需要降低该值﹐这类 <span class="hilite1">socket</span>s 可能会耗费大量的资源。另外参的考 tcp_max_orphans 。(事实上做NAT的时候,降低该值也是好处显著的,我本人的网络环境中降低该值为3)<br /><br />tcp_fin_timeout ：INTEGER<br />默认值是 60<br />对于本端断开的<span class="hilite1">socket</span>连
接，TCP保持在FIN-WAIT-2状态的时间。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。默认值为 60 秒。过去在2.2版本的内
核中是 180 秒。您可以设置该值﹐但需要注意﹐如果您的机器为负载很重的web服务器﹐您可能要冒内存被大量无效数据报填满的风险﹐FIN-
WAIT-2 <span class="hilite1">socket</span>s 的危险性低于 FIN-WAIT-1 ﹐因为它们最多只吃 1.5K 的内存﹐但是它们存在时间更长。另外参考 tcp_max_orphans。(事实上做NAT的时候,降低该值也是好处显著的,我本人的网络环境中降低该值为30)<br /><br />tcp_max_tw_buckets ：INTEGER<br />默认值是180000<br />系 统在同时所处理的最大 timewait <span class="hilite1">socket</span>s 数目。如果超过此数的话﹐time-wait <span class="hilite1">socket</span> 会被立即砍除并且显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要人为的降低这个限制﹐不过﹐如果网络条件需要比默认值更多﹐则可以提高它(或许还要增加内存)。(事实上做NAT的时候最好可以适当地增加该值)<br /><br />tcp_tw_recycle ：BOOLEAN<br />默认值是0<br />打开快速 TIME-WAIT <span class="hilite1">socket</span>s 回收。除非得到技术专家的建议或要求﹐请不要随意修改这个值。(做NAT的时候，建议打开它)<br /><br /> <br /><br />tcp_tw_reuse：BOOLEAN<br />默认值是0<br />该文件表示是否允许重新应用处于TIME-WAIT状态的<span class="hilite1">socket</span>用于新的TCP连接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助)<br /><br />tcp_max_orphans ：INTEGER<br />缺省值是8192<br />系统所能处理不属于任何进程的TCP <span class="hilite1">socket</span>s
最大数量。假如超过这个数量﹐那么不属于任何进程的连接会被立即reset，并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单
的 DoS 攻击﹐千万不要依赖这个或是人为的降低这个限制(这个值Redhat AS版本中设置为32768,但是很多防火墙修改的时候,建议该值修改
为2000)<br /><br />tcp_abort_on_overflow ：BOOLEAN<br />缺省值是0<br />当守护进程太忙而不能接受新的连
接，就象对方发送reset消息，默认值是false。这意味着当溢出的原因是因为一个偶然的猝发，那么连接将恢复状态。只有在你确信守护进程真的不能完
成连接请求时才打开该选项，该选项会影响客户的使用。(对待已经满载的sendmail,apache这类服务的时候,这个可以很快让客户端终止连接,可
以给予服务程序处理已有连接的缓冲机会,所以很多防火墙上推荐打开它)<br /><br />tcp_syncookies ：BOOLEAN<br />默认值是0<br />只有在内核编译时选择了CONFIG_SYNCOOKIES时才会发生作用。当出现syn等候队列出现溢出时象对方发送syncookies。目的是为了防止syn flood攻击。<br />注意：该选项千万不能用于那些没有收到攻击的高负载服务器，如果在日志中出现synflood消息，但是调查发现没有收到synflood攻击，而是合法用户的连接负载过高的原因，你应该调整其它参数来提高服务器性能。参考:<br />tcp_max_syn_backlog<br />tcp_synack_retries<br />tcp_abort_on_overflow<br />syncookie
严重的违背TCP协议，不允许使用TCP扩展，可能对某些服务导致严重的性能影响(如SMTP转发)。(注意,该实现与BSD上面使用的
tcp proxy一样,是违反了RFC中关于tcp连接的三次握手实现的,但是对于防御syn-flood的确很有用.)<br /><br />tcp_stdurg ：BOOLEAN<br />默认值为0<br />使用 TCP urg pointer 字段中的主机请求解释功能。大部份的主机都使用老旧的 BSD解释，因此如果您在 Linux 打开它﹐或会导致不能和它们正确沟通。<br /><br /> <br /><br />tcp_max_syn_backlog ：INTEGER<br />对
于那些依然还未获得客户端确认的连接请求﹐需要保存在队列中最大数目。对于超过 128Mb 内存的系统﹐默认值是 1024 ﹐低于 128Mb 的则
为 128。如果服务器经常出现过载﹐可以尝试增加这个数字。警告﹗假如您将此值设为大于 1024﹐最好修改 include/net/tcp.h 里
面的 TCP_SYNQ_HSIZE ﹐以保持 TCP_SYNQ_HSIZE*16&lt;=tcp_max_syn_backlog ﹐并且编进核心
之内。(SYN Flood攻击利用TCP协议散布握手的缺陷，伪造虚假源IP地址发送大量TCP-SYN半打开连接到目标系统，最终导致目标系统<span class="hilite1">Socket</span>队
列资源耗 尽而无法接受新的连接。为了应付这种攻击，现代Unix系统中普遍采用多连接队列处理的方式来缓冲(而不是解决)这种攻击，是用一个基本队列处
理正常的完 全连接应用(Connect()和Accept() )，是用另一个队列单独存放半打开连接。这种双队列处理方式和其他一些系统内核措施(例
如Syn-Cookies/Caches)联合应用时，能够比较有效的缓解小规模的SYN Flood攻击(事实证明&lt;1000p/s)加大SYN
队列长度可以容纳更多等待连接的网络连接数，所以对Server来说可以考虑增大该值.)<br /><br />tcp_window_scaling ：INTEGER<br />缺省值为1<br />该 文
件表示设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值，为1时表示可变，为0时表示不可变。tcp/ip通常使用的窗口最大可达
到 65535 字节，对于高速网络，该值可能太小，这时候如果启用了该功能，可以使tcp/ip滑动窗口大小增大数个数量级，从而提高数据传输的能力
(RFC 1323)。（对普通地百M网络而言，关闭会降低开销，所以如果不是高速网络，可以考虑设置为0）<br /><br />tcp_timestamps ：BOOLEAN<br />缺省值为1<br />Timestamps 用
在其它一些东西中﹐可以防范那些伪造的 sequence 号码。一条1G的宽带线路或许会重遇到带 out-of-line数值的旧
sequence 号码(假如它是由于上次产生的)。Timestamp 会让它知道这是个 '旧封包'。(该文件表示是否启用以一种比超时重发更精确的
方法（RFC 1323）来启用对 RTT 的计算；为了实现更好的性能应该启用这个选项。)<br /><br />tcp_sack ：BOOLEAN<br />缺省值为1<br />使 用 Selective ACK﹐
它可以用来查找特定的遗失的数据报--- 因此有助于快速恢复状态。该文件表示是否启用有选择的应答
（Selective Acknowledgment），这可以通过有选择地应答乱序接收到的报文来提高性能（这样可以让发送者只发送丢失的报文
段）。(对于广域网通信来说这个选项应该启用，但是这会增加对 CPU 的占用。)<br /><br />tcp_fack ：BOOLEAN<br />缺省值为1<br />打开FACK拥塞避免和快速重传功能。(注意，当tcp_sack设置为0的时候，这个值即使设置为1也无效)<br /><br />tcp_dsack ：BOOLEAN<br />缺省值为1<br />允许TCP发送"两个完全相同"的SACK。<br /><br />tcp_ecn ：BOOLEAN<br />缺省值为0<br />打开TCP的直接拥塞通告功能。<br /><br />tcp_reordering ：INTEGER<br />默认值是3<br />TCP流中重排序的数据报最大数量 。 (一般有看到推荐把这个数值略微调整大一些,比如5)<br /><br />tcp_retrans_collapse ：BOOLEAN<br />缺省值为1<br />对于某些有bug的打印机提供针对其bug的兼容性。(一般不需要这个支持,可以关闭它)<br /><br />tcp_wmem(3个INTEGER变量)： min, default, max<br />min：为TCP <span class="hilite1">socket</span>预留用于发送缓冲的内存最小值。每个tcp <span class="hilite1">socket</span>都可以在建议以后都可以使用它。默认值为4096(4K)。<br /><br />default：为TCP <span class="hilite1">socket</span>预留用于发送缓冲的内存数量，默认情况下该值会影响其它协议使用的net.core.wmem_default 值，一般要低于net.core.wmem_default的值。默认值为16384(16K)。<br /><br />max: 用于TCP <span class="hilite1">socket</span>发
送缓冲的内存最大值。该值不会影响net.core.wmem_max，"静态"选择参数SO_SNDBUF则不受该值影响。默认值为
131072(128K)。（对于服务器而言，增加这个参数的值对于发送数据很有帮助,在我的网络环境中,修改为了
51200 131072 204800）<br /><br />tcp_rmem (3个INTEGER变量)： min, default, max<br />min：为TCP <span class="hilite1">socket</span>预留用于接收缓冲的内存数量，即使在内存出现紧张情况下tcp <span class="hilite1">socket</span>都至少会有这么多数量的内存用于接收缓冲，默认值为8K。<br /><br />default：为TCP <span class="hilite1">socket</span>预
留用于接收缓冲的内存数量，默认情况下该值影响其它协议使用的 net.core.wmem_default 值。该值决定了在
tcp_adv_win_scale、tcp_app_win和tcp_app_win=0默认值情况下，TCP窗口大小为65535。默认值为
87380<br /><br />max：用于TCP <span class="hilite1">socket</span>接收缓冲的内存最大值。该值不
会影响 net.core.wmem_max，"静态"选择参数 SO_SNDBUF则不受该值影响。默认值为 128K。默认值为
87380*2 bytes。（可以看出，.max的设置最好是default的两倍,对于NAT来说主要该增加它,我的网络里
为 51200 131072 204800）<br /><br />tcp_mem(3个INTEGER变量)：low, pressure, high<br />low：当TCP使用了低于该值的内存页面数时，TCP不会考虑释放内存。(理想情况下，这个值应与指定给 tcp_wmem 的第 2 个值相匹配 - 这第 2 个值表明，最大页面大小乘以最大并发请求数除以页大小 (131072 * 300 / 4096)。 )<br /><br />pressure：
当TCP使用了超过该值的内存页面数量时，TCP试图稳定其内存使用，进入pressure模式，当内存消耗低于low值时则退出pressure状
态。(理想情况下这个值应该是 TCP 可以使用的总缓冲区大小的最大值 (204800 * 300 / 4096)。 )<br /><br />high：允许所有tcp <span class="hilite1">socket</span>s
用于排队缓冲数据报的页面量。(如果超过这个值，TCP 连接将被拒绝，这就是为什么不要令其过于保守 (512000 * 300 / 4096) 的
原因了。 在这种情况下，提供的价值很大，它能处理很多连接，是所预期的 2.5 倍；或者使现有连接能够传输 2.5 倍的数据。 我的网络里为
192000 300000 732000)<br /><br />一般情况下这些值是在系统启动时根据系统内存数量计算得到的。<br /><br />tcp_app_win : INTEGER<br />默认值是31<br />保留max(window/2^tcp_app_win, mss)数量的窗口由于应用缓冲。当为0时表示不需要缓冲。<br /><br />tcp_adv_win_scale : INTEGER<br />默认值为2<br />计算缓冲开销bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale &gt; 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale &lt;= 0）。<br /><br /> <br /><br />tcp_rfc1337 :BOOLEAN<br />缺省值为0<br />这个开关可以启动对于在RFC1337中描述的"tcp 的time-wait暗杀危机"问题的修复。启用后，内核将丢弃那些发往time-wait状态TCP套接字的RST 包.<br /><br /> <br /><br />tcp_low_latency : BOOLEAN<br />缺省值为0<br />允许 TCP/IP 栈适应在高吞吐量情况下低延时的情况；这个选项一般情形是的禁用。(但在构建Beowulf 集群的时候,打开它很有帮助)<br /><br /> <br /><br />tcp_westwood :BOOLEAN<br />缺省值为0<br />启用发送者端的拥塞控制算法，它可以维护对吞吐量的评估，并试图对带宽的整体利用情况进行优化；对于 WAN 通信来说应该启用这个选项。<br /><br /> <br /><br />tcp_bic :BOOLEAN<br />缺省值为0<br />为快速长距离网络启用 Binary Increase Congestion；这样可以更好地利用以 GB 速度进行操作的链接；对于 WAN 通信应该启用这个选项。<br /><br /> <br /><br /> <br /><br /> <br /><br /># 以下一段为抵抗syn flood攻击，平时建议关闭<br /><br />sysctl -w net.ipv4.tcp_syncookies=1              # tcp syncookie，默认关闭<br /><br />sysctl -w net.ipv4.tcp_max_syn_backlog=1280   # syn队列，默认1024，&gt; 1280可能工作不稳定，需要修改内核源码参数<br /><br />sysctl -w net.ipv4.tcp_synack_retries=2             # syn-ack握手状态重试次数，默认5，遭受syn-flood攻击时改为1或2<br /><br />sysctl -w net.ipv4.tcp_syn_retries=2                  # 外向syn握手重试次数，默认4<br /><br /> <br /><br /> <br /><br /># 以下一段为应对tcp connect连接耗尽攻击，如果开启iptables connlimit模块可禁用<br /><br /># 有严重连接性能影响和不稳定因素，慎用<br /><br />sysctl -w tcp_tw_recycle=1                           # 默认0，tw快速回收<br /><br />sysctl -w tcp_tw_reuse=1                             # 默认0，tw重用<br /><br />sysctl -w tcp_keepalive_intvl=60                    # 默认75，tcp keeplive探测轮询时间<br /><br />sysctl -w tcp_keepalive_probes=3                  # 默认9，tcp keeplive探测轮询次数<br /><br />sysctl -w tcp_keepalive_time=1800                # 默认7200，tcp keeplive时间<br /><br />sysctl -w tcp_fin_timeout=30                        # 默认60，tcp fin状态超时时间<br /><br />#sysctl -w net.ipv4.tcp_retries1=2                     # tcp连接重传参数，慎用<br /><br />#sysctl -w net.ipv4.tcp_retries2=8<br /><br /> <br /><br />sysctl -w net.ipv4.ip_conntrack_max=65535          # 增大iptables状态跟踪表 <br /><br /><br />待验证：<br /> 1.（客户端问题）   <br />         包阻塞的情况多发生于缓冲区域充满了数据，客户端不再进行读取操作时。   <br />         这种情况下，可能是由于客户端的处理节奏慢于接受包的速度，可以考虑   <br />         将包处理过程放入线程处理，而对包的接受采用阻塞的方式。   <br />   2.（服务器端问题）   <br />         由于数据包头中部分变量的类型定义不合理而引起包的流水号越界或溢出，   <br />         都可能导致服务器端出现core文件或异常停止。建议如果有在包头中定义   <br />         流水号等，用long型变量。   <br />   3.（协议包问题）   <br />         在大数据量传输中，尽量减少网络资源的重复使用次数，所以在网络状况   <br />         佳的情况下，建议将原有的包体长度适当的扩大。如2k扩大到30k左右，   <br />         同时可以减少客户端的处理次数。<br /><br /><br /><img src ="http://www.blogjava.net/fine/aggbug/217709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2008-07-26 20:31 <a href="http://www.blogjava.net/fine/archive/2008/07/26/217709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle的Blob字段</title><link>http://www.blogjava.net/fine/archive/2008/05/31/204925.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Sat, 31 May 2008 11:53:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2008/05/31/204925.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/204925.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2008/05/31/204925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/204925.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/204925.html</trackback:ping><description><![CDATA[Oracle的Blob字段比较特殊，他比long字段的性能要好很多，可以用来保存例如图片之类的二进制数据。
<br /><br />写入Blob字段和写入其它类型字段的方式非常不同，因为Blob自身有一个cursor，你必须使用cursor对blob进行操作，因而你在写入Blob之前，必须获得cursor才能进行写入，那么如何获得Blob的cursor呢？
<br /><br />这需要你先插入一个empty的blob，这将创建一个blob的cursor，然后你再把这个empty的blob的cursor用select查询出来，这样通过两步操作，你就获得了blob的cursor，可以真正的写入blob数据了。
<br /><br />看下面的JDBC的demo，把oraclejdbc.jar这个二进制文件写入数据库表javatest的content字段(这是一个blob型字段)
<br /><br />[code:1]import java.sql.*;
<br />import java.io.*;
<br />import oracle.sql.*;
<br />public class WriteBlob {
<br /><br />  public static void main(String[] args) {
<br /><br />    try {
<br />      DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
<br />      Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","fankai","fankai");
<br />      conn.setAutoCommit(false);
<br /><br />      BLOB blob = null;
<br /><br />      PreparedStatement pstmt = conn.prepareStatement("insert into javatest(name,content) values(?,empty_blob())");
<br />      pstmt.setString(1,"fankai");
<br />      pstmt.executeUpdate();
<br />      pstmt.close();
<br /><br />      pstmt = conn.prepareStatement("select content from javatest where name= ? for update");
<br />      pstmt.setString(1,"fankai");
<br />      ResultSet rset = pstmt.executeQuery();
<br />      if (rset.next()) blob = (BLOB) rset.getBlob(1);
<br /><br />      String fileName = "oraclejdbc.jar";
<br />      File f = new File(fileName);
<br />      FileInputStream fin = new FileInputStream(f);
<br />      System.out.println("file size = " + fin.available());
<br /><br />      pstmt = conn.prepareStatement("update javatest set content=? where name=?");
<br /><br />      OutputStream out = blob.getBinaryOutputStream();
<br /><br />      int count = -1, total = 0;
<br />      byte[] data = new byte[(int)fin.available()];
<br />      fin.read(data);
<br />      out.write(data);
<br />      /*
<br />      byte[] data = new byte[blob.getBufferSize()];  另一种实现方法,节省内存
<br />      while ((count = fin.read(data)) != -1) {
<br />        total += count;
<br />        out.write(data, 0, count);
<br />      }
<br />      */
<br /><br />      fin.close();
<br />      out.close();
<br /><br />      pstmt.setBlob(1,blob);
<br />      pstmt.setString(2,"fankai");
<br /><br />      pstmt.executeUpdate();
<br />      pstmt.close();
<br /><br />      conn.commit();
<br />      conn.close();
<br />    } catch (SQLException e) {
<br />      System.err.println(e.getMessage());
<br />      e.printStackTrace();
<br />    } catch (IOException e) {
<br />      System.err.println(e.getMessage());
<br />    }
<br />  }
<br /><br />}[/code:1]
<br /><br /><br /><br />仔细看上例，分三步：
<br /><br />1、插入空blob
<br />into javatest(name,content) values(?,empty_blob());
<br /><br />2、获得blob的cursor
<br />select content from javatest where name= ? for update;
<br /><br />注意！！！必须加for update，这将锁定该行，直至该行被修改完毕，保证不产生并发冲突。
<br /><br />3、update javatest set content=? where name=
<br /><br />用cursor往数据库写数据
<br /><br />这里面还有一点要提醒大家：
<br /><br />JDK1.3带的JDBC2.0规范是不完善的，只有读Blob的接口，而没有写Blob的接口，JDK1.4带的JDBC3.0加入了写
Blob的接口。你可以使用JDBC3.0的接口，也可以直接使用Oracle的JDBC的API，我在上例中使用了Oracle的JDBC的API。
<br /><br />另外要注意的是：
<br /><br />java.sql.Blob
<br />oracle.sql.BLOB
<br /><br />注意看blob的大小写，是不一样的。写程序的时候不要搞混了。
<br /><br />下面看看用Hibernate怎么写，原理是一样的，也要分三步，但是代码简单很多
<br /><br />这是Cat对象定义
<br />[code:1]package com.fankai;
<br /><br />import java.sql.Blob;
<br /><br />public class Cat {
<br />  private String id;
<br />  private String name;
<br />  private char sex;
<br />  private float weight;
<br />  private Blob image;
<br />  public Cat() { }
<br /><br />  public String getId() { return id; }
<br />  public void setId(String id) { this.id = id; }
<br /><br />  public String getName() { return name; }
<br />  public void setName(String name) { this.name = name; }
<br /><br />  public char getSex() { return sex; }
<br />  public void setSex(char sex) { this.sex = sex; }
<br /><br />  public float getWeight() { return weight; }
<br />  public void setWeight(float weight) { this.weight = weight; }
<br /><br />  public Blob getImage() { return image; }
<br />  public void setImage(Blob image) { this.image = image;}
<br />}[/code:1]
<br /><br />这是Cat.hbm.xml
<br /><br />[code:1]&lt;?xml version="1.0"?&gt;
<br />&lt;!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"&gt;
<br /><br />&lt;hibernate-mapping&gt;
<br />    &lt;class name="com.fankai.Cat" table="cat"&gt;
<br />        &lt;!--jcs-cache usage="read-only"/--&gt;
<br />        &lt;id name="id" unsaved-value="null"&gt;
<br />            &lt;generator class="uuid.hex"/&gt;
<br />        &lt;/id&gt;
<br />        &lt;property name="name" length="16" not-null="true"/&gt;
<br />        &lt;property name="sex" length="1" not-null="true"/&gt;
<br />        &lt;property name="weight" /&gt;
<br />        &lt;property name="image" /&gt;
<br />    &lt;/class&gt;
<br />&lt;/hibernate-mapping&gt;[/code:1]
<br /><br /><br />下面是完整的用Hibernate写入Blob的例子，相比JDBC，已经简单轻松多了，也不用写那些Oracle特殊的sql了：
<br /><br />[code:1]package com.fankai;
<br /><br />import java.sql.Blob;
<br />import net.sf.hibernate.*;
<br />import oracle.sql.*;
<br />import java.io.*;
<br /><br />public class TestCatHibernate {  
<br />  public static void testBlob() {
<br />    Session s = null;    
<br />    byte[] buffer = new byte[1];
<br />    buffer[0] = 1;
<br />    try {
<br />      SessionFactory sf = HibernateSessionFactory.getSessionFactory();
<br />      s = sf.openSession();  
<br />      Transaction tx = s.beginTransaction();
<br />      Cat c = new Cat();
<br />      c.setName("Robbin");
<br />      c.setImage(Hibernate.createBlob(buffer));
<br />      s.save(c);
<br />      s.flush();
<br />      s.refresh(c, LockMode.UPGRADE);    
<br />      BLOB blob = (BLOB) c.getImage();      
<br />      OutputStream out = blob.getBinaryOutputStream();   
<br />      String fileName = "oraclejdbc.jar";
<br />      File f = new File(fileName);
<br />      FileInputStream fin = new FileInputStream(f);   
<br />      int count = -1, total = 0;
<br />      byte[] data = new byte[(int)fin.available()];
<br />      fin.read(data);
<br />      out.write(data);      
<br />      fin.close();
<br />      out.close();
<br />      s.flush();
<br />      tx.commit();
<br /><br />    } catch (Exception e) {
<br />      System.out.println(e.getMessage());
<br />    } finally {
<br />      if (s != null)
<br />        try {
<br />          s.close();
<br />        } catch (Exception e) {}
<br />    }    
<br /><br />  }
<br />}[/code:1]
    <img src ="http://www.blogjava.net/fine/aggbug/204925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2008-05-31 19:53 <a href="http://www.blogjava.net/fine/archive/2008/05/31/204925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>trs常见问题</title><link>http://www.blogjava.net/fine/archive/2008/05/30/204179.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Fri, 30 May 2008 12:27:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2008/05/30/204179.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/204179.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2008/05/30/204179.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/204179.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/204179.html</trackback:ping><description><![CDATA[
		<p>问题1: <br />        配置Javabeans时，出现错误信息"没有找到本地方法库:java.lang.UnsatisfiedLinkError"。 <br />错误原因: <br />trsbean.jar对应的本地方法库trsbean.dll或libtrsbean.so配置不正确。 <br />解决方法： <br />        1.确认安装介质在传输过程中没有损坏，如ftp传输需要使用二进制模式。 <br />        2.确认操作系统的版本和JDK的位数。 <br />           JavaBeans的位数必须和JDK的位数保持一致，如32位JDK必须使用32位JavaBeans。 <br />           JavaBeans的平台必须和JDK的平台保持一致。如AIX5.1平台的JavaBeans只支持AIX5.1/5.2/5.3，不支持AIX4.3或其它厂商的Unix。 <br />        3.注意libtrsbean.so的文件属性。 <br />           如HP平台，必须设置libtrsbean.sl的可执行权限。 <br />        4.注意trsbean.dll/libtrsbean.so的存放路径，应该包含在JAVA本地方法库的搜索路径。 <br />           Windows平台： <br />               JAVA本地方法库的搜索路径包含环境变量PATH和%JAVA_HOME%/jre/bin； <br />           Linux/Solaris平台： <br />               JAVA本地方法库的搜索路径包含环境变量LD_LIBRARY_PATH； <br />           AIX平台: <br />               JAVA本地方法库的搜索路径包含环境变量LIBPATH； <br />           HPUX平台: <br />               JAVA本地方法库的搜索路径包含环境变量SHLIB_PATH； <br />      <br />           JDK1.4以上版本，也可以在java启动参数中设置系统属性java.library.path, 指向libtrsbean.so所在的目录，如java -Djava.library.path="/home/trs/trsbean" <br /><br />           通常情况下，在应用服务器的启动脚本中指定本地方法库的搜索路径。            <br /><br />问题2: <br />       多套应用同时使用javabean，出现错误信息"java.lang.UnsatisfiedLinkError: Native Library trsbean.dll already loaded in another classloader"。 <br />错误原因： <br />       一个JAVA进程，JAVA本地方法库只能被加载一次，如果被多次加载就会出现该错误。 <br />解决方法： <br />        保证在一个JAVA虚拟机中，TRS Javabeans的本地方法库只被加载一次。 <br />如果应用服务器上的多个应用使用TRS JavaBeans，不能将trsbean.jar部署到每个应用下。 <br />        建议只保留一套TRS JavaBeans，在应用服务器中配置全局的trsbean.jar。 <br />以Tomcat4.1.36, Windows系统为例： <br />            将trsbean.jar放在%TOMCAT_HOME%/common/lib，或修改启动脚本中的CLASSPATH变量。 <br />            将trsbean.dll放在系统动态库的搜索路径。 <br /><br />问题3: <br />      为什么TRSConnection和TRSResultSet需要close? 能否将TRS对象放在WEB应用的Session中? <br />答案3: <br />      TRSConnection对应TRS连接, TRSResultSet对应TRS结果集，占用少量的Native内存。 <br />      如果程序不调用close方法关闭，会造成Native内存泄露，严重时导致java进程出现OutOfMemory错误。 <br />      如果将TRS对象放在Session中，WEB客户端快速翻页时会导致记录内容的不一致。 </p>
<img src ="http://www.blogjava.net/fine/aggbug/204179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2008-05-30 20:27 <a href="http://www.blogjava.net/fine/archive/2008/05/30/204179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>内存泄漏的检测</title><link>http://www.blogjava.net/fine/archive/2008/05/21/201830.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Wed, 21 May 2008 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2008/05/21/201830.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/201830.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2008/05/21/201830.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/201830.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/201830.html</trackback:ping><description><![CDATA[内存泄漏的检测

有不少工具辅助做这个事情的，如果手上一个工具也没有，可以用JDK自带的小工具：

看看谁占满了Heap？
用JDK6的jmap可以显示运行程序中对象的类型，个数与所占的大小
先用jps 找到进程号，然后jmap -histo pid 显示或 jmap -dump:file=heap_file_name pid 导出heap文件
为什么这些对象仍然可以到达？
用jhat(Java Heap Analysis Tool) 分析刚才导出的heap文件。
先jhat heap_file_name，然后打开浏览器http://localhost:7000/ 浏览。
<img src ="http://www.blogjava.net/fine/aggbug/201830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2008-05-21 09:44 <a href="http://www.blogjava.net/fine/archive/2008/05/21/201830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat 使用jconsole </title><link>http://www.blogjava.net/fine/archive/2008/03/14/186203.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Fri, 14 Mar 2008 02:23:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2008/03/14/186203.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/186203.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2008/03/14/186203.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/186203.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/186203.html</trackback:ping><description><![CDATA[
		<strong>关键字</strong>: <span class="hilite2">jconsole</span><div class="blog_content"><ul><li>catalina.bat:</li></ul><p>set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port="9004" -Dcom.sun.management.jmxremote.authenticate="false" -Dcom.sun.management.jmxremote.ssl="false"<br /> </p><ul><li><div>catalina.sh:</div></li></ul><p>JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9004 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"<br /><br /><br /><br /><br />linux下要设置<br />export  LANG=C     <br />C--对英文 ASCII 环境(不知道还有没有别的含义了)<br /></p></div><img src ="http://www.blogjava.net/fine/aggbug/186203.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2008-03-14 10:23 <a href="http://www.blogjava.net/fine/archive/2008/03/14/186203.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j 配置详细</title><link>http://www.blogjava.net/fine/archive/2008/01/28/178127.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Mon, 28 Jan 2008 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2008/01/28/178127.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/178127.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2008/01/28/178127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/178127.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/178127.html</trackback:ping><description><![CDATA[
		<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="color: rgb(0, 0, 0);">Log 日志包<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.consoleAppender</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">org.apache.log4j.ConsoleAppender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.logfile</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">org.apache.log4j.DailyRollingFileAppender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />ConsoleAppender，控制台输出<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />FileAppender，文件日志输出<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />SMTPAppender，发邮件输出日志<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />SocketAppender，Socket日志<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />NTEventLogAppender，Window NT日志<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />SyslogAppender，<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />JMSAppender，<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />AsyncAppender，<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />NullAppender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />文件输出：RollingFileAppender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.rootLogger</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">INFO,logfile<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.logfile</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">org.apache.log4j.RollingFileAppender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.logfile.Threshold</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">INFO  </span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">输出以上的INFO信息</span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="color: rgb(0, 0, 0);">log4j.appender.logfile.File</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">..</span>
				<span style="color: rgb(0, 0, 0);">/</span>
				<span style="color: rgb(0, 0, 0);">logs</span>
				<span style="color: rgb(0, 0, 0);">/</span>
				<span style="color: rgb(0, 0, 0);">INFO_log    </span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">保存log文件路径</span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="color: rgb(0, 0, 0);">log4j.appender.logfile.Append</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 255);">true</span>
				<span style="color: rgb(0, 0, 0);">  </span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">默认为true，添加到末尾，false在每次启动时进行覆盖</span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="color: rgb(0, 0, 0);">log4j.appender.logfile.MaxFileSize</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">10KB </span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">一个log文件的大小，超过这个大小就又会生成1个日志 </span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">KB ，MB，GB</span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="color: rgb(0, 0, 0);">log4j.appender.logfile.MaxBackupIndex</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">3</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">最多保存3个文件备份</span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="color: rgb(0, 0, 0);">log4j.appender.logfile.layout</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">org.apache.log4j.HTMLLayout </span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">输出文件的格式</span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="color: rgb(0, 0, 0);">log4j.appender.logfile.layout.LocationInfo</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 255);">true</span>
				<span style="color: rgb(0, 0, 0);"> #是否显示类名和行数<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.logfile.layout.Title</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">页面title  #html页面的</span>
				<span style="color: rgb(0, 0, 0);">&lt;</span>
				<span style="color: rgb(0, 0, 0);">title</span>
				<span style="color: rgb(0, 0, 0);">&gt;</span>
				<span style="color: rgb(0, 0, 0);">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />############################## SampleLayout ####################################<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /># log4j.appender.logfile.layout</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">org.apache.log4j.SampleLayout<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />############################## PatternLayout ###################################<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /># log4j.appender.logfile.layout</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">org.apache.log4j.PatternLayout<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /># log4j.appender.logfile.layout.ConversionPattern</span>
				<span style="color: rgb(0, 0, 0);">=%</span>
				<span style="color: rgb(0, 0, 0);">d </span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">p [</span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">c] </span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">m</span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">n </span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">d<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />############################## XMLLayout #######################################<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /># log4j.appender.logfile.layout</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">org.apache.log4j.XMLLayout<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /># log4j.appender.logfile.layout.LocationInfo</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 255);">true</span>
				<span style="color: rgb(0, 0, 0);"> #是否显示类名和行数<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />############################## TTCCLayout ######################################<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /># log4j.appender.logfile.layout</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">org.apache.log4j.TTCCLayout<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /># log4j.appender.logfile.layout.DateFormat</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">ISO8601<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#NULL, RELATIVE, ABSOLUTE, DATE or ISO8601.<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /># log4j.appender.logfile.layout.TimeZoneID</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">GMT</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">8</span>
				<span style="color: rgb(0, 0, 0);">:</span>
				<span style="color: rgb(0, 0, 0);">00</span>
				<span style="color: rgb(0, 0, 0);">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /># log4j.appender.logfile.layout.CategoryPrefixing</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 255);">false</span>
				<span style="color: rgb(0, 0, 0);"> ##默认为true 打印类别名<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /># log4j.appender.logfile.layout.ContextPrinting</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 255);">false</span>
				<span style="color: rgb(0, 0, 0);"> ##默认为true 打印上下文信息<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /># log4j.appender.logfile.layout.ThreadPrinting</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 255);">false</span>
				<span style="color: rgb(0, 0, 0);"> ##默认为true 打印线程名<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /># 打印信息如下：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="color: rgb(0, 0, 0);">2007</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">09</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">13</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 0);">14</span>
				<span style="color: rgb(0, 0, 0);">:</span>
				<span style="color: rgb(0, 0, 0);">45</span>
				<span style="color: rgb(0, 0, 0);">:</span>
				<span style="color: rgb(0, 0, 0);">39</span>
				<span style="color: rgb(0, 0, 0);">,</span>
				<span style="color: rgb(0, 0, 0);">765</span>
				<span style="color: rgb(0, 0, 0);"> [http</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">8080</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">1</span>
				<span style="color: rgb(0, 0, 0);">] ERROR com.poxool.test.test </span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);"> error成功关闭链接<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />###############################################################################<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />每天文件的输出：DailyRollingFileAppender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.rootLogger</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">INFO,errorlogfile<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.errorlogfile</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">org.apache.log4j.DailyRollingFileAppender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.errorlogfile.Threshold</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">ERROR<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.errorlogfile.File</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">..</span>
				<span style="color: rgb(0, 0, 0);">/</span>
				<span style="color: rgb(0, 0, 0);">logs</span>
				<span style="color: rgb(0, 0, 0);">/</span>
				<span style="color: rgb(0, 0, 0);">ERROR_log<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.errorlogfile.Append</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 255);">true</span>
				<span style="color: rgb(0, 0, 0);"> #默认为true，添加到末尾，false在每次启动时进行覆盖<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.errorlogfile.ImmediateFlush</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 255);">true</span>
				<span style="color: rgb(0, 0, 0);">  #直接输出，不进行缓存<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#</span>
				<span style="color: rgb(0, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">.</span>
				<span style="color: rgb(0, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">yyyy</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">MM: 每个月更新一个log日志<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#</span>
				<span style="color: rgb(0, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">.</span>
				<span style="color: rgb(0, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">yyyy</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">ww: 每个星期更新一个log日志<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#</span>
				<span style="color: rgb(0, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">.</span>
				<span style="color: rgb(0, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">yyyy</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">MM</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">dd: 每天更新一个log日志<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#</span>
				<span style="color: rgb(0, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">.</span>
				<span style="color: rgb(0, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">yyyy</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">MM</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">dd</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">a: 每天的午夜和正午更新一个log日志<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#</span>
				<span style="color: rgb(0, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">.</span>
				<span style="color: rgb(0, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">yyyy</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">MM</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">dd</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">HH: 每小时更新一个log日志<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#</span>
				<span style="color: rgb(0, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">.</span>
				<span style="color: rgb(0, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">yyyy</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">MM</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">dd</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">HH</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">mm: 每分钟更新一个log日志<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.errorlogfile.DatePattern</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">.</span>
				<span style="color: rgb(0, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">yyyy</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">MM</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">dd</span>
				<span style="color: rgb(0, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">.log</span>
				<span style="color: rgb(0, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);"> #文件名称的格式<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.errorlogfile.layout</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">org.apache.log4j.PatternLayout<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.errorlogfile.layout.ConversionPattern</span>
				<span style="color: rgb(0, 0, 0);">=%</span>
				<span style="color: rgb(0, 0, 0);">d </span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">p [</span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">c] </span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">m</span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">n </span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">d<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />控制台输出：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.rootLogger</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">INFO,consoleAppender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.consoleAppender</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">org.apache.log4j.ConsoleAppender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.consoleAppender.Threshold</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">ERROR<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.consoleAppender.layout</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">org.apache.log4j.PatternLayout<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.consoleAppender.layout.ConversionPattern</span>
				<span style="color: rgb(0, 0, 0);">=%</span>
				<span style="color: rgb(0, 0, 0);">d </span>
				<span style="color: rgb(0, 0, 0);">%-</span>
				<span style="color: rgb(0, 0, 0);">5p </span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">m</span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">n<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.consoleAppender.ImmediateFlush</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 255);">true</span>
				<span style="color: rgb(0, 0, 0);">  </span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">直接输出，不进行缓存</span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="color: rgb(0, 0, 0);">log4j.appender.consoleAppender.Target</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">System.err </span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">默认是System.out方式输出</span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="color: rgb(0, 0, 0);">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />发送邮件：SMTPAppender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.rootLogger</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">INFO,MAIL<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.MAIL</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">org.apache.log4j.net.SMTPAppender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.MAIL.Threshold</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">DEBUG<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.MAIL.BufferSize</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">10KB<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.MAIL.From</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">yu77585211111@</span>
				<span style="color: rgb(0, 0, 0);">163</span>
				<span style="color: rgb(0, 0, 0);">.com<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.MAIL.SMTPHost</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">mail.myce.net.cn<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.MAIL.Subject</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">Log4J Message<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.MAIL.To</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">yuyongpeng@myce.net.cn<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.MAIL.layout</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">org.apache.log4j.PatternLayout<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.MAIL.layout.ConversionPattern</span>
				<span style="color: rgb(0, 0, 0);">=%</span>
				<span style="color: rgb(0, 0, 0);">d </span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">c </span>
				<span style="color: rgb(0, 0, 0);">-%-</span>
				<span style="color: rgb(0, 0, 0);">4r [</span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">t] </span>
				<span style="color: rgb(0, 0, 0);">%-</span>
				<span style="color: rgb(0, 0, 0);">5p </span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">c </span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">x </span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">m</span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">n<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />数据库：JDBCAppender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.DATABASE</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">org.apache.log4j.jdbc.JDBCAppender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.DATABASE.URL</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">jdbc:oracle:thin:@</span>
				<span style="color: rgb(0, 0, 0);">210.51</span>
				<span style="color: rgb(0, 0, 0);">.</span>
				<span style="color: rgb(0, 0, 0);">173.94</span>
				<span style="color: rgb(0, 0, 0);">:</span>
				<span style="color: rgb(0, 0, 0);">1521</span>
				<span style="color: rgb(0, 0, 0);">:YDB<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.DATABASE.driver</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">oracle.jdbc.driver.OracleDriver<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.DATABASE.user</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">ydbuser<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.DATABASE.password</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">ydbuser<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.DATABASE.sql</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">INSERT INTO A1 (TITLE3) VALUES (</span>
				<span style="color: rgb(0, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);"> %d - %c %-5p %c %x - %m%n</span>
				<span style="color: rgb(0, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.DATABASE.layout</span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">org.apache.log4j.PatternLayout<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.DATABASE.layout.ConversionPattern</span>
				<span style="color: rgb(0, 0, 0);">=%</span>
				<span style="color: rgb(0, 0, 0);">d </span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">c </span>
				<span style="color: rgb(0, 0, 0);">-%-</span>
				<span style="color: rgb(0, 0, 0);">4r [</span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">t] </span>
				<span style="color: rgb(0, 0, 0);">%-</span>
				<span style="color: rgb(0, 0, 0);">5p </span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">c </span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">x </span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">m</span>
				<span style="color: rgb(0, 0, 0);">%</span>
				<span style="color: rgb(0, 0, 0);">n<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span> <span style="color: rgb(0, 128, 0);"> </span><span style="color: rgb(0, 128, 0);"></span></div>
<img src ="http://www.blogjava.net/fine/aggbug/178127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2008-01-28 10:04 <a href="http://www.blogjava.net/fine/archive/2008/01/28/178127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM内存参数调优(看到的比较好的文章，顺便收集一下)</title><link>http://www.blogjava.net/fine/archive/2008/01/14/175190.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Mon, 14 Jan 2008 05:55:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2008/01/14/175190.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/175190.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2008/01/14/175190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/175190.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/175190.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JVM														内存参数调优												我们前面所提到的堆内存（heap）是由Java虚拟机控制管理的，因此，这些参数对JVM而言都有一个默认值，但在某些情况下这些参数的默认值并不是最优的，这就需要我们通过调整这些参数的值来提高JVM的性能，最终提高应用的性能指标。								在实际的应用开发中，如果应用所使用的系统内存较大...&nbsp;&nbsp;<a href='http://www.blogjava.net/fine/archive/2008/01/14/175190.html'>阅读全文</a><img src ="http://www.blogjava.net/fine/aggbug/175190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2008-01-14 13:55 <a href="http://www.blogjava.net/fine/archive/2008/01/14/175190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache+tomcat集群实践</title><link>http://www.blogjava.net/fine/archive/2007/12/18/168554.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Tue, 18 Dec 2007 10:09:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2007/12/18/168554.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/168554.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2007/12/18/168554.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/168554.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/168554.html</trackback:ping><description><![CDATA[
		<p>
				<span id="zoom">
				</span>
		</p>
		<div>
				<p>(一)环境说明<br />(1)服务器有4台，一台安装apache,三台安装tomcat<br />(2)apache2.0.55、tomcat5.5.15、jk2.0.4、jdk1.5.6或jdk1.4.2<br />(3)ip配置,一台安装apache的ip为192.168.0.88,三台安装tomcat的服务器ip分别为192.168.0.1/2/4<br />(二)安装过程<br />(1)在三台要安装tomcat的服务器上先安装jdk<br />(2)配置jdk的安装路径,在环境变量path中加入jdk的bin路径,新建环境变量JAVA_HOME指向jdk的安装路径<br />(3)在三台要安装tomcat的服务器上分别安装tomcat,调试三个tomcat到能够正常启动<br />(4)tomcat的默认WEB服务端口是8080,默认的模式是单独服务,我的三个tomcat的WEB服务端口修改为7080/8888/9999<br />修改位置为tomcat的安装目录下的conf/server.xml<br />修改前的配置为<br />    &lt;Connector port="8080" maxHttpHeaderSize="8192"<br />               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />               enableLookups="false" redirectPort="8443" acceptCount="100"<br />               connectionTimeout="20000" disableUploadTimeout="true" /&gt;<br />修改后的配置为<br />    &lt;Connector port="7080" maxHttpHeaderSize="8192"<br />               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />               enableLookups="false" redirectPort="8443" acceptCount="100"<br />               connectionTimeout="20000" disableUploadTimeout="true" /&gt;<br />依次修改每个tomcat的监听端口(7080/8888/9999)<br /><br />(5)分别测试每个tomcat的启动是否正常<br />http://192.168.0.1:7080<br />http://192.168.0.2:8888<br />http://192.168.0.4:9999<br />(三)负载均衡配置过程<br />(1)在那台要安装apache的服务器上安装apache2.0.55,我的安装路径为默认C:\Program Files\Apache Group\Apache2<br />(2)安装后测试apache能否正常启动，调试到能够正常启动http://192.168.0.88<br />(3)下载jk2.0.4后解压缩文件<br />(4)将解压缩后的目录中的modules目录中的mod_jk2.so文件复制到apache的安装目录下的modules目录中,我的为C:\Program Files\Apache Group\Apache2\modules<br />(5)修改apache的安装目录中的conf目录的配置文件httpd.conf，在文件中加LoadModule模块配置信息的最后加上一句LoadModule jk2_module modules/mod_jk2.so<br />(6)分别修改三个tomcat的配置文件conf/server.xml，修改内容如下<br />修改前<br />    &lt;!-- An Engine represents the entry point (within Catalina) that processes<br />         every request.  The Engine implementation for Tomcat stand alone<br />         analyzes the HTTP headers included with the request, and passes them<br />         on to the appropriate Host (virtual host). --&gt;<br /><br />    &lt;!-- You should set jvmRoute to support load-balancing via AJP ie :<br />    &lt;Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1"&gt;         <br />    --&gt; <br />         <br />    &lt;!-- Define the top level container in our container hierarchy --&gt;<br />    &lt;Engine name="Catalina" defaultHost="localhost"&gt;<br />修改后<br />    &lt;!-- An Engine represents the entry point (within Catalina) that processes<br />         every request.  The Engine implementation for Tomcat stand alone<br />         analyzes the HTTP headers included with the request, and passes them<br />         on to the appropriate Host (virtual host). --&gt;<br /><br />    &lt;!-- You should set jvmRoute to support load-balancing via AJP ie :--&gt;<br />    &lt;Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat1"&gt;         <br />     <br />         <br />    &lt;!-- Define the top level container in our container hierarchy <br />    &lt;Engine name="Catalina" defaultHost="localhost"&gt;<br />    --&gt;<br />将其中的jvmRoute="jvm1"分别修改为jvmRoute="tomcat1"和jvmRoute="tomcat2"和jvmRoute="tomcat3"<br /><br />(7)然后重启三个tomcat，调试能够正常启动。<br />(8)在apache的安装目录中的conf目录下创建文件workers2.propertie，写入文件内容如下<br /><br /># fine the communication channel <br />[channel.socket:192.168.0.1:8009] <br />info=Ajp13 forwarding over socket<br />#配置第一个服务器 <br />tomcatId=tomcat1 #要和tomcat的配置文件server.xml中的jvmRoute="tomcat1"名称一致<br />debug=0 <br />lb_factor=1 #负载平衡因子，数字越大请求被分配的几率越高<br /><br /># Define the communication channel <br />[channel.socket:192.168.0.2:8009] <br />info=Ajp13 forwarding over socket<br />tomcatId=tomcat2 <br />debug=0 <br />lb_factor=1 <br /><br /># Define the communication channel <br />[channel.socket:192.168.0.4:8009] <br />info=Ajp13 forwarding over socket<br />tomcatId=tomcat3 <br />debug=0 <br />lb_factor=1 <br /><br />[status:] <br />info=Status worker, displays runtime information.  <br /><br />[uri:/jkstatus.jsp] <br />info=Display status information and checks the config file for changes. <br />group=status: <br /><br />[uri:/*] <br />info=Map the whole webapp <br />debug=0<br />(9)在三个tomcat的安装目录中的webapps建立相同的应用,我和应用目录名为TomcatDemo,在三个应用目录中建立相同 WEB-INF目录和页面index.jsp,index.jsp的页面内容如下<br />&lt;%@ page contentType="text/html; charset=GBK" %&gt;<br />&lt;%@ page import="java.util.*" %&gt;<br />&lt;html&gt;&lt;head&gt;&lt;title&gt;Cluster App Test&lt;/title&gt;&lt;/head&gt;<br />&lt;body&gt;<br />Server Info:<br />&lt;%<br />out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"&lt;br&gt;");%&gt;<br />&lt;%<br />  out.println("&lt;br&gt; ID " + session.getId()+"&lt;br&gt;");<br /><br />  // 如果有新的 Session 属性设置<br />  String dataName = request.getParameter("dataName");<br />  if (dataName != null &amp;&amp; dataName.length() &gt; 0) {<br />     String dataValue = request.getParameter("dataValue");<br />     session.setAttribute(dataName, dataValue);<br />  }<br /><br />  out.print("&lt;b&gt;Session 列表&lt;/b&gt;");<br /><br />  Enumeration e = session.getAttributeNames();<br />  while (e.hasMoreElements()) {<br />     String name = (String)e.nextElement();<br />     String value = session.getAttribute(name).toString();<br />     out.println( name + " = " + value+"&lt;br&gt;");<br />         System.out.println( name + " = " + value);<br />   }<br />%&gt;<br />  &lt;form action="index.jsp" method="POST"&gt;<br />    名称:&lt;input type=text size=20 name="dataName"&gt;<br />     &lt;br&gt;<br />    值:&lt;input type=text size=20 name="dataValue"&gt;<br />     &lt;br&gt;<br />    &lt;input type=submit&gt;<br />   &lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br />(10)重启apache服务器和三个tomcat服务器,到此负载 均衡已配置完成。测试负载均衡先测试apache,访问http://192.168.0.88/jkstatus.jsp<br />能否正常访问，并查询其中的内容，有三个tomcat的相关配置信息和负载说明,访问http://192.168.0.88/TomcatDemo/index.jsp看能够运行,<br />能运行，则已建立负载均衡。<br />(四)tomcat集群配置<br />(1)负载均衡配置的条件下配置tomcat集群<br />(2)分别修改三个tomcat的配置文件conf/server.xml,修改内容如下<br />修改前<br />        &lt;!-- <br />        &lt;Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"<br />                 managerClassName="org.apache.catalina.cluster.session.DeltaManager"<br />                 expireSessionsOnShutdown="false"<br />                 useDirtyFlag="true"<br />                 notifyListenersOnReplication="true"&gt;<br /><br />            &lt;Membership <br />                className="org.apache.catalina.cluster.mcast.McastService"<br />                mcastAddr="228.0.0.4"<br />                mcastPort="45564"<br />                mcastFrequency="500"<br />                mcastDropTime="3000"/&gt;<br /><br />            &lt;Receiver <br />                className="org.apache.catalina.cluster.tcp.ReplicationListener"<br />                tcpListenAddress="auto"<br />                tcpListenPort="4001"<br />                tcpSelectorTimeout="100"<br />                tcpThreadCount="6"/&gt;<br /><br />            &lt;Sender<br />                className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"<br />                replicationMode="pooled"<br />                ackTimeout="5000"/&gt;<br /><br />            &lt;Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"<br />                   filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/&gt;<br />                   <br />            &lt;Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"<br />                      tempDir="/tmp/war-temp/"<br />                      deployDir="/tmp/war-deploy/"<br />                      watchDir="/tmp/war-listen/"<br />                      watchEnabled="false"/&gt;<br />                      <br />            &lt;ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/&gt;<br />        &lt;/Cluster&gt;<br />        --&gt;   <br />修改后<br />        &lt;!-- modify by whh --&gt;<br />        &lt;Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"<br />                 managerClassName="org.apache.catalina.cluster.session.DeltaManager"<br />                 expireSessionsOnShutdown="false"<br />                 useDirtyFlag="true"<br />                 notifyListenersOnReplication="true"&gt;<br /><br />            &lt;Membership <br />                className="org.apache.catalina.cluster.mcast.McastService"<br />                mcastAddr="228.0.0.4"<br />                mcastPort="45564"<br />                mcastFrequency="500"<br />                mcastDropTime="3000"/&gt;<br /><br />            &lt;Receiver <br />                className="org.apache.catalina.cluster.tcp.ReplicationListener"<br />                tcpListenAddress="auto"<br />                tcpListenPort="4001"<br />                tcpSelectorTimeout="100"<br />                tcpThreadCount="6"/&gt;<br /><br />            &lt;Sender<br />                className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"<br />                replicationMode="pooled"<br />                ackTimeout="5000"/&gt;<br /><br />            &lt;Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"<br />                   filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/&gt;<br />                   <br />            &lt;Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"<br />                      tempDir="/tmp/war-temp/"<br />                      deployDir="/tmp/war-deploy/"<br />                      watchDir="/tmp/war-listen/"<br />                      watchEnabled="false"/&gt;<br />                      <br />            &lt;ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/&gt;<br />        &lt;/Cluster&gt;<br />       &lt;!-- modify by whh --&gt;       <br />将集群配置选项的注释放开即可，如上。<br />(3)重启三个tomcat。到此tomcat的集群已配置完成。</p>
				<p> </p>
				<p>(五)应用配置<br />对于要进行负载和集群的的tomcat目录下的webapps中的应用中的WEB-INF中的web.xml文件要添加如下一句配置<br />&lt;distributable/&gt;<br />配置前<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"&gt;<br />  &lt;display-name&gt;TomcatDemo&lt;/display-name&gt;<br />&lt;/web-app&gt;<br />配置后<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"&gt;<br />  &lt;display-name&gt;TomcatDemo&lt;/display-name&gt;<br />   &lt;distributable/&gt;<br />&lt;/web-app&gt;<br /><!-- the post be hidden --></p>
				<p>问:tomcat集群是怎么处理session的阿</p>
				<p>答:在tomcat做集群之后，每个tomcat之间自动根据tomcat的配置文件中的参数进行session复制,<br />对于一个客户端对说，只要是同一个IP，那它每次上传的sessionID就是一样的。 <!-- the post be hidden --></p>
		</div>
		<script type="text/javascript">
				<!--
google_ad_client = "pub-4719823006842312";
//728x15, 创建于 07-11-14
google_ad_slot = "7316259153";
google_ad_width = 650;
google_ad_height = 15;
//-->
		</script>
		<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
		</script>
<img src ="http://www.blogjava.net/fine/aggbug/168554.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2007-12-18 18:09 <a href="http://www.blogjava.net/fine/archive/2007/12/18/168554.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache-Weblogic bridge安装与配置</title><link>http://www.blogjava.net/fine/archive/2007/12/18/168454.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Tue, 18 Dec 2007 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2007/12/18/168454.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/168454.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2007/12/18/168454.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/168454.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/168454.html</trackback:ping><description><![CDATA[
		<p>       配置说明：<br />1. 检查Apache HTTP Server是否支持Dynamic Shared Object(DSO)；在命令行执行如下命令：<br /> Apache_Home/bin/apache –l 或Apache_Home/bin/httpd –l<br />若结果列表中有mod_so.c,在说明支持DSO，否则需要加入如下选项重新编译Apache：<br />   …<br />   --enable-module=so<br />   --enable-rule=SHARED_CORE<br />   …<br />2. 定位.so文件,并将其copy到Apache_Home/modules下。</p>
		<p align="left">3. 修改Apache_Home/conf/httpd.conf，加入如下代码：<br />3.1  LoadModule weblogic_module modules/mod_wl_20.so<br />3.2  新增一个IfModule定义，对于non-clustered WebLogic Server包括WebLogicHost与WebLogicPort参数；对于Weblogic Server Cluster包括WebLogicCluster参数；<br />例：&lt;IfModule mod_weblogic.c&gt;<br />      WebLogicHost 127.0.0.1<br />      WebLogicPort 7001<br />   &lt;/IfModule&gt;<br />   &lt;IfModule mod_weblogic.c&gt;<br />      WebLogicCluster 192.168.0.1：7001,192.168.0.2:7001<br />   &lt;/IfModule&gt;<br />3.3  对于proxy requests by MIME type，可以在IfMoudle中增加参数MatchExpression,可以有多个；<br />例：&lt;IfModule mod_weblogic.c&gt;<br />      WebLogicHost 127.0.0.1<br />      WebLogicPort 7001<br />MatchExpression *.jsp<br />MatchExpression *.do<br />   &lt;/IfModule&gt;<br />3.4  对于proxying requests by path，可以新增一个Location的定义, 参数SetHandler用于指定Apache HTTP server plug-in的模式；<br />例：&lt;Location /web&gt;<br />SetHandler weblogic-handler<br />WebLogicHost 192.168.70.78<br />WebLogicPort 7001<br />&lt;/Location&gt;<br />4. 重启BEA Weblogic Server；<br />5. 重启Apache HTTP Server；<br />6. 打开IE，输入设定的server name，出现系统的登录页面，则说明配置成功。<br />7. 对于后期新增的Weblogic server实例，只需要在httpd.conf增加一个Location定义即可，需要包括参数SetHandler, WebLogicHost, WebLogicPort;</p>
<img src ="http://www.blogjava.net/fine/aggbug/168454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2007-12-18 13:14 <a href="http://www.blogjava.net/fine/archive/2007/12/18/168454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IBM SOA  一  (SCA)</title><link>http://www.blogjava.net/fine/archive/2007/11/22/162275.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Thu, 22 Nov 2007 01:43:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2007/11/22/162275.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/162275.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2007/11/22/162275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/162275.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/162275.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">SCA</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">（<span lang="EN-US">Service Component Architecture</span>）编程模型<span lang="EN-US"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">1).</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">使用服务组件的客户端可以选择使用<span lang="EN-US">WSDL</span>接口或<span lang="EN-US">Java</span>接口。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<span style="mso-spacerun: yes">       </span>
				</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">服务组件提供给别的服务调用的入口叫<span lang="EN-US">Interface</span>（接口）。而服务组件本身可能也需要调用别的服务，这个调用出口叫<span lang="EN-US">Reference</span>（引用）。无论是接口还是引用，其调用规范都是<span lang="EN-US">WSDL</span>或<span lang="EN-US">Java</span>接口。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">2).SCA</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">服务组件与传统组件的主要区别在于：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">1</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">． 服务组件往往是粗粒度的，而传统组件以细粒度居多。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">2</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">． 服务组件的接口是标准的，主要是<span lang="EN-US">WSDL</span>接口，而传统组件常以具体<span lang="EN-US">API</span>形式出现。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">3</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">． 服务组件的实现与语言是无关的，而传统组件常绑定某种特定的语言。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">4</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">． 服务组件可以通过组件容器提供<span lang="EN-US">QoS</span>的服务，而传统组件完全由程序代码直接控制。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">3).</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">服务模块（<span lang="EN-US">Module</span>）<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">服务模块（简称模块）由一个或多个具有内在业务联系的服务组件构成。把多少服务组件放在一个模块中，或者把哪些服务组件放在一起主要取决于业务需求和部署上灵活性的要求<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">4).</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">导入（<span lang="EN-US">Import</span>）和导出（<span lang="EN-US">Export</span>）<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">两个特殊的<span lang="EN-US">"</span>端点<span lang="EN-US">"</span>，一个是导入（<span lang="EN-US">Import</span>），它的作用是使得模块中的服务组件可以调用模块外部的服务。另一个是导出（<span lang="EN-US">Export</span>），它的作用是使得模块外部的应用可以调用模块中的服务组件。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">导入端点提供了四种绑定方式，包括：<span lang="EN-US">JMS</span>绑定，<span lang="EN-US">Web Service</span>绑定，<span lang="EN-US">SCA</span>绑定和无状态会话<span lang="EN-US">BEAN</span>的绑定。导出端点提供了三种绑定方式，包括：<span lang="EN-US">JMS</span>绑定，<span lang="EN-US">Web Service</span>绑定和<span lang="EN-US">SCA</span>绑定。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">5).</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">共享库（<span lang="EN-US">Library</span>）<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">共享库包含的内容只有：数据定义，接口定义，数据映射和关系。与模块最大的区别使共享库不包含服务组件，因此也就不包含业务逻辑<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">6).Standalone Reference<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">模块中的服务组件是不能直接被外部<span lang="EN-US">Java</span>代码使用的，<span lang="EN-US">Standalone Reference(</span>端点<span lang="EN-US">)</span>就是为了让外部的<span lang="EN-US">Java</span>代码能够使用模块中的服务组件。这个端点只有引用（<span lang="EN-US">Reference</span>），而没有接口（<span lang="EN-US">Interface</span>）。这个引用可以调用相应的服务组件。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">7).</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">同步调用和异步调用<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">面对是基于粗粒度的服务组件，面对的是一些需要比较长时间才能有响应的应用场景，那么我们就需要一种非阻塞式调用方式，即异步调用方式。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">SCA</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">编程模式提供了三种方式的异步调用，它们分别是：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">1</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">． 单向调用方式。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">2</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">． 延迟响应方式。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">3</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">． 请求回调方式。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">8).SCA</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">客户端的两种调用方式<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">从接口的角度，<span lang="EN-US">SCA</span>的客户端编程模型有两种方式：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">1</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">． 静态调用方式<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">2</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">． 动态调用方式<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">9).</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">接口类型与调用方式<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">实际上客户端采用哪种调用方式是与接口类型有密切的关系。当提供的接口类型是<span lang="EN-US">WSDL</span>类型的，那么客户端的调用方式只能是动态调用方式。由于<span lang="EN-US">WSDL</span>是<span lang="EN-US">SCA</span>模型中主要的接口方式，这样就导致动态调用方式在<span lang="EN-US">SCA</span>编程模型中非常普遍。但是如果提供的接口类型时<span lang="EN-US">Java</span>类型的，那么客户端的调用方式可以是动态调用方式，也可以是静态调用方式。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
<img src ="http://www.blogjava.net/fine/aggbug/162275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2007-11-22 09:43 <a href="http://www.blogjava.net/fine/archive/2007/11/22/162275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2中的ValueStack</title><link>http://www.blogjava.net/fine/archive/2007/08/31/141770.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Fri, 31 Aug 2007 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2007/08/31/141770.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/141770.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2007/08/31/141770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/141770.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/141770.html</trackback:ping><description><![CDATA[Struts2中的ValueStack<br />&lt;%<br /> Enumeration em = request.getAttributeNames();<br /> while(em.hasMoreElements()){<br />  Object obj = em.nextElement();<br />  if(obj.equals("struts.valueStack")){<br />   ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack");<br />   System.out.println(vs.findValue("username"));<br />   System.out.println(vs.findValue("password"));<br />   System.out.println(vs.findValue("[0].username"));<br />   System.out.println(vs.findValue("[0].password"));<br />   vs.toString();<br />  }<br /> }<br /> %&gt;<br />哈哈，原来Struts2在视图里是这样子拿到值的呀<img src ="http://www.blogjava.net/fine/aggbug/141770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2007-08-31 16:40 <a href="http://www.blogjava.net/fine/archive/2007/08/31/141770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>The Life Cycle of a JavaServer Faces Page </title><link>http://www.blogjava.net/fine/archive/2007/08/02/133897.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Thu, 02 Aug 2007 00:45:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2007/08/02/133897.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/133897.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2007/08/02/133897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/133897.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/133897.html</trackback:ping><description><![CDATA[Restore View Phase <br />Apply Request Values Phase<br />Process Validations Phase <br />Update Model Values Phase <br />Invoke Application Phase <br />Render Response Phase <br /><img height="349" alt="JavaServer Faces Standard Request-Response Lifecycle" hspace="0" src="file:///E:/doc/javaee-5-doc-tutorial-1.0_03/javaeetutorial5/doc/images/jsfIntro-lifecycle.gif" width="574" border="0" /><br />JavaServer Faces Standard Request-Response Life Cycle <img src ="http://www.blogjava.net/fine/aggbug/133897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2007-08-02 08:45 <a href="http://www.blogjava.net/fine/archive/2007/08/02/133897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebLogic.xml</title><link>http://www.blogjava.net/fine/archive/2007/06/26/126370.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Tue, 26 Jun 2007 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2007/06/26/126370.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/126370.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2007/06/26/126370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/126370.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/126370.html</trackback:ping><description><![CDATA[
		<div style="MARGIN-TOP: 10px; MARGIN-LEFT: 15px; OVERFLOW: auto">
				<table width="100%">
						<tbody>
								<tr>
										<td>
												<font face="Arial">
														<p>
																<font face="Arial">让WebLogic先识别该应用的包：</font>
														</p>
														<p>
																<font face="Arial">修改的方式就是在自己的应用中WEB-INF中新建weblogic.xml文件</font>
														</p>
														<p>
																<font face="Arial">&lt;!--CTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dt--&gt;</font>
														</p>
														<font face="Arial">
																<div class="code_title">xml 代码</div>
																<div class="bar">
																</div>
																<div class="dp-highlighter">
																		<ol class="dp-xml">
																				<li class="alt">
																						<span>
																								<span>&lt;!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd"</span>
																								<span class="tag">&gt;</span>
																								<span>  </span>
																						</span>
																				</li>
																				<li class="">
																						<span>  </span>
																				</li>
																				<li class="alt">
																						<span>
																						</span>
																						<span class="tag">&lt;</span>
																						<span class="tag-name">weblogic-web-app</span>
																						<span class="tag">&gt;</span>
																						<span>  </span>
																				</li>
																				<li class="">
																						<span>  </span>
																						<span class="tag">&lt;</span>
																						<span class="tag-name">jsp-descriptor</span>
																						<span class="tag">&gt;</span>
																						<span>  </span>
																				</li>
																				<li class="alt">
																						<span>    </span>
																						<span class="tag">&lt;</span>
																						<span class="tag-name">jsp-param</span>
																						<span class="tag">&gt;</span>
																						<span>  </span>
																				</li>
																				<li class="">
																						<span>      </span>
																						<span class="tag">&lt;</span>
																						<span class="tag-name">param-name</span>
																						<span class="tag">&gt;</span>
																						<span>pageCheckSeconds</span>
																						<span class="tag">&lt;/</span>
																						<span class="tag-name">param-name</span>
																						<span class="tag">&gt;</span>
																						<span>  </span>
																				</li>
																				<li class="alt">
																						<span>      </span>
																						<span class="tag">&lt;</span>
																						<span class="tag-name">param-value</span>
																						<span class="tag">&gt;</span>
																						<span>0</span>
																						<span class="tag">&lt;/</span>
																						<span class="tag-name">param-value</span>
																						<span class="tag">&gt;</span>
																						<span>  </span>
																				</li>
																				<li class="">
																						<span>    </span>
																						<span class="tag">&lt;/</span>
																						<span class="tag-name">jsp-param</span>
																						<span class="tag">&gt;</span>
																						<span>  </span>
																				</li>
																				<li class="alt">
																						<span>    </span>
																						<span class="tag">&lt;</span>
																						<span class="tag-name">jsp-param</span>
																						<span class="tag">&gt;</span>
																						<span>  </span>
																				</li>
																				<li class="">
																						<span>      </span>
																						<span class="tag">&lt;</span>
																						<span class="tag-name">param-name</span>
																						<span class="tag">&gt;</span>
																						<span>encoding</span>
																						<span class="tag">&lt;/</span>
																						<span class="tag-name">param-name</span>
																						<span class="tag">&gt;</span>
																						<span>  </span>
																				</li>
																				<li class="alt">
																						<span>      </span>
																						<span class="tag">&lt;</span>
																						<span class="tag-name">param-value</span>
																						<span class="tag">&gt;</span>
																						<span>UTF-8</span>
																						<span class="tag">&lt;/</span>
																						<span class="tag-name">param-value</span>
																						<span class="tag">&gt;</span>
																						<span>  </span>
																				</li>
																				<li class="">
																						<span>    </span>
																						<span class="tag">&lt;/</span>
																						<span class="tag-name">jsp-param</span>
																						<span class="tag">&gt;</span>
																						<span>  </span>
																				</li>
																				<li class="alt">
																						<span>  </span>
																						<span class="tag">&lt;/</span>
																						<span class="tag-name">jsp-descriptor</span>
																						<span class="tag">&gt;</span>
																						<span>  </span>
																				</li>
																				<li class="">
																						<span>  </span>
																						<span class="tag">&lt;</span>
																						<span class="tag-name">container-descriptor</span>
																						<span class="tag">&gt;</span>
																						<span class="comments">&lt;!-- using web based class load order --&gt;</span>
																						<span>  </span>
																				</li>
																				<li class="alt">
																						<span>    </span>
																						<span class="tag">&lt;</span>
																						<span class="tag-name">prefer-web-inf-classes</span>
																						<span class="tag">&gt;</span>
																						<span>true</span>
																						<span class="tag">&lt;/</span>
																						<span class="tag-name">prefer-web-inf-classes</span>
																						<span class="tag">&gt;</span>
																						<span>  </span>
																				</li>
																				<li class="">
																						<span>  </span>
																						<span class="tag">&lt;/</span>
																						<span class="tag-name">container-descriptor</span>
																						<span class="tag">&gt;</span>
																						<span>  </span>
																				</li>
																				<li class="alt">
																						<span>
																						</span>
																						<span class="tag">&lt;/</span>
																						<span class="tag-name">weblogic-web-app</span>
																						<span class="tag">&gt;</span>
																						<span>  </span>
																				</li>
																		</ol>
																</div>
																<p class="alt">
																		<br />     &lt;charset-params&gt;<br />      &lt;input-charset&gt;<br />        &lt;resource-path&gt;/&lt;/resource-path&gt;<br />        &lt;java-charset-name&gt;GBK&lt;/java-charset-name&gt;<br />      &lt;/input-charset&gt;<br />     &lt;/charset-params&gt;<br /> &lt;jsp-descriptor&gt;      <br /> &lt;jsp-param&gt;<br /> &lt;param-name&gt;compilerSupportsEncoding&lt;/param-name&gt;<br /> &lt;param-value&gt;true&lt;/param-value&gt;<br /> &lt;/jsp-param&gt;<br /> &lt;/jsp-descriptor&gt;</p>
														</font>
												</font>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
		<p>
				<span class="tag-name">
				</span> </p>
<img src ="http://www.blogjava.net/fine/aggbug/126370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2007-06-26 16:44 <a href="http://www.blogjava.net/fine/archive/2007/06/26/126370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebLogic 8.1集群配置及应用总结(转) </title><link>http://www.blogjava.net/fine/archive/2007/06/19/125120.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Tue, 19 Jun 2007 06:46:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2007/06/19/125120.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/125120.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2007/06/19/125120.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/125120.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/125120.html</trackback:ping><description><![CDATA[
		<strong>WebLogic 8.1集群配置及应用总结(转)    </strong>
		<span class="oblog_text">
		</span>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<br />
								</td>
						</tr>
				</tbody>
		</table>
		<span class="oblog_text">
				<p>1、基本概念总结<br />a. 什么是Domain和Server<br />    Domain是WebLogic Server实例的基本管理单元。所谓Domain就是，由配置为Administrator Server的WebLogic Server实例管理的逻辑单元，这个单元是有所有相关资源的集合。<br />    Server是一个相对独立的，为实现某些特定功能而结合在一起的单元。<br />b. Domain and Server的关系<br />一个Domain 可以包含一个或多个WebLogic Server实例，甚至是Server集群。一个Domain中有一个且只能有一个Server 担任管理Server的功能，其它的Server具体实现一个特定的逻辑功能。</p>
				<p>c. WebLogic集群的体系结构<br />   1. 单层混合型的集群架构<br />    这种架构将所有的Web应用以及相关的服务应用全部置于集群中的单一WLS实例中，这种架构的优势在于：<br />   &gt;&gt; 易于管理<br />   &gt;&gt; 灵活的负载平衡机制<br />   &gt;&gt; 更强的安全控制<br />   2. 多层结构的集群架构<br />    这种架构使用两个WLS集群，一个放置表静态内容和集群Servlet，另一个放置集群EJB。一般应用于下面这些情况：<br />   &gt;&gt; 在负载平衡机制需要调用集群EJB中的方法时；<br />   &gt;&gt; 在提供内容与提供对象的服务之间需要更大的机动性时；<br />   &gt;&gt; 在需要更高的系统稳定性时；</p>
				<p>d. 配置集群应用的必要条件<br />   1. 集群中的所有Server必须位于同一网段，并且必须是IP广播(UDP)可到达的<br />   2. 集群中的所有Server必须使用相同的版本,包括Service Pack<br />   3. 集群中的Server必须使用永久的静态IP地址。动态IP地址分配不能用于集群环境。如果服务器位于防火墙后面，而客户机位于防火墙外面，那么服务器必须有公共的静态IP地址，只有这样，客户端才能访问服务器<br />   4. 要以CLUSTER方式运行，必须有包含CLUSTER许可的LICENSE才行.</p>
				<p>2、集群配置总结<br />a. 配置集群可以在新建域(Domain)的时候进行，也可以在一个现有的域的基础上进行<br />b. 在没有集群的环境下，新建一个域时可以将管理服务器(Admin Server)作为事务处理服务器使用，否则管理服务器应该指向集群的Admin Server所在的机器。<br />c. 启动Managed Server的方法有两种，一种是以命令行的方式，即: startManagedWebLoigc managedserver <a href="http://adminserver_address/">http://adminserver_address/</a>；第二种是在WebLogic管理控制台中启动此时必须先启动NodeManager，并且在一台机器上的多个Server只需要启一个 NodeManager实例。两种启动方式下Weblogic的后台输出是不一样的，前者输出到控制台窗口，后者输出到ModeManager目录下的日志文件中，一个Server一个日志文件。<br />d. 必须通过HttpClusterServlet实现集群的自动请求转发，也就是说必须创建一个Server作为代理服务器(proxy Server)。<br />   在代理服务器上部署缺省的Web应用，该应用的WEB-INF目录包括下两个文件，其中web.xml内容如下：<br /> &lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;<br /> &lt;web-app id="WebApp_ID"&gt;<br />     &lt;display-name&gt;NJGS Web Application&lt;/display-name&gt;<br />     <br />     &lt;servlet&gt;<br />      &lt;servlet-name&gt;HttpClusterServlet&lt;/servlet-name&gt;<br />      &lt;servlet-class&gt;<br />            weblogic.servlet.proxy.HttpClusterServlet<br />      &lt;/servlet-class&gt;<br />      &lt;init-param&gt;<br />          &lt;param-name&gt;WebLogicCluster&lt;/param-name&gt;<br />          &lt;param-value&gt;<br />            localhost:7011|localhost:7012|localhost:7013<br />          &lt;/param-value&gt;<br />      &lt;/init-param&gt;<br />      <br />      &lt;init-param&gt;<br />    &lt;param-name&gt;DebugConfigInfo&lt;/param-name&gt;<br />    &lt;param-value&gt;ON&lt;/param-value&gt;<br />      &lt;/init-param&gt;</p>
				<p>     &lt;/servlet&gt;<br />     <br />     &lt;servlet-mapping&gt;<br />       &lt;servlet-name&gt;HttpClusterServlet&lt;/servlet-name&gt;<br />       &lt;url-pattern&gt;/&lt;/url-pattern&gt;<br />     &lt;/servlet-mapping&gt;<br />     <br />      &lt;servlet-mapping&gt;<br />       &lt;servlet-name&gt;HttpClusterServlet&lt;/servlet-name&gt;<br />       &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />     &lt;/servlet-mapping&gt;<br />     <br />     <br />     &lt;servlet-mapping&gt;<br />       &lt;servlet-name&gt;HttpClusterServlet&lt;/servlet-name&gt;<br />       &lt;url-pattern&gt;*.html&lt;/url-pattern&gt;<br />     &lt;/servlet-mapping&gt;<br />     <br />      &lt;servlet-mapping&gt;<br />       &lt;servlet-name&gt;HttpClusterServlet&lt;/servlet-name&gt;<br />       &lt;url-pattern&gt;*.htm&lt;/url-pattern&gt;<br />     &lt;/servlet-mapping&gt;<br />   <br />&lt;/web-app&gt;<br /> <br />   weblogic.xml文件的内容如下： <br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "<a href="http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd</a>"&gt;<br />&lt;weblogic-web-app&gt;<br /> &lt;context-root&gt;/&lt;/context-root&gt;<br />&lt;/weblogic-web-app&gt;<br />注意上述context-root的内容必须为 /</p>
				<p>e. Web应用向集群上部署时，必须选择部署到整个集群或者集群中的某些服务器，Http请求的转发由代理服务器自动处理。<br />f. 可以写个简单的页面，并且用JMeter模拟上百个请求同时访问该页面以 测试集群功能。请求的格式为 <a href="http://proxyserver_address/">http://proxyserver_address/</a>应用名/测试jps页面<br /><br />E:\bea\user_projects\domains\mydomain&gt;startmanagedweblogic managed2 <a href="http://IP:7001">http://IP:7001</a></p>
				<p>cd </p>
				<p>startweblogic</p>
				<p>startmanagedweblogic managed2 <a href="http://IP:7001">http://IP:7001</a><br /></p>
		</span>
<img src ="http://www.blogjava.net/fine/aggbug/125120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2007-06-19 14:46 <a href="http://www.blogjava.net/fine/archive/2007/06/19/125120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>maven</title><link>http://www.blogjava.net/fine/archive/2007/06/12/123661.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Tue, 12 Jun 2007 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2007/06/12/123661.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/123661.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2007/06/12/123661.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/123661.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/123661.html</trackback:ping><description><![CDATA[
		<pre>
				<a href="http://maven.apache.org/plugins/index.html">http://maven.apache.org/plugins/index.html</a>
				<br />mvn archetype:create<br />   <br /><br /><br /><br /><pre>mvn archetype:create 
  -DgroupId=[your project's group id]
  -DartifactId=[your project's artifact id]
  -DarchetypeArtifactId=maven-archetype-quickstart<br /><pre>mvn archetype:create 
  -DgroupId=[your project's group id]
  -DartifactId=[your project's artifact id]
  -DarchetypeArtifactId=maven-archetype-j2ee-simple<br /><pre>mvn archetype:create 
  -DgroupId=[your project's group id]
  -DartifactId=[your project's artifact id]
  -DarchetypeArtifactId=maven-archetype-webapp<br /><pre>mvn archetype:create 
  -DgroupId=[your project's group id]
  -DartifactId=[your project's artifact id]
  -DarchetypeArtifactId=maven-archetype-site-simple<br /><pre>mvn archetype:create 
  -DgroupId=[your project's group id]
  -DartifactId=[your project's artifact id]
  -DarchetypeArtifactId=maven-archetype-site<br /><br /><pre>mvn archetype:create 
  -DgroupId=[your project's group id]
  -DartifactId=[your project's artifact id]
  -DarchetypeArtifactId=maven-archetype-portlet<br /><pre>mvn archetype:create 
  -DgroupId=[your project's group id]
  -DartifactId=[your project's artifact id]
  -DarchetypeArtifactId=maven-archetype-mojo<br /><pre>mvn archetype:create 
  -DgroupId=[your project's group id]
  -DartifactId=[your project's artifact id]
  -DarchetypeArtifactId=maven-archetype-archetype</pre></pre></pre></pre></pre></pre></pre></pre></pre>
<img src ="http://www.blogjava.net/fine/aggbug/123661.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2007-06-12 16:58 <a href="http://www.blogjava.net/fine/archive/2007/06/12/123661.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IntelliJ IDEA  性能调整</title><link>http://www.blogjava.net/fine/archive/2007/05/28/120420.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Mon, 28 May 2007 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2007/05/28/120420.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/120420.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2007/05/28/120420.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/120420.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/120420.html</trackback:ping><description><![CDATA[
		<table height="20" cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="ContentParaTitle">
										<strong>IntelliJ IDEA 性能调整</strong>
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="700" border="0">
				<tbody>
						<tr>
								<td class="ContentPara">
										<p>IDEA 6.0已经发布，好多人抱怨反应速度慢，内存消耗大。IDEA 6.0增加了不少新特性，程序也更大，内存占用肯定也会提高。在这篇文章我们想探讨一下这方面的问题，通过相关的设置，让你的IDEA快起来，更稳定。<br />     IntelliJ IDEA是Java程序，所以性能调整因从JVM和程序两方面考虑。对于JVM的调整，可能个人看法都不一样，这样我们给出一个推荐方案，然后给你做一说明，你也可以在此基础上做更个性的修改。下面的截图是根据“IDEA VM Options”插件做的，该插件可以修改idea.exe.vmoptions文件内容，即使升级版本也不用担心。 <br />     打开设置面板，选择“IDEA VM Options”，按照下图然后输入以下参数： </p>
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" bgcolor="#999999" border="0">
				<tbody>
						<tr>
								<td class="imageTable">
										<img src="http://www.jetmaven.net/contents/documents/p_image/p_ij_jvm_parameters.png" />
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="700" border="0">
				<tbody>
						<tr>
								<td class="ContentPara">
										<p>-Xms256m<br />-Xmx384m<br />-XX:MaxPermSize=128m<br />-XX:NewRatio=4<br />-Xss128k<br />-Dsun.awt.keepWorkingSetOnMinimize=true<br />-server<br />下面我们做一些解释： -Xms256m设置初时的内存数，你需要设置一个合理的值， 增加该值可以提高Java程序的启动速度。如果你的内存够大，如2G，可以设置到400m。<br />-Xmx384m设置最大内存数，提高该值，可以减少内存Garage收集的频率，提高程序性能。<br />-Dsun.awt.keepWorkingSetOnMinimize=true可以让IDEA最小化到任务栏时依然保持以占有的内存，当你重新回到IDEA，能够被快速显示，而不是由灰白的界面逐渐显现整个界面，加快回复到原界面的速度。<br />-server控制内存garage方式，这样你无需在花一到两分钟等待内存garage的收集。<br /><br />     接下来就是IDEA程序的设置，我们建议采用下图的设置： </p>
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" bgcolor="#999999" border="0">
				<tbody>
						<tr>
								<td class="imageTable">
										<img src="http://www.jetmaven.net/contents/documents/p_image/p_ij_application_parameter.png" />
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="700" border="0">
				<tbody>
						<tr>
								<td class="ContentPara">
										<p>取消“Synchronize file on frame activation”和“Save files on frame deactivation”的选择。在IDEA中，采用多线程读写文件，但线程写，而且磁盘读写非常耗费时间，所以我们建议取消这两个选项，否则在IDEA和其他程序切换时，你会发现磁盘操作比较频繁。同时我们选择“Save files automatically”，并将其设置为30秒，这样IDEA依然可以自动保持文件。做以上的设置，可能有一点不方便。如我们编辑一个jsp文件，然后切换到浏览器刷新，获得最新的信息。但是在切换到浏览器时，IDEA将不会自动保存，所有信息不是最新的。所以在每次切换时，你需要按下Ctrl+S，保存文件。这样你需要了解哪些文件被更改了，给这些文件一个标识。 在IDEA中，你需要做以下设置, 这样被修改的文件会以*号标识出来，你可以及时保存相关的文件。 </p>
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" bgcolor="#999999" border="0">
				<tbody>
						<tr>
								<td class="imageTable">
										<img src="http://www.jetmaven.net/contents/documents/p_image/p_ij_modified_mark.png" />
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="700" border="0">
				<tbody>
						<tr>
								<td class="ContentPara">
										<p>
												<strong>总结：</strong>通过以上的设置，我们相信会提高IDEA的性能。当然这不表示IDEA的默认配置是错误的，就如同数据库软件一样，提供了一个标准的配置，具体的一些性能调整可能要根据实际情况确定。</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/fine/aggbug/120420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2007-05-28 11:32 <a href="http://www.blogjava.net/fine/archive/2007/05/28/120420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JProfiler</title><link>http://www.blogjava.net/fine/archive/2007/05/07/115671.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Mon, 07 May 2007 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2007/05/07/115671.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/115671.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2007/05/07/115671.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/115671.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/115671.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JProfiler.v4.2.2+注册机		2006年12月16日 星期六 21:53																																										JProfiler是一个全功能的Java剖析工具（profiler），专用於分析J2SE和J2EE应用程式。它把CPU、线程和记忆体的剖析组合在一个强大的应用中。JProfiler可提供许多IDE整合和...&nbsp;&nbsp;<a href='http://www.blogjava.net/fine/archive/2007/05/07/115671.html'>阅读全文</a><img src ="http://www.blogjava.net/fine/aggbug/115671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2007-05-07 10:57 <a href="http://www.blogjava.net/fine/archive/2007/05/07/115671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache+tomcat配置负载均衡</title><link>http://www.blogjava.net/fine/archive/2007/04/05/108752.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Thu, 05 Apr 2007 09:50:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2007/04/05/108752.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/108752.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2007/04/05/108752.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/108752.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/108752.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 0， 环境说明												       Apache  :apache_2.0.55     1 个						       Tomcat:  apache-tomcat-5.5.17 (zip版) 2个						       mod_jk:: mod_jk-apache-2.0.55.so  1个														第一部分：负载均衡						...&nbsp;&nbsp;<a href='http://www.blogjava.net/fine/archive/2007/04/05/108752.html'>阅读全文</a><img src ="http://www.blogjava.net/fine/aggbug/108752.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2007-04-05 17:50 <a href="http://www.blogjava.net/fine/archive/2007/04/05/108752.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache和Tomcat整合</title><link>http://www.blogjava.net/fine/archive/2007/04/05/108728.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Thu, 05 Apr 2007 08:31:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2007/04/05/108728.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/108728.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2007/04/05/108728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/108728.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/108728.html</trackback:ping><description><![CDATA[Apache和Tomcat连接的方法大致有JK1.x， JK2， mod_webapp三种connector可以使用，下面简单说明一下<br />  Apache2.0.50 + Tomcat5.0.29 ＋ mod_jk2的连接方法，环境为windows XP
<p>1、下载：<br />       apache2.0.50从<a href="http://apache.org/">http://apache.org</a>下载<br />       tomcat5.0.28从<a href="http://jakarta.apache.org/">http://jakarta.apache.org</a>下载<br />       module_jk2从<a href="http://jakarta.apache.org/">http://jakarta.apache.org</a>下载</p><br /><p>2<br />      Apache到D:\Apache Group\Apache2<br />      Tomcat到E:\work\jakarta-tomcat-5.0.28<br />      module文件为jakarta-tomcat-connectors-jk2.0.4-win32-apache2.0.49.zip 解压缩，将modules/mod_jk2.so拷贝到<br />     D:\Apache Group\Apache2\modules下，conf/workers2.properties.sample拷贝到D:\Apache Group\Apache2\conf下，<br />     并改名为worker1.properties<br />3、修改D:\Apache Group\Apache2\conf\httpd.conf，增加<br />     LoadModule jk2_module "modules/mod_jk2.so" <br />     JkSet config.file "conf/workers2.properties"<br />    <br />    Apache配置完毕，重新启动Apache<br />4、tomcat默认支持ajp1.3的jk2连接，所以只需要配置apache就可以，剩下的就是将需要访问的目录增加到<br />     worker2.properties就可以了，默认为<br />[shm]<br />info=Scoreboard. Requried for reconfiguration and status with multiprocess servers.<br />file=anon</p><p># Defines a load balancer named lb. Use even if you only have one machine.<br />[lb:lb]</p><p># Example socket channel, override port and host.<br />[channel.socket:localhost:8009]<br />port=8009<br />host=127.0.0.1</p><p># define the worker<br />[ajp13:localhost:8009]<br />channel=channel.socket:localhost:8009<br />group=lb</p><p># Map the Tomcat examples webapp to the Web server uri space<br />[uri:/examples/*]<br />group=lb</p><p>[status:]<br />info=Status worker, displays runtime information</p><p>[uri:/jkstatus/*]<br />info=The Tomcat /jkstatus handler<br />group=status:<br />[shm]<br />info=Scoreboard. Requried for reconfiguration and status with multiprocess servers.<br />file=D:/Apache Group/Apache2/logs/jk2.shm<br />size=1048576</p><p>需要修改一下apache的默认目录，然后我增加了两个目录/servlets-examples和/axis，得到如下</p><p># Defines a load balancer named lb. Use even if you only have one machine.<br />[lb:lb]</p><p># Example socket channel, override port and host.<br />[channel.socket:localhost:8009]<br />port=8009<br />host=localhost</p><p># define the worker<br />[ajp13:localhost:8009]<br />channel=channel.socket:localhost:8009<br />group=lb</p><p># Map the Tomcat examples webapp to the Web server uri space<br />[uri:/jsp-examples/*]<br />group=lb<br />[uri:/bbs/*]<br />group=lb<br />[uri:/servlets-examples/*]<br />group=lb<br />[uri:/axis/*]<br />group=lb<br />[status:]<br />info=Status worker, displays runtime information</p><p>[uri:/jkstatus/*]<br />info=The Tomcat /jkstatus handler<br />group=status:</p><p>[uri:/*.jsp]<br />worker=ajp13:localhost:8009<br />     <br />重新启动apache,tomcat<br />访问<br /><a href="http://localhost/jkstatus/">http://localhost/jkstatus/</a><br /><a href="http://localhost/servlets-examples/">http://localhost/servlets-examples/</a><br /><a href="http://localhost/axis/">http://localhost/axis/</a><br /><a href="http://localhost:8080/servlets-examples/">http://localhost:8080/servlets-examples/</a><br /><a href="http://localhost:8080/axis">http://localhost:8080/axis</a><br />看一下结果，如果还要增加新的目录，只要照上面操作即可</p><img src ="http://www.blogjava.net/fine/aggbug/108728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2007-04-05 16:31 <a href="http://www.blogjava.net/fine/archive/2007/04/05/108728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaBean中Property命名不规范出现了问题</title><link>http://www.blogjava.net/fine/archive/2007/03/16/104294.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Fri, 16 Mar 2007 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2007/03/16/104294.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/104294.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2007/03/16/104294.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/104294.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/104294.html</trackback:ping><description><![CDATA[
		<p>JavaBean中Property命名不规范出现了问题：<br />public class StockGuessInfo {</p>
		<p> private String SN;</p>
		<p> private String A_NUM;<br /> public String getA_NUM() {<br />  return A_NUM;<br /> }</p>
		<p> public void setA_NUM(String a_num) {<br />  A_NUM = a_num;<br /> }<br />｝<br /><br /><font color="#000080">这段代码用Apache的Common中的Util反射就得不到预期的结果<br />&lt;bean:write name="stockGuessActionForm" property="A_NUM" /&gt;   出现错误<br />&lt;bean:write name="stockGuessActionForm" property="a_NUM" /&gt;   可以得到结果<br /><br />//Apache的Common中的Util要求javaBean中Property变量要求两个字母要大写都大写，小写都小写，否则反射失败<br />NAME   成功<br />Name   失败<br />NaME   失败</font><br /><br /><br /><br />＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br /><br />    public static BeanInfo getBeanInfo(Class&lt;?&gt; beanClass)<br /> throws IntrospectionException<br />    {<br /> if (!ReflectUtil.isPackageAccessible(beanClass)) {<br />     return (new Introspector(beanClass, null, USE_ALL_BEANINFO)).<font color="#ff0000">getBeanInfo</font>();<br /> }<br />...................<br />    }   <br />    private BeanInfo getBeanInfo() throws IntrospectionException {<br /> ..........</p>
		<p> PropertyDescriptor pds[] = <font color="#ff0000">getTargetPropertyInfo</font>();</p>
		<p> ......... <br />    }</p>
		<p> private PropertyDescriptor[] getTargetPropertyInfo() {<br /> ..........<br /> if{<br /> ............<br /> }else {</p>
		<p>     // Apply some reflection to the current class.</p>
		<p>     // First get an array of all the public methods at this level<br />     Method methodList[] = getPublicDeclaredMethods(beanClass);</p>
		<p>     // Now analyze each method.<br />     for (int i = 0; i &lt; methodList.length; i++) {<br />         Method method = methodList[i];<br />  if (method == null) {<br />      continue;<br />  }<br />         // skip static methods.<br />  int mods = method.getModifiers();<br />  if (Modifier.isStatic(mods)) {<br />      continue;<br />  }<br />         String name = method.getName();<br />         Class argTypes[] = method.getParameterTypes();<br />         Class resultType = method.getReturnType();<br />  int argCount = argTypes.length;<br />  PropertyDescriptor pd = null;</p>
		<p>  if (name.length() &lt;= 3 &amp;&amp; !name.startsWith(IS_PREFIX)) {<br />      // Optimization. Don't bother with invalid propertyNames.<br />      continue;<br />  }</p>
		<p>  try {</p>
		<p>             if (argCount == 0) {<br />          if (name.startsWith(GET_PREFIX)) {<br />              // Simple getter<br />============================文问题就出现在这里 decapitalize(name.substring(3)=========<br /><br />    pd = new <font color="#ff0000">PropertyDescriptor(decapitalize</font>(name.substring(3)),<br />      method, null);      <br />                 } else if (resultType == boolean.class &amp;&amp; name.startsWith(IS_PREFIX)) {<br />              // Boolean getter<br />                     pd = new PropertyDescriptor(decapitalize(name.substring(2)),<br />      method, null);<br />          }<br />............................................<br />   }</p>
		<p>   }</p>
		<p> public static String <font color="#ff0000">decapitalize</font>(String name) {<br /> if (name == null || name.length() == 0) {<br />     return name;<br /> }<br /> if (name.length() &gt; 1 &amp;&amp; Character.isUpperCase(name.charAt(1)) &amp;&amp;<br />   Character.isUpperCase(name.charAt(0))){<br />     return name;<br /> }<br /> char chars[] = name.toCharArray();<br /> chars[0] = Character.toLowerCase(chars[0]);<br /> return new String(chars);<br />    }<br /><font color="#ff0000">// pd = new PropertyDescriptor(decapitalize(name.substring(3)),<br />//就是在这里了decapitalize(name)中要求Property变量要求两个字母要大写都大写，小写都小写，否则反射失败<br />，否则反射失败</font></p>
<img src ="http://www.blogjava.net/fine/aggbug/104294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2007-03-16 16:20 <a href="http://www.blogjava.net/fine/archive/2007/03/16/104294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jsp验证码的使用</title><link>http://www.blogjava.net/fine/archive/2007/03/13/103545.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Tue, 13 Mar 2007 07:42:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2007/03/13/103545.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/103545.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2007/03/13/103545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/103545.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/103545.html</trackback:ping><description><![CDATA[
		<p>------------产生验证码图片的文件-----image.jsp-------------------------------------------</p>
		<p>&lt;%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %&gt;<br />&lt;%!<br />Color getRandColor(int fc,int bc){//给定范围获得随机颜色<br />        Random random = new Random();<br />        if(fc&gt;255) fc=255;<br />        if(bc&gt;255) bc=255;<br />        int r=fc+random.nextInt(bc-fc);<br />        int g=fc+random.nextInt(bc-fc);<br />        int b=fc+random.nextInt(bc-fc);<br />        return new Color(r,g,b);<br />        }<br />%&gt;<br />&lt;%<br />//设置页面不缓存<br />response.setHeader("Pragma","No-cache");<br />response.setHeader("Cache-Control","no-cache");<br />response.setDateHeader("Expires", 0);</p>
		<p>// 在内存中创建图象<br />int width=60, height=20;<br />BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);</p>
		<p>// 获取图形上下文<br />Graphics g = image.getGraphics();</p>
		<p>//生成随机类<br />Random random = new Random();</p>
		<p>// 设定背景色<br />g.setColor(getRandColor(200,250));<br />g.fillRect(0, 0, width, height);</p>
		<p>//设定字体<br />g.setFont(new Font("Times New Roman",Font.PLAIN,18));</p>
		<p>//画边框<br />//g.setColor(new Color());<br />//g.drawRect(0,0,width-1,height-1);</p>
		<p>
				<br />// 随机产生155条干扰线，使图象中的认证码不易被其它程序探测到<br />g.setColor(getRandColor(160,200));<br />for (int i=0;i&lt;155;i++)<br />{<br />        int x = random.nextInt(width);<br />        int y = random.nextInt(height);<br />        int xl = random.nextInt(12);<br />        int yl = random.nextInt(12);<br />        g.drawLine(x,y,x+xl,y+yl);<br />}</p>
		<p>// 取随机产生的认证码(4位数字)<br />String sRand="";<br />for (int i=0;i&lt;4;i++){<br />    String rand=String.valueOf(random.nextInt(10));<br />    sRand+=rand;<br />    // 将认证码显示到图象中<br />    g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同，可能是因为种子太接近，所以只能直接生成<br />    g.drawString(rand,13*i+6,16);<br />}</p>
		<p>// 将认证码存入SESSION<br />session.setAttribute("rand",sRand);</p>
		<p>
				<br />// 图象生效<br />g.dispose();</p>
		<p>// 输出图象到页面<br />ImageIO.write(image, "JPEG", response.getOutputStream());</p>
		<p>
				<br />%&gt; </p>
		<p>---------------使用验证码图片的文件---------a.jsp------------------------------------</p>
		<p>&lt;%@ page contentType="text/html;charset=gb2312" %&gt;<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;认证码输入页面&lt;/title&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br />&lt;META HTTP-EQUIV="Pragma" CONTENT="no-cache"&gt; <br />&lt;META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"&gt; <br />&lt;META HTTP-EQUIV="Expires" CONTENT="0"&gt; <br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;form method=post action="check.jsp"&gt;<br />&lt;table&gt;<br />&lt;tr&gt;<br />&lt;td align=left&gt;系统产生的认证码：&lt;/td&gt;<br />&lt;td&gt;&lt;img border=0 src="image.jsp"&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />&lt;td align=left&gt;输入上面的认证码：&lt;/td&gt;<br />&lt;td&gt;&lt;input type=text name=rand maxlength=4 value=""&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />&lt;td colspan=2 align=center&gt;&lt;input type=submit value="提交检测"&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</p>
		<p>-----------------验证的页面----------check.jsp</p>
		<p>&lt;%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;认证码验证页面&lt;/title&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br />&lt;META HTTP-EQUIV="Pragma" CONTENT="no-cache"&gt; <br />&lt;META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"&gt; <br />&lt;META HTTP-EQUIV="Expires" CONTENT="0"&gt; <br />&lt;/head&gt;</p>
		<p>&lt;body&gt;<br />&lt;% <br />String rand = (String)session.getAttribute("rand");<br />String input = request.getParameter("rand");<br />%&gt;<br />系统产生的认证码为： &lt;%= rand %&gt;&lt;br&gt;<br />您输入的认证码为： &lt;%= input %&gt;&lt;br&gt;<br />&lt;br&gt;<br />&lt;%<br />  if (rand.equals(input)) {<br />%&gt;<br />&lt;font color=green&gt;输入相同，认证成功！&lt;/font&gt;<br />&lt;%<br />  } else {<br />%&gt;<br />&lt;font color=red&gt;输入不同，认证失败！&lt;/font&gt;<br />&lt;%<br />  }<br />%&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</p>
<img src ="http://www.blogjava.net/fine/aggbug/103545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2007-03-13 15:42 <a href="http://www.blogjava.net/fine/archive/2007/03/13/103545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>逐渐趋近100的算法</title><link>http://www.blogjava.net/fine/archive/2006/11/24/83294.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Fri, 24 Nov 2006 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2006/11/24/83294.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/83294.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2006/11/24/83294.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/83294.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/83294.html</trackback:ping><description><![CDATA[
		<p>/**<br /> * 逐渐趋近100的算法<br /> */</p>
		<p>public class Test1 {</p>
		<p> public static void main(String[] args) {<br />  // TODO 自动生成方法存根<br />  //算法一<br />  /*int r=0;<br />  while(true){<br />   r+=(((100-r)/2)+1);<br />   if(r != 104)<br />   System.out.println(r);<br />  }*/<br />  //算法二<br />  float b = 0;<br />  float temp;<br />  while(true){<br />  float result = 100;<br />   //temp = (float) ((result - (b))*0.2);<br />  //result = result - temp;<br />  result = (float) (result - ((result - b)*0.2));<br />  b = result;<br />  //if((int)result != 100)<br />  System.out.println(result);<br />  }<br /> }<br />}</p>
<img src ="http://www.blogjava.net/fine/aggbug/83294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2006-11-24 16:14 <a href="http://www.blogjava.net/fine/archive/2006/11/24/83294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个不错的Jstl（JSP标准标签库）文章</title><link>http://www.blogjava.net/fine/archive/2006/09/04/67504.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Mon, 04 Sep 2006 01:14:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2006/09/04/67504.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/67504.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2006/09/04/67504.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/67504.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/67504.html</trackback:ping><description><![CDATA[                                    <strong>Java-JSTL（JSP标准标签库）介绍 </strong><br />前言<br /><br />从JSP　1.1规范开始，JSP就支持在JSP中使用自定义标签了，自定义标签的广泛使用造成了程序员重复定义，这样就促成了JSTL（JavaServer Pages Standard Tag Library）的诞生。<br />因为工作中需要用到JSTL，但网上却苦于找不到有关JSTL的中文资料，所以就有了这篇文章。<br /><br />JSTL简介<br /><br />JSTL是一个不断完善的开放源代码的JSP标签库，是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上，如tomcat 4.x。但是在即将推出的JSP 2.0中是作为标准支持的。<br />JSTL目前的最新版本为1.02，最终发布版为1.0。JSTL包含两个部分：标签库和EL（Expression Language表达式语言）语言。标签库目前支持四种标签： 标签 URI 前缀 示例 <br />Core <a href="http://java.sun.com/jstl/core">http://java.sun.com/jstl/core</a> c &lt;c:tagname ...&gt; <br />XML processing <a href="http://java.sun.com/jstl/xml">http://java.sun.com/jstl/xml</a> x &lt;x:tagname ...&gt; <br />I18N capable formatting <a href="http://java.sun.com/jstl/fmt">http://java.sun.com/jstl/fmt</a> fmt &lt;fmt:tagname ...&gt; <br />Database access (SQL) <a href="http://java.sun.com/jstl/sql">http://java.sun.com/jstl/sql</a> sql &lt;sql:tagname ...&gt; <br /><br /><br />Core支持JSP中的一些基本的操作；<br />XML processing支持XML文档的处理；<br />I18N capable formatting支持对JSP页面的国际化；<br />Database access (SQL)支持JSP对数据库的操作。<br /><br />由于本人水平有限，本文仅介绍Core标签，如有兴趣，可一起探讨其它三种标签的使用与扩充。<br /><br />EL语言介绍<br /><br />EL语言是JSTL输出（输入）一个JAVA表达式的表示形式。<br />在JSTL中，EL语言只能在属性值中使用。EL语言只能通过建立表达式${exp1}来进行调用。在属性值中使用表达式有三种方式。<br /><br />1、 value属性包含一个表达式<br />&lt;some:tag value="${expr}"/&gt;<br />在这种情况下，表达式值被计算出来并根据类型转换规则赋值给value属性。比如：&lt;c:out value="${username}" /&gt;中的${username}就是一个EL，它相当于JSP语句&lt;%=request.getAttribute(“username”)%&gt;或&lt;%=session.getAttribute(“username”)%&gt;<br /><br />2、 value属性包含一个或多个属性，这些属性被文本分割或围绕<br />&lt;some:tag value="some${expr}${expr}text${expr}"/&gt;<br />在这种情况下，表达式从左到右进行计算，并将结果转换为字符串型（根据类型转换规则），并将结果赋值给value属性<br /><br />3、 value属性仅仅包含文本<br />&lt;some:tag value="sometext"/&gt;<br />在这种情况下，字符串型属性value将根据类型转换规则转换为标签所希望的类型。<br /><br />EL语言的操作符<br />取得某个对象或集合中的属性值<br />为了获得集合中的属性，EL支持以下两种操作<br />1． 使用.操作符来获得有名字的属性。例如表达式${user.username}表明对象user的username属性<br />2． 使用[]操作符来获得有名字或按数字排列的属性。<br />表达式${user["username"]}和表达式${user. username }含义相同<br />表达式${row[0]} 表明row集合的第一个条目。<br />在这里user是一个类的对象，它的属性username必须符合标准JavaBean的规范，即必须为username属性定义相应的getter、setter方法。<br /><br />Empty操作符(空值检查)<br /><br />使用empty操作符来决定对象、集合或字符串变量是否为空或null。例如：<br />${empty param.username}<br />如果request的参数列表中的username值为null，则表达式的值为true。 EL也可以直接使用比较操作符与null进行比较。如${param.firstname == null}。<br />比较操作符 操作符 描述 <br />==或eq 相等检查 <br />!=或ne 不等检查 <br />&lt;或lt 小于检查 <br />&gt;或gt 大于检查 <br />&lt;=或le 小于等于检查 <br />&gt;=或ge 大于等于检查 <br /><br />数字运算符与逻辑运算符均与JAVA语言相同，不再列表。<br /><br />Core标签库<br /><br />1、 通用标签<br /><br />&lt;c:out&gt;<br />&lt;c:out&gt;标签用于在JSP中显示数据，它有如下属性 属 性 描 述 是否必须 缺省值 <br />value 输出的信息，可以是EL表达式或常量 是 无 <br />default  value为空时显示信息 否 无 <br />escapeXml 为true则避开特殊的xml字符集 否 true <br /><br /><br /><br />例子: 您的用户名是: &lt;c:out value=”${user.username}” default=”guest”/&gt; <br /><br />显示用户的用户名，如为空则显示guest<br />&lt;c:out value="${sessionScope.username}"/&gt; <br /><br />指定从session中获取username的值显示；<br />&lt;c:out value="${username}" /&gt; <br /><br />显示username的值，默认是从request(page)中取，如果request中没有名为username的对象则从session中取，session中没有则从application(servletContext)中取，如果没有取到任何值则不显示。<br /><br />&lt;c:set&gt;<br />&lt;c:set&gt;标签用于保存数据，它有如下属性 属 性 描 述 是否必须 缺省值 <br />value 要保存的信息，可以是EL表达式或常量 否  <br />target 需要修改属性的变量名，一般为javabean的实例 否 无 <br />property 需要修改的javabean属性 否 无 <br />var 需要保存信息的变量 否 无 <br />scope 保存信息的变量的范围 否 page <br /><br />如果指定了target属性, 那么property属性也必须指定。<br />例子： &lt;c:set value="${test.testinfo}" var="test2" scope=”session” /&gt; <br /><br />将test.testinfo的值保存到session的test2中，其中test是一个javabean的实例，testinfo是test对象的属性。<br />&lt;c:set target="${cust.address}" property="city" value="${city}"/&gt; <br /><br />将对象cust.address的city属性值保存到变量city中<br /><br />&lt;c:remove&gt;<br />&lt;c:remove&gt;标签用于删除数据，它有如下属性 属 性 描 述 是否必须 缺省值 <br />var 要删除的变量 是 无 <br />scope 被删除变量的范围 否 所有范围，包括page、request、session、application等 <br /><br />例子: &lt;c:remove var="test2" scope="session"/&gt; <br /><br />从session中删除test2变量。<br /><br />2、 流控制标签<br /><br />&lt;c:if&gt;<br /><br />&lt;c:if&gt;标签有如下属性 属 性 描 述 是否必须 缺省值 <br />test 需要评价的条件，相当于if (...){}语句中的条件 是 无 <br />var 要求保存条件结果的变量名 否 无 <br />scope 保存条件结果的变量范围 否 page <br /><br /><br />&lt;c:choose&gt;<br />这个标签不接受任何属性<br /><br />&lt;c:when&gt;<br />&lt;c:when&gt;标签有以下属性 属 性 描 述 是否必须 缺省值 <br />test 需要评价的条件 是 无 <br /><br /><br />&lt;c:otherwise&gt;<br />这个标签同样不接受任何属性<br /><br />例子： &lt;c:if test="${user.wealthy}"&gt;<br />user.wealthy is true.<br />&lt;/c:if&gt; <br /><br />如果user.wealthy值true，则显示user.wealthy is true.<br /><br />&lt;c:choose&gt;<br />&lt;c:when test="${user.generous}"&gt;<br />user.generous　is true.<br />&lt;/c:when&gt; <br />&lt;c:when test="${user.stingy}"&gt;<br />user.stingy is true.<br />&lt;/c:when&gt;<br />&lt;c:otherwise&gt;<br />user.generous and user.stingy are false.<br />&lt;/c:otherwise&gt;<br />&lt;/c:choose&gt; <br /><br />只有当条件user.generous返回值是true时，才显示user.generous　is true.<br />只有当条件user.stingy返回值是true时，才显示user.stingy　is true.<br />其它所有的情况（即user.generous和user.stingy的值都不为true）全部显示user.generous and user.stingy are false.<br /><br />由于JSTL没有形如if (){…} else {…}的条件语句，所以这种形式的语句只能用&lt;c:choose&gt;、&lt;c:when&gt;和&lt;c:otherwise&gt;标签共同来完成了。<br /><br />3、 循环控制标签<br /><br />&lt;c:forEach&gt;<br />&lt;c:forEach&gt;标签用于通用数据，它有以下属性 属 性 描 述 是否必须 缺省值 <br />items 进行循环的项目 否 无 <br />begin 开始条件 否 0 <br />end 结束条件 否 集合中的最后一个项目 <br />step 步长 否 1 <br />var 代表当前项目的变量名 否 无 <br />varStatus 显示循环状态的变量 否 无 <br /><br /><br />例子： &lt;c:forEach items="${vectors}" var="vector"&gt;<br />&lt;c:out value="${vector}"/&gt;<br />&lt;/c:forEach&gt; <br /><br />相当于java语句 for (int i=0;i&lt;vectors.size();i++) {<br />out.println(vectors.get(i));<br />} <br /><br />在这里vectors是一个java.util.Vector对象，里面存放的是String数据，vector是当前循环条件下String对象。实际上这里的vectors可以是任何实现了java.util. Collection接口的对象。 <br />&lt;c:forEach begin="0" end="100" var="i" step="1"&gt;<br />count=&lt;c:out value="${i}"/&gt;&lt;br&gt;<br />&lt;/c:forEach&gt;<br /> <br /><br />输出:<br />count=0<br />...<br />count=100<br /><br />&lt;c:forTokens&gt;<br />&lt;c:forTokens&gt;标签有以下属性 属 性 描 述 是否必须 缺省值 <br />items 进行循环的项目 是 无 <br />delims 分割符 是 无 <br />begin 开始条件 否 0 <br />end 结束条件 否 集合中的最后一个项目 <br />step 步长 否 1 <br />var 代表当前项目的变量名 否 无 <br />varStatus 显示循环状态的变量 否 无 <br /><br /><br />例子 <br />&lt;c:forTokens items="a:b:c:d" delims=":" var="token"&gt;<br />&lt;c:out value="${token}"/&gt;<br />&lt;/c:forTokens&gt;<br /> <br /><br />这个标签的使用相当于java.util.StringTokenizer类。在这里将字符串a:b:c:d以：分开循环四次，token是循环到当前分割到的字符串。<br /><br />4.导入文件和URL<br /><br />JSTL核心标签库支持使用&lt;c:import&gt;来包含文件，使用&lt;c:url&gt;来打印和格式化URL,使用&lt;c:redirect&gt;来重定向URL。<br /><br />&lt;c:import&gt;<br />&lt;c:import&gt;标签包含另外一个页面代码到当前页，它有以下属性 属 性 描 述 是否必须 缺省值 <br />url 需要导入页面的url 是 无 <br />context /后跟本地web应用程序的名字 否 当前应用程序 <br />charEncoding 用于导入数据的字符集 否 ISO-8859-1 <br />var 接受导入文本的变量名 否 page <br />scope 接受导入文本的变量的变量范围 否 1 <br />varReader 用于接受导入文本的java.io.Reader变量名 否 无 <br />varStatus 显示循环状态的变量 否 无 <br /><br /><br />&lt;c:url&gt;<br />&lt;c:url&gt;标签输出一个url地址，它有以下属性 属 性 描 述 是否必须 缺省值 <br />url url地址 是 无 <br />context /后跟本地web应用程序的名字 否 当前应用程序 <br />charEncoding 用于导入数据的字符集 否 ISO-8859-1 <br />var 接受处理过的url变量名，该变量存储url 否 输出到页 <br />scope 存储url的变量名的变量范围 否 page <br /><br /><br />例子： <br />&lt;c:import url="http://www.url.com/edit.js" var="newsfeed"/&gt;<br /> <br /><br />将url http://www.url.com/edit.js包含到当前页的当前位置，并将url保存到newsfeed变量中 <br />&lt;a href="&lt;c:url url="/index.jsp"/&gt;"/&gt;<br /> <br /><br />在当前页的当前位置输出&lt;a href="http://www.yourname.com/index.jsp"/&gt;，http://www.yourname.com是当前页的所在的位置。<br /><br /><br />&lt;c:redirect&gt;<br />&lt;c:redirect&gt;标签将请求重新定向到另外一个页面，它有以下属性 属 性 描 述 是否必须 缺省值 <br />url url地址 是 无 <br />context /后跟本地web应用程序的名字 否 当前应用程序 <br /><br />例子： <br />&lt;c:redirect url="http://www.yourname.com/login.jsp"/&gt;<br /> <br /><br />将请求重新定向到http://www.yourname.com/login.jsp页，相当于response.setRedirect("http://www.yourname.com/login.jsp");<br /><br />&lt;c:param&gt;<br />&lt;c:param&gt;标签用来传递参数给一个重定向或包含页面，它有以下属性 属 性 描 述 是否必须 缺省值 <br />name 在request参数中设置的变量名 是 无 <br />value 在request参数中设置的变量值 否 无 <br /><br />例子： <br />&lt;c:redirect url="login.jsp"&gt;<br />&lt;c:param name="id" value="888"/&gt;<br />&lt;/c:redirect&gt;<br /> <br /><br />将参数888以id为名字传递到login.jsp页面，相当于login.jsp?id=888<br /><br /><br />JSTL的优点<br />1、 在应用程序服务器之间提供了一致的接口，最大程序地提高了WEB应用在各应用服务器之间的移植。<br />2、 简化了JSP和WEB应用程序的开发。<br />3、 以一种统一的方式减少了JSP中的scriptlet代码数量，可以达到没有任何scriptlet代码的程序。在我们公司的项目中是不允许有任何的scriptlet代码出现在JSP中。<br />4、 允许JSP设计工具与WEB应用程序开发的进一步集成。相信不久就会有支持JSTL的IDE开发工具出现。<br /><br />总结<br />上面介绍的仅仅是JSTL的一部分，如果有时间我会继续把其它部分写出来分享给大家。如果要使用JSTL，则必须将jstl.jar和standard.jar文件放到classpath中，如果你还需要使用XML processing及Database access (SQL)标签，还要将相关JAR文件放到classpath中，这些JAR文件全部存在于下载回来的zip文件中。这个zip文件可以从http://jakarta.apache.org/builds/jakarta-taglibs/releases/standard/jakarta-taglibs-standard-1.0.zip下载。<br /><br />参考资料<br />1、 http://java.sun.com/products/jsp/jstl/<br />sun公司的JSTL站点<br />2、 http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html<br />jakarta小组的JSTL站点<br />3、 http://www.manning.com/bayern/appendixA.pdf<br />JSTL的参考文档，本文很多内容都是从这个PDF文件里翻译的。<br />4、 ＜＜J2EE编程指南（1.3版）＞＞<br />介绍了JSTL的雏形，wrox的书都是精品。<br /><img src ="http://www.blogjava.net/fine/aggbug/67504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2006-09-04 09:14 <a href="http://www.blogjava.net/fine/archive/2006/09/04/67504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的“ 异 常”</title><link>http://www.blogjava.net/fine/archive/2006/08/31/66823.html</link><dc:creator>Peter Pan</dc:creator><author>Peter Pan</author><pubDate>Thu, 31 Aug 2006 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/fine/archive/2006/08/31/66823.html</guid><wfw:comment>http://www.blogjava.net/fine/comments/66823.html</wfw:comment><comments>http://www.blogjava.net/fine/archive/2006/08/31/66823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fine/comments/commentRss/66823.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fine/services/trackbacks/66823.html</trackback:ping><description><![CDATA[
		<h1 align="left">
				<font size="3">
						<em>异</em>
						<font color="#000000">
								<em>常的温习：</em>
						</font>
				</font>
		</h1>
		<h1 align="left">
				<font size="3">
						<font color="#000000">class ThrowsDemo1 {<br /> static void procedure( ) {<br />  System.out.println("inside procedure");<br />  //throw new IllegalAccessException("demo");<br />  throw new RuntimeException("Demo");    //运行时异常;<br />  }<br /> public static void main(String args[]) {<br />  procedure( );<br />  }<br /> } </font>
				</font>
		</h1>
		<h1 align="left">
				<font size="3">
						<font color="#000000">
						</font>
				</font> </h1>
		<h1 align="left">
				<font size="3">
						<font color="#000000">  来自：<a href="http://www.shu.edu.cn/campus/java/chp8.html">http://www.shu.edu.cn/campus/java/chp8.html</a></font>
				</font>
		</h1>
		<h1 align="center">第 八 章 Java的“ 异 常” </h1>
		<p>“ 异 常” 指 的 是 程 序 运 行 时 出 现 的 非 正 常 情 况。 在 用 传统 的 语 言 编 程 时， 程 序 员 只 能 通 过 函 数 的 返 回 值 来 发 出错 误 信 息。 这 易 于 导 致 很 多 错 误， 因 为 在 很 多 情 况 下 需 要知 道 错 误 产 生 的 内 部 细 节。 通 常， 用 全 局 变 量errno来 存 储“ 异 常” 的 类 型。 这 容 易 导 致 误 用， 因 为 一 个errno的 值 有 可 能在 被 处 理 ?reg; 前 被 另 外 的 错 误 覆 盖 掉。 即 使 最 优 美 的C语言 程 序， 为 了 处 理“ 异 常” 情 况， 也 常 求 助 于goto语 句。 Java对“ 异 常” 的 处 理 是 面 向 对 象 的。 一 个Java的Exception是 一 个 描 述“ 异 常” 情 况 的 对 象。 当 出 现“ 异 常” 情 况 时， 一 个Exception对象 就 产 生 了， 并 放 到 产 生 这 个“ 异 常” 的 成 员 函 数 里。 </p>
		<h2 align="center">8.1 基础 </h2>
		<p>Java的“ 异 常” 处 理 是 通 过5个 关 键 词 来 实 现 的：try, catch, throw, throws和finally。 用try 来 执 行 一 段 程 序， 如 果 出 现“ 异常”， 系 统 抛 出（throws?copy; 一 个“ 异 常”， 你 可 以 通 过 它 的类 型 来 捕 捉（catch?copy; 它， 或 最 后（finally?copy; 由 缺 省 处理 器 来 处 理。 下 面 是“ 异 常” 处 理 程 序 的 基 本 形 式： </p>
		<p>try { //程 序 块 } catch (ExceptionType1 e) { // 对ExceptionType1的处 理 } catch (ExceptionType2 e) { // 对ExceptionType2的 处 理 throw(e); //再 抛 出 这 个“ 异 常” } finally { } </p>
		<h2 align="center">8.2 "异 常” 的 类 型</h2>
		<p>在“ 异 常” 类 层 次 的 最 上 层 有 一 个 单 独 的 类 叫 做Throwable。这 个 类 用 来 表 示 所 有 的“ 异 常” 情 况。 每 个“ 异 常” 类 型 都是Throwable的 子 类。Throwable有 两 个 直 接 的 子 类。 一 类 是Exception，是 用 户 程 序 能 够 捕 捉 到 的“ 异 常” 情 况。 我 们 将 通 过 产 生它 的 子 类 来 创 建 自 己 的“ 异 常”。 另 一 类 是Error， 它 定 义 了那 ?copy; 通 常 无 法 捕 捉 到 的“ 异 常”。 要 谨 慎 使 用Error子 类，因 为 它 们 通 常 会 导 致 灾 难 性 的 失 败。 在Exception中 有 一 个 子类RuntimeException， 它 是 程 序 运 行 时 自 动 地 对 某 ?copy; 错 误作 出 反 应 而 产 生 的。 </p>
		<h2 align="center">8.3 不 捕 捉“ 异 常” </h2>
		<p>“ 异 常” 对 象 是Java在 运 行 时 对 某 ?copy;“ 异 常” 情 况 作出 反 应 而 产 生 的。 例 如， 下 面 这 个 小 程 序 包 含 一 个 整 数 被0除的“ 异 常”。 </p>
		<p>class Exc0 { public static void main(String args[]) { int d = 0; int a = 42/d; } } </p>
		<p>当Java执 行 这 个 除 法 时， 由 于 分 母 是0， 就 会 构 造 一 个“ 异常” 对 象 来 使 程 序 停 下 来 并 处 理 这 个 错 误 情 况， 在 运 行 时“ 抛 出”（throw?copy; 这 个“ 异 常”。 说“ 抛 出” 是 因 为 它 象 一个 滚 烫 的 马 铃 薯， 你 必 须 把 它 抓 住 并 立 即 处 理。 程 序 流 将会 在 除 号 操 作 符 处 被 打 断， 然 后 检 查 当 前 的 调 用 堆 栈 来查 找“ 异 常”。 一 个“ 异 常” 处 理 器 是 用 来 立 即 处 理“ 异 常” 情 况 的。 在 这 个 例 子 里， 我 们 没 有 编 一 个“ 异 常” 处 理 器，所 以 缺 省 的 处 理 器 就 发 挥 作 用 了。 缺 省 的 处 理 器 打 印Exception的字 符 ?reg; 值 和 发 生 “ 异 常” 的 地 点。 下 面 是 我 们 的 小 例子 的 输 出。 </p>
		<p>C:\&gt;java Exc0 java.lang.arithmeticException: / by zero at Exc0.main(Exc0.java:4) </p>
		<h2 align="center">8.4 try与catch </h2>
		<p>通 常 我 们 希 望 自 己 来 处 理“ 异 常” 并 继 续 运 行。 可 以 用try来指 定 一 块 预 防 所 有“ 异 常” 的 的 程 序。 紧 跟 在try程 序 后 面，应 包 含 一 个catch子 句 来 指 定 你 想 要 捕 捉 的“ 异 常” 的 类 型。例 如， 下 面 的 例 子 是 在 前 面 的 例 子 的 基础上 构 造 的， 但 它包 含 一 个try程 序 块 和 一 个catch子 句。 </p>
		<p>class exc1 { public static void main(string args[]) { try { int d = 0; int a = 42 / d; } catch (arithmeticexception e) { system.out.println("division by zero"); } } } </p>
		<p>catch子 句 的 目 标 是 解 决“ 异 常” 情 况， 把 一 ?copy; 变 量 设到 合 理 的 状 态， 并 象 没 有 出 错 一 样 继 续 运 行。 如 果 一 个 子程 序 不 处 理 某 个“ 异 常”， 则 返 到 上 一 级 处 理， 直 到 最 外一 级。 </p>
		<h2 align="center">8.5 多 个catch子 句</h2>
		<p>在 某 ?copy; 情 况 下， 同 一 段 程 序 可 能 产 生 不 止 一 种“ 异常” 情 况。 你 可 以 放 置 多 个catch子 句， 其 中 每 一 种“ 异 常” 类 型 都 将 被 检 查， 第 一 个 与 ?reg; 匹 配 的 就 会 被 执 行。 如果 一 个 类 和 其 子 类 都 有 的 话， 应 把 子 类 放 在 前 面， 否 则 将永 远 不 会 到 达 子 类。 下 面 是 一 个 有 两 个catch子 句 的 程 序 的例 子。 </p>
		<p>class MultiCatch { public static void main(String args[]) { try { int a = args.length; System.out.println("a = " + a); int b = 42/a; int c[] = {1}; c[42] = 99; } catch(ArithmeticException e) { System.out.println("div by 0: " + e); } catch(ArrayIndexOutOfBoundsException e) { system.out.println("array index oob: " + e); } } } </p>
		<p>如 果 在 程 序 运 行 时 不 跟 参 数， 将 会 引 起 一 个0做 除 数 的“ 异 常”， 因 为a的 值 为0。 如 果 我 们 提 ?copy; 一 个 命 令 行 参 数，将 不 会 产 生 这 个“ 异 常”， 因 为a的 值 大 于0。 但 会 引 起 一 个 ArrayIndexOutOfBoundexception的“ 异 常”， 因 为 整 型 数 组c的 长 度是1， 却 给c[42]赋 值。 下 面 是 以 上 两 种 情 况 的 运 行 结 果。 </p>
		<p>C:\&gt;java MultiCatch a = 0 div by 0: java.lang.arithmeticexception: / by zero C:\&gt;java MutiCatch 1 a = 1 array index oob: java.lang.ArrayIndexOutOfBoundsException:42 </p>
		<h2 align="center">8.6 try语 句 的 嵌 套 </h2>
		<p>你 可 以 在 一 个 成 员 函 数 调 用 的 外 面 写 一 个try语 句， 在 这个 成 员 函 数 内 部， 写 另 一 个try语 句 保 护 其 他 代 码。 每 当 遇到 一 个try语 句，“ 异 常” 的 框 架 就 放 到 堆 栈 上 面， 直 到 所 有的try语 句 都 完 成。 如 果 下 一 级 的try语 句 没 有 对 某 种“ 异 常” 进 行 处 理， 堆 栈 就 会 展 开， 直 到 遇 到 有 处 理 这 种“ 异 常” 的try语 句。 下 面 是 一 个try语 句 嵌 套 的 例 子。 </p>
		<p>class MultiNest { static void procedure() { try { int c[] = { 1 }: c[42] = 99; } catch(ArrayIndexOutOfBoundsexception e) { System.out.println("array index oob: " + e); } } public static void main(String args[]) { try { int a = args.length; system.out.println("a = " + a); int b = 42/a; procedure(); } catch(arithmeticException e) { System.out.println("div by 0: " + e); } } } </p>
		<p>成 员 函 数procedure里 有 自 己 的try/catch控 制， 所 以main不 用 去处 理 ArrayIndexOutOfBoundsException。 </p>
		<h2 align="center">8.7 throw语 句</h2>
		<p>throw语 句 用 来 明 确 地 抛 出 一 个“ 异 常”。 首 先， 你 必 须 得到 一 个Throwable的 实 例 的 控 制 柄， 通 过 参 数 传 到catch子 句， 或者 用new操 作 符 来 创 建 一 个。 下 面 是throw语 句 的 通 常 形 式。 </p>
		<p>throw ThrowableInstance; </p>
		<p>程 序 会 在throw语 句 后 立 即 终 止， 它 后 面 的 语 句 执 行 不 到，然 后 在 包 含 它 的 所 有try块 中 从 里 向 外 寻 找 含 有 与 其 匹 配的catch子 句 的try块。 下 面 是 一 个 含 有throw语 句 的 例 子。 </p>
		<p>class ThrowDemo { static void demoproc() { try { throw new NullPointerException("de3mo"); } catch(NullPointerException e) { System.out.println("caught inside demoproc"); throw e; } } public static void main(String args[]) { try { demoproc(); } catch(NullPointerException e) { system.out.println("recaught: " + e); } } } </p>
		<h2 align="center">8.8 throws语 句 </h2>
		<p>throws用 来 标 明 一 个 成 员 函 数 可 能 抛 出 的 各 种“ 异 常”。对 大 多 数Exception子 类 来 说，Java 编 译 器 会 强 迫 你 声 明 在 一个 成 员 函 数 中 抛 出 的“ 异 常” 的 类 型。 如 果“ 异 常” 的 类 型是Error或 RuntimeException， 或 它 们 的 子 类， 这 个 规 则 不 起 作 用，因 为 这 ?copy; 在 程 序 的 正 常 部 分 中 是 不 期 待 出 现 的。 如 果你 想 明 确 地 抛 出 一 个RuntimeException， 你 必 须 用throws语 句 来声 明 它 的 类 型。 这 就 重 新 定 义 了 成 员 函 数 的 定 义 语 法： </p>
		<p>type method-name(arg-list) throws exception-list { } </p>
		<p>下 面 是 一 段 程 序， 它 抛 出 了 一 个“ 异 常”， 但 既 没 有 捕捉 它， 也 没 有 用throws来 声 明。 这 在 编 译 时 将 不 会 通 过。 </p>
		<p>class ThrowsDemo1 { static void procedure( ) [ System.out.println("inside procedure"); throw new IllegalAccessException("demo"); } public static void main(String args[]) { procedure( ); } } </p>
		<p>为 了 让 这 个 例 子 编 译 过 去， 我 们 需 要 声 明 成 员 函 数procedure抛出 了IllegalAccessException， 并 且 在 调 用 它 的 成 员 函 数main里 捕捉 它。 下 面 是 正 确 的 例 子： </p>
		<p>class ThrowsDemo { static void procedure( ) throws IllegalAccessException { System.out.println("inside procedure"); throw new IllegalAccessException("demo"); } public static void main(String args[]) { try { procedure( ); } catch (IllegalAccessException e) { System.out.println("caught " + e); } } } </p>
		<p>下 面 是 输 出 结 果： </p>
		<p>C:\&gt;java ThrowsDemo inside procedure caught java.lang.IllegalAccessException: demo </p>
		<h2 align="center">8.9 finally </h2>
		<p>当 一 个“ 异 常” 被 抛 出 时， 程 序 的 执 行 就 不 再 是 线 性 的，跳 过 某 ?copy; 行， 甚 至 会 由 于 没 有 与 ?reg; 匹 配 的catch子 句而 过 早 地 返 回。 有 时 确 保 一 段 代 码 不 管 发 生 什 么“ 异 常” 都 被 执 行 到 是 必 要 的， 关 键 词finally就 是 用 来 标 识 这 样 一段 代 码 的。 即 使 你 没 有catch子 句，finally程 序 块 也 会 在 执 行 try程 序 块 后 的 程 序 ?reg; 前 执 行。 每 个try语 句 都 需 要 至 少一 个 与 ?reg; 相 配 的catch子 句 或finally子 句。 一 个 成 员 函 数 返回 到 调 用 它 的 成 员 函 数， 或 者 通 过 一 个 没 捕 捉 到 的“ 异 常”，或 者 通 过 一 个 明 确 的return语 句，finally子 句 总 是 恰 好 在 成 员函 数 返 回 前 执 行。 下 面 是 一 个 例 子， 它 有 几 个 成 员 函 数，每 个 成 员 函 数 用 不 同 的 途 径 退 出， 但 执 行 了finally子 句。 </p>
		<p>class FinallyDemo { static void procA( ) { try { System.out.println("inside procA"); throw new RuntimeException("demo"); } finally { System.out.println("procA's finally"); } } static void procB( ) { try { System.out.println("inside procB"); return; } finally { System.out.println("procB's finally"); } } public static void main(String args[]) { try { procA( ); } catch (Exception e); procB( ); } } </p>
		<p>下 面 是 这 个 例 子 的 运 行 结 果： </p>
		<p>C:\&gt;java FinallyDemo inside procA procA's finally inside procB procB's finally </p>
		<h2 align="center">本 章 小 结 </h2>
		<p>1. “ 异 常” 指 的 是 程 序 运 行 时 出 现 的 非 正 常 情 况。 2. 在“ 异 常” 类 层 次 的 最 上 层 的 类 叫Throwable， 它 有 两 个 直 接 的 子类：Exception和Error。 3. Java的“ 异 常” 处 理 通 过5个 关 键 词 来 实现：try，catch，throw，throws和finally。 <br /><br />   来自：<a href="http://www.shu.edu.cn/campus/java/chp8.html">http://www.shu.edu.cn/campus/java/chp8.html</a><br /><br /></p>
<img src ="http://www.blogjava.net/fine/aggbug/66823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fine/" target="_blank">Peter Pan</a> 2006-08-31 11:42 <a href="http://www.blogjava.net/fine/archive/2006/08/31/66823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>