﻿<?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-&lt;font color="red"&gt;JRen&lt;/font&gt;&lt;font color="lightgreen"&gt;大鹏一曰同风起，扶摇直上九万里&lt;/font&gt;</title><link>http://www.blogjava.net/liaojiyong/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 05 Jul 2009 10:35:40 GMT</lastBuildDate><pubDate>Sun, 05 Jul 2009 10:35:40 GMT</pubDate><ttl>60</ttl><item><title>MultiView控件</title><link>http://www.blogjava.net/liaojiyong/archive/2008/02/17/180229.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Sun, 17 Feb 2008 01:37:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2008/02/17/180229.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/180229.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2008/02/17/180229.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/180229.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/180229.html</trackback:ping><description><![CDATA[<div class="tit">MultiView控件(1)</div>
<div class="date">2007年08月07日 星期二 21:05</div>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt">
            <p>MultiView 控件是一组 View 控件的容器。使用它可定义一组 View 控件，其中每个 View 控件都包含子控件。然后，应用程序可根据用户标识、用户首选项以及在查询字符串参数中传递的信息等条件，向客户端呈现特定的 View 控件。也可以使用 MultiView 控件创建向导。这种情况下，MultiView 控件包含的每个 View 控件都表示向导中的不同步骤或页。此控件还可用来开发移动设备的多屏幕应用程序。此控件提供的功能与 .NET Framework 1.1 版的 ASP.NET <MSHELP:LINK keywords="T:System.Web.UI.MobileControls.Form">Form</MSHELP:LINK> 移动控件相同。</p>
            <p>在 MultiView 控件中，一次只能将一个 View 控件定义为活动视图。如果某个 View 控件定义为活动视图，它所包含的子控件则会呈现到客户端。可以使用 <a href="ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref16/html/P_System_Web_UI_WebControls_MultiView_ActiveViewIndex.htm">ActiveViewIndex</a> 属性或 <a href="ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref16/html/M_System_Web_UI_WebControls_MultiView_SetActiveView_1_495c4fa4.htm">SetActiveView</a> 方法定义活动视图。如果 ActiveViewIndex 属性为空，则 MultiView 控件不向客户端呈现任何内容。如果活动视图设置为 MultiView 控件中不存在的 View，则会在运行时引发 <MSHELP:LINK keywords="T:System.ArgumentOutOfRangeException">ArgumentOutOfRangeException</MSHELP:LINK>。<br />
            <br />
            如图：<br />
            </p>
            <div forimg="1">
            <div forimg="1">
            <div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/bmlvy2006/pic/item/1edf0bd546fc08cc51da4ba2.jpg" border="0" small="0"  alt="" /><br />
            <font color="#339966">html代码：<br />
            </font>&lt;asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="0"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:View ID="View1" runat="server"&gt;View 1&lt;br /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Button ID="Button1" runat="server" CommandArgument="View2" CommandName="SwitchViewByID" Text="Go to View2" /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Button ID="Button4" runat="server" CommandName="NextView" Text="Next View(2)" /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/asp:View&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:View ID="View2" runat="server"&gt;View 2&lt;br /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Button ID="Button2" runat="server" CommandArgument="View3" CommandName="SwitchViewByID" Text="Go to View 3" /&gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Button ID="Button5" runat="server" CommandName="NextView" Text="Next View(3)" /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/asp:View&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:View ID="View3" runat="server"&gt;View 3&lt;br /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Button ID="Button3" runat="server" CommandArgument="View1" CommandName="SwitchViewByID" Text="Go to View 1" /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Button ID="Button6" runat="server" CommandArgument="View1" CommandName="SwitchViewByID" Text="Next View(1)" /&gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/asp:View&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/asp:MultiView&gt;<br />
            <br />
            <font color="#339966">源代码：</font><br />
            if (!IsPostBack)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (Request.QueryString["id"] != null) { MultiView1.ActiveViewIndex = Convert.ToInt32(Request.QueryString["id"]); }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            <br />
            在你切换视图之间一般用LinkButton、Button、imageButton，因为只有它们才有CommandName,CommandArgument属性。<br />
            CommandName属性值：<font color="#339966">PreviousView、NextView、SwitchViewByID 或 SwitchViewByIndex<br />
            </font>CommandArgument属性值：与关联的 CommandName 一起被传递到 Command 事件的可选参数。<br />
            <br />
            </div>
            </div>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/180229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2008-02-17 09:37 <a href="http://www.blogjava.net/liaojiyong/archive/2008/02/17/180229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP.NET2.0中将文件上传到数据库</title><link>http://www.blogjava.net/liaojiyong/archive/2008/02/05/179324.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Tue, 05 Feb 2008 00:54:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2008/02/05/179324.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/179324.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2008/02/05/179324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/179324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/179324.html</trackback:ping><description><![CDATA[<p>此问题经常被人问，本文列出将文字和图片上传到数据库的方法。包括Access数据库和SQL Server数据库。</p>
<p><strong>Access数据库代码</strong></p>
<p><xmp><%@ Page Language="C#" EnableViewState="true" %>
<%@ Import Namespace="System.Data.OleDb" %>
<!doctype html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

  protected void Button1_Click( object sender, EventArgs e )
  {
    System.IO.Stream fileDataStream = FileUpload1.PostedFile.InputStream;

    if (fileDataStream.Length < 1)
    {
      Msg.Text = "请选择文件。";
      return;
    }

    //得到文件大小
    int fileLength = FileUpload1.PostedFile.ContentLength;

    //创建数组
    byte[] fileData = new byte[fileLength];
    //把文件流填充到数组
    fileDataStream.Read(fileData, 0, fileLength);
    //得到文件类型
    string fileType = FileUpload1.PostedFile.ContentType;

    //构建数据库连接，SQL语句，创建参数
    string strCnn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("Image2Access.mdb");
    OleDbConnection myConnection = new OleDbConnection(strCnn);
    OleDbCommand command = new OleDbCommand("INSERT INTO Person (PersonName,PersonEmail,PersonSex,PersonImageType,PersonImage)" +
    "VALUES (@PersonName,@PersonEmail,@PersonSex,@PersonImageType,@PersonImage)", myConnection);

    command.Parameters.AddWithValue("@PersonName",TextBox1.Text);
    command.Parameters.AddWithValue("@PersonEmail", "mengxianhui@dotnet.aspx.cc");
    command.Parameters.AddWithValue("@paramPersonSex", "男");
    command.Parameters.AddWithValue("@PersonImageType", fileType);
    command.Parameters.AddWithValue("@PersonImage", fileData);


    //打开连接，执行查询
    myConnection.Open();
    command.ExecuteNonQuery();
    myConnection.Close();
    Response.Redirect(Request.RawUrl);
  }


  protected void Page_Load( object sender, EventArgs e )
  {

    if (!Page.IsPostBack)
    {
      BindGrid();
    }
  }

  private void BindGrid( )
  {
    string strCnn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    + Server.MapPath("Image2Access.mdb");
    OleDbConnection myConnection = new OleDbConnection(strCnn);
    OleDbCommand myCommand = new OleDbCommand("SELECT * FROM Person", myConnection);

    try
    {
      myConnection.Open();
      GridView1.DataSource = myCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
      GridView1.DataBind();
    }
    catch (OleDbException SQLexc)
    {
      Response.Write("提取数据时出现错误：" + SQLexc.ToString());
    }
  }
  protected string FormatURL( object strArgument )
  {
    return "ReadImage.aspx?id=" + strArgument.ToString();
  }  

</script>
<html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>上传文件到数据库</title>
    </head>
    <body>
        <form id="MengXianhui" runat="server">
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
            <columns>
            <asp:TemplateField>
            <itemtemplate>
            <%#Eval("PersonName") %>
            </itemtemplate>
            </asp:TemplateField>
            <asp:TemplateField>
            <itemtemplate>
            <%#Eval("PersonEmail") %>
            </itemtemplate>
            </asp:TemplateField>
            <asp:TemplateField>
            <itemtemplate>
            <%#Eval("PersonSex") %>
            </itemtemplate>
            </asp:TemplateField>
            <asp:TemplateField>
            <itemtemplate>
            <img src="<%#FormatURL(Eval("PersonID")) %  alt="" />" /></itemtemplate>
            </asp:TemplateField>
            </columns>
            </asp:GridView>
            <br />
            <br />
            姓名：<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <br />
            照片：<asp:FileUpload ID="FileUpload1" runat="server" />
            <asp:Button ID="btnUpload" runat="server" Text="上传" OnClick="Button1_Click"></asp:Button>
            <p>
            <asp:Label ID="Msg" runat="server" ForeColor="Red"></asp:Label></p>
        </form>
    </body>
</html>
</xmp>
<p>&nbsp;</p>
<p><strong>SQL Server数据库代码</strong></p>
<p><xmp><%@ Page Language="C#" EnableViewState="true" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<!doctype html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
  string strCnn = "Persist Security Info=False;User ID=sa;Password=;Initial Catalog=Book;Server=(local);";
  protected void Button1_Click( object sender, EventArgs e )
  {
    System.IO.Stream fileDataStream = FileUpload1.PostedFile.InputStream;

    if (fileDataStream.Length < 1)
    {
      Msg.Text = "请选择文件。";
      return;
    }

    //得到文件大小
    int fileLength = FileUpload1.PostedFile.ContentLength;

    //创建数组
    byte[] fileData = new byte[fileLength];
    //把文件流填充到数组
    fileDataStream.Read(fileData, 0, fileLength);
    //得到文件类型
    string fileType = FileUpload1.PostedFile.ContentType;

    //构建数据库连接，SQL语句，创建参数

    SqlConnection myConnection = new SqlConnection(strCnn);
    SqlCommand command = new SqlCommand("INSERT INTO UserPhoto (UserName,ContentType,Photo)" +
    "VALUES (@UserName,@ContentType,@Photo)", myConnection);

    command.Parameters.AddWithValue("@UserName", TextBox1.Text);
    command.Parameters.AddWithValue("@ContentType", fileType);
    command.Parameters.AddWithValue("@Photo", fileData);

    //打开连接，执行查询
    myConnection.Open();
    command.ExecuteNonQuery();
    myConnection.Close();
    Response.Redirect(Request.RawUrl);
  }


  protected void Page_Load( object sender, EventArgs e )
  {

    if (!Page.IsPostBack)
    {
      BindGrid();
    }
  }

  private void BindGrid( )
  {
    SqlConnection myConnection = new SqlConnection(strCnn);
    SqlCommand myCommand = new SqlCommand("SELECT * FROM UserPhoto Order By id DESC", myConnection);

    try
    {
      myConnection.Open();
      GridView1.DataSource = myCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
      GridView1.DataBind();
    }
    catch (Exception SQLexc)
    {
      Response.Write("提取数据时出现错误：" + SQLexc.ToString());
    }
  }
  protected string FormatURL( object strArgument )
  {
    return "ReadImage.aspx?id=" + strArgument.ToString();
  }  

</script>
<html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <title>上传文件到数据库</title>
    </head>
    <body>
        <form id="MengXianhui" runat="server">
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
            <columns>
            <asp:TemplateField>
            <itemtemplate>
            <%#Eval("UserName") %>
            </itemtemplate>
            </asp:TemplateField>
            <asp:TemplateField>
            <itemtemplate>
            <img src="<%#FormatURL(Eval("id")) %  alt="" />" /></itemtemplate>
            </asp:TemplateField>
            </columns>
            </asp:GridView>
            <br />
            <br />
            姓名：<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <br />
            照片：<asp:FileUpload ID="FileUpload1" runat="server" />
            <asp:Button ID="btnUpload" runat="server" Text="上传" OnClick="Button1_Click"></asp:Button>
            <p>
            <asp:Label ID="Msg" runat="server" ForeColor="Red"></asp:Label></p>
        </form>
    </body>
</html>
</xmp>
<p>&nbsp;</p>
<p><strong>显示图片</strong></p>
<p><xmp><%@ Page Language="C#" %>
<%@ Import Namespace="System.Data.OleDb" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="server">

  protected void Page_Load( object sender, EventArgs e )
  {
    ////构建数据库连接，SQL语句，创建参数
    //ACCESS数据库使用本注释部分
    //string strCnn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("Image2Access.mdb");
    //OleDbConnection myConnection = new OleDbConnection(strCnn);
    //OleDbCommand command = new OleDbCommand("select * from Person Where PersonID =" + Request.QueryString["id"], myConnection);
    //myConnection.Open();
    //OleDbDataReader dr = command.ExecuteReader();
    //if (dr.Read())
    //{
    //  Response.Clear();
    //  Response.AddHeader("Content-Type", dr["PersonImageType"].ToString());
    //  Response.BinaryWrite((byte[])dr["PersonImage"]);
    //}
    //dr.Close();
    //myConnection.Dispose();

    //构建数据库连接，SQL语句，创建参数
    string strCnn = "Persist Security Info=False;User ID=sa;Password=;Initial Catalog=Book;Server=(local);";
    SqlConnection myConnection = new SqlConnection(strCnn);
    SqlCommand command = new SqlCommand("select * from UserPhoto Where id =" + Request.QueryString["id"], myConnection);
    myConnection.Open();
    SqlDataReader dr = command.ExecuteReader();
    if (dr.Read())
    {
      Response.Clear();
      Response.AddHeader("Content-Type", dr["ContentType"].ToString());
      Response.BinaryWrite((byte[])dr["Photo"]);
    }
    dr.Close();
    myConnection.Dispose();
  }
</script>
</xmp>
<p>&nbsp;</p>
<p><strong>创建SQL数据表语句</strong></p>
<p><xmp>CREATE TABLE [UserPhoto] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[UserName] [nvarchar] (255) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[ContentType] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Photo] [image] NOT NULL ,
CONSTRAINT [PK_UserPhoto] PRIMARY KEY  CLUSTERED
(
[id]
)  ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
</xmp>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/179324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2008-02-05 08:54 <a href="http://www.blogjava.net/liaojiyong/archive/2008/02/05/179324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat常用调优技巧(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/12/16/168053.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Sun, 16 Dec 2007 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/12/16/168053.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/168053.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/12/16/168053.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/168053.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/168053.html</trackback:ping><description><![CDATA[本文是就Tomcat 4为基础向大家介绍WEB容器调优的，因为许多朋友安装好之后就开始正式上线，很少有人以用户现场为基础对服务器进行调优。如果并发量小，系统可能不会出问题，但是并发量大时，系统反应速度迅速下降，由于不了解原因，因此大家还拼命在自己的应用中寻找问题，从而浪费了宝贵的现场时间。但是Tomcat如何调优呢？<br />
&nbsp;&nbsp;&nbsp; 其实真正的WEB容器调优是需要许多方面的知识的，你必须了解网络＋硬件＋OS＋JVM＋WEB容器，但是这篇文章无法讲解那么多，而应用服务器本身也有些调优的基本原则，下文就会给予介绍。<br />
&nbsp;&nbsp;&nbsp; 先在Tomcat安装目录中找到conf子目录，然后再打开web.xml文件，搜索附件A中的内容，可能会有些不同。不同的地方就是需要修改的部分。<br />
&nbsp;&nbsp;&nbsp; 1. 屏蔽DNS查询。<br />
&nbsp;&nbsp;&nbsp; Web应用程序可以通过Web容器提供的getRemoteHost()方法获得访问Web应用客户的IP地址和名称，但是这样会消耗Web容器的资源，并且还需要通过IP地址和DNS服务器反查用户的名字，因此当系统上线时，可以将这个属性关闭，从而减少资源消耗，那么Web应用也就只能记录下IP地址了。修改的属性是enableLoopups="false"<br />
&nbsp;&nbsp;&nbsp; 2. 调整线程数。<br />
&nbsp;&nbsp;&nbsp; Tomcat通过线程池来为用户访问提供响应，对于上线的系统初步估计用户并发数量后，然后调整线程池容量。例如：用户并发数量大约在100左右。那么可以设置minProcessors="100" maxProcessors="100"，将最大和最小设置为一样后，线程池不会再释放空闲的线程，使用户访问突然增加的时候，不需要再消耗系统资源去创建新的线程。<br />
&nbsp;&nbsp;&nbsp; 3. 调整最大连接数<br />
&nbsp;&nbsp;&nbsp; 这个其实最复杂，即使用户并发量大，但是系统反应速度快的话，可以把这个值不用设置太高，高了系统需要消耗大量的资源去切换线程，但是如果设置太低也会造成应用无法满足用户并发需要。因此设置这个最好能够结合整个系统的跟踪与调优，使系统达到最好的平稳状态。一般设置为maxProcessors的1.5倍就可以了。<br />
&nbsp;&nbsp;&nbsp; 4. 调整网络超时。<br />
&nbsp;&nbsp;&nbsp; 主要是HTTP协议也有个连接过程，客户端连接到服务器上后，多长时间没有得到处理就会被释放。如果服务器处理速度较慢，但是希望每个用户都能得到有效处理，或者网络环境不好，需要保证用户不会因为超时会断，也可以把时间加长。但是一般设置成connectionTimeout="30000"就可以了。太长对系统来说价值不大，反而会浪费系统资源在无谓的长连接上。<br />
&nbsp;&nbsp;&nbsp; 附件A。<br />
&nbsp;&nbsp;&nbsp; 在tomcat配置文件server.xml中的&lt;Connector ... /&gt;配置中，和连接数相关的参数有：<br />
&nbsp;&nbsp;&nbsp; minProcessors：最小空闲连接线程数，用于提高系统处理性能，默认值为10<br />
&nbsp;&nbsp;&nbsp; maxProcessors：最大连接线程数，即：并发处理的最大请求数，默认值为75<br />
&nbsp;&nbsp;&nbsp; acceptCount：允许的最大连接数，应大于等于maxProcessors，默认值为100<br />
&nbsp;&nbsp;&nbsp; enableLookups：是否反查域名，取值为：true或false。为了提高处理能力，应设置为false<br />
&nbsp;&nbsp;&nbsp; connectionTimeout：网络连接超时，单位：毫秒。设置为0表示永不超时，这样设置有隐患的。通常可设置为20000毫秒。&nbsp;&nbsp;&nbsp; &lt;Connector<br />
&nbsp;&nbsp;&nbsp; className="org.apache.coyote.tomcat4.CoyoteConnector"<br />
&nbsp;&nbsp;&nbsp; port="8080" minProcessors="5" maxProcessors="75"<br />
&nbsp;&nbsp;&nbsp; enableLookups="true" redirectPort="8443"<br />
&nbsp;&nbsp;&nbsp; acceptCount="10" debug="0" connectionTimeout="20000"<br />
&nbsp;&nbsp;&nbsp; useURIValidationHack="false"<br />
/&gt;<font style="background-color: #cce8cf">Tomcat常用调优技巧.txt</font>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/168053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-12-16 11:38 <a href="http://www.blogjava.net/liaojiyong/archive/2007/12/16/168053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux配置sendmail的问题 </title><link>http://www.blogjava.net/liaojiyong/archive/2007/11/20/161924.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Tue, 20 Nov 2007 11:41:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/11/20/161924.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/161924.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/11/20/161924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/161924.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/161924.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="750" align="center" border="0">
    <tbody>
        <tr>
            <td>
            <div align="center"><img alt="ChinaUnix.net" src="http://www.chinaunix.net/bbs/myimages/logo.gif" border="0" /></div>
            </td>
        </tr>
        <tr>
            <td>
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td width="100%" bgcolor="#49ade9" height="17"><font color="#ffffff">&nbsp;&gt;&gt; <a href="http://www.chinaunix.net/"><font color="#ffffff">ChinaUnix.net</font></a> &gt; <a href="http://www.chinaunix.net/cgi-bin/bbs/forums.cgi?forum=1"><font color="#ffffff">Linux</font></a> </font></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="750" align="center" border="0">
    <tbody>
        <tr>
            <td><span style="font-size: 14px"><br />
            <center><strong>请问关于linux配置sendmail的问题 </strong></center><br />
            <div></div>
            </span></td>
        </tr>
        <tr>
            <td>
            <div align="center">作者：<a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=最美的风景" target="_blank">最美的风景</a> &nbsp;&nbsp;&nbsp;&nbsp;发表时间：2002/09/24 09:02am</div>
            <br />
            </td>
        </tr>
        <tr>
            <td align="center">
            <table cellspacing="0" cellpadding="0" width="90%" border="0">
                <tbody>
                    <tr>
                        <td><span style="font-size: 14px">linux里面没有inetd.conf这个文件<br />
                        配置sendmail应该如何做<br />
                        谢谢 </span></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
    <table>
        <tbody>
        </tbody>
    </table>
    <table cellspacing="0" cellpadding="0" width="750" align="center" border="0">
        <tbody>
            <tr>
                <td>
                <hr size="1" />
                此文章相关评论: <br />
                </td>
            </tr>
            <tr>
                <td>该文章有<font color="#ff0000">20</font>个相关评论如下：(<a href="http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=1&amp;topic=5245" target="_blank"><font color="#ffa200">点这儿可以发表评论</font></a>)<br />
                </td>
            </tr>
            <tr>
                <td>
                <table cellspacing="0" cellpadding="0" width="90%" border="0">
                    <tbody>
                        <tr>
                            <td>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=wind521" target="_blank">wind521</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2002/09/24 10:11am</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">有自己的一个进程:/etc/init.d/sendmail
                                        <p>配置文件在:/etc/sendmail.cf</p>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=aaron2002" target="_blank">aaron2002</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2002/09/24 10:54am</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">原来/etc/inetd.conf里的东西都在/etc/xinetd.d/目录下面</td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=yano" target="_blank">yano</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2002/09/24 10:58am</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">sendmail的安装，您首先要保证域名提供商为你的主机做了MX记录的域名解析。我做的MX记录如下。
                                        <p>名　称：abc.com<br />
                                        类　型：mx(10)<br />
                                        主机名：mx1.abc.com
                                        <p>同时给主机做了mx1.abc.com的A记录。
                                        <p>测试MX记录是否生效，您可以用nslookup<br />
                                        #nslookup<br />
                                        &gt; set q=mx<br />
                                        &gt; abc.com<br />
                                        这时您就会从系统显示出的信息中看到您的MX记录是否生效。
                                        <p>REDHAT7.0安装完毕后，系统默认已经安装了sendmail-cf-8.11.0-8.i386.rpm软件包，请检查/etc/下是否有sendmail.cf文件，如果没有，请安装sendmail-cf-8.11.0-8.i386.rpm的软件包，在linux的光盘中有。<br />
                                        　　<br />
                                        配置：<br />
                                        /etc/sendmail.cf
                                        <p>Cwlocalhost　abc mx1.abc.com
                                        <p>/etc/mail/access
                                        <p>添加：<br />
                                        1.2.3.4RELAY（1.2.3.4是我的IP）
                                        <p>/etc/mail/local-host-names<br />
                                        　　<br />
                                        abc.com（添加一别名，为了收取user@abc.com格式的信件）
                                        <p>为了用户可以使用foxmail，outlook等软件进行收信。您需要安装imap。打开系统的pop3端口。<br />
                                        请查看/usr/sbin/下是否含有ipop2d、ipop3d文件，如没有，请安装imap-4.7c2-12.i386.rpm软件包。
                                        <p>配置：
                                        <p>/etc/xinetd.d/ipop2
                                        <p>默认：disable=yes　改为：disable=no
                                        <p>/etc/xinetd.d/ipop3
                                        <p>默认：disable=yes　改为：disable=no
                                        <p>/etc/xinetd.d/ipop3
                                        <p>默认：disable=yes　改为：disable=no
                                        <p>/etc/xinetd.d/pops
                                        <p>默认：disable=yes　改为：disable=no
                                        <p><br />
                                        最后：
                                        <p>/etc/rc.d/init.d/xinetd restart
                                        <p>邮件系统用户的添加与删除：
                                        <p>添加：<br />
                                        # /user/sbin/useradd username mail<br />
                                        #passwd username<br />
                                        #chsh username<br />
                                        /bin/true(更新用户的shells)
                                        <p>删除：
                                        <p>#/ /usr/sbin/userdel username
                                        <p>
                                        <p>这时，如果您的MX记录解析成功，工作正常，上述操作无误，您就可以在windows客户端通过foxmail，outlook进行收发邮件了，设置：邮箱地址：username@abc.com，账号：username，口令：网络管理员会告诉你，pop3：mx1.abc.com　smtp：mx1.abc.com<br />
                                        </p>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=最美的风景" target="_blank">最美的风景</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2002/09/24 11:00am</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">非常感谢各位<br />
                                        这些我已经配好了<br />
                                        我配popper的时候,打不开110端口,不能用pop3<br />
                                        请问怎么打开?<br />
                                        在xinetd.conf里面么?</td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=yano" target="_blank">yano</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2002/09/24 11:06am</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">看上面我回复的帖子，上面有</td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=aaron2002" target="_blank">aaron2002</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2002/09/24 12:37pm</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">你要自己在/etc/xinetd.d/目录下创建一个pop3文件,至于这个文件的内容怎么写,你可以参照这个目录下其它文件的内容.</td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=林晓风" target="_blank">林晓风</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2002/11/01 04:05pm</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">请问<br />
                                        我在 redhat linux 7.1 上配置的 sendmail 邮箱在outlook里为什么不能发邮件? 收邮件正常<br />
                                        默认情况下,smtp 端口不是打开的么?<br />
                                        我发邮件时,出错如下: &nbsp; &nbsp; &nbsp; &nbsp;
                                        <p>无法连接到服务器。 帐户: '172.1.0.3', 服务器: '172.1.0.3', 协议: SMTP, 端口: 25, 安全(SSL): 否, 套接字错误: 10061, 错误号: 0x800CCC0E
                                        <p>我该怎么办呢?
                                        <p>&nbsp;</p>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=aaron2002" target="_blank">aaron2002</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2002/11/01 04:18pm</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">"无法连接到服务器"???<br />
                                        请确认你的服务器是否正常运行,SMTP端口是否打开.<br />
                                        telnet x.x.x.x 25<br />
                                        </td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=林晓风" target="_blank">林晓风</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2002/11/01 04:27pm</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">我在 &nbsp;win98 &nbsp;的 outlook 里能正常收信啊,
                                        <p>在发信时报那种错
                                        <p>redhat linux 7.1中 smtp 不是默认打开的吗?
                                        <p># netstat -a | grep "smtp" <br />
                                        tcp &nbsp; 0 &nbsp; 0 &nbsp; &nbsp;localhost:smtp &nbsp; &nbsp;*:* &nbsp; &nbsp;listen
                                        <p>c:&gt;telnet linuxhost smtp<br />
                                        &nbsp;无法打开到主机的连接 在 smtp 端口:连接失败
                                        <p>&nbsp;</p>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=林晓风" target="_blank">林晓风</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2002/11/01 04:52pm</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">&nbsp;aaron2002 &nbsp; ,救救我啊</td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=林晓风" target="_blank">林晓风</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2002/11/04 05:28pm</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">救救我啊 </td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=deep-way" target="_blank">deep-way</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2002/11/07 10:11am</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">我装了Red Hat linux 7.2，sendmail也是自带的，版本是V9<br />
                                        DNS都已经检查过，完全正常。<br />
                                        POP协议是装在/etc/xinetd.d下pop文件（自己建的），netstat 已经看到0.0.0.0:110<br />
                                        sendmail用ps -ef监测也是工作正常<br />
                                        sendmail.cf和access文件也已经设置过<br />
                                        问题是，我在outlook express里设置了账号，收邮件时报错<br />
                                        报错信息为：<br />
                                        POP3服务器已经60秒内没有响应。是否继续等待60秒以便服务器响应<br />
                                        账户：xxx.test.com<br />
                                        服务器：xxx.test.com
                                        <p>不知是何原因？请各位大侠指教</p>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=brucectl" target="_blank">brucectl</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2002/11/13 06:25pm</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">你的DNS服务器有问题！<br />
                                        </td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=李勇" target="_blank">李勇</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2002/11/14 08:18pm</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">Red Hat linux 7.1，<br />
                                        sendmail,pop3都起来了<br />
                                        用foxmail可以发信成功（没有错误信息），可是foxmail收不到。<br />
                                        在linux下用mail发信，foxmail却可以收到。<br />
                                        不知是何原因？请各位大侠指教
                                        <p>&nbsp;</p>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=wildcamel" target="_blank">wildcamel</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2002/11/15 09:36am</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">[这个贴子最后由wildcamel在 2002/11/15 09:45am 编辑]<br />
                                        <br />
                                        "我在 &nbsp;win98 &nbsp;的 outlook 里能正常收信啊,<br />
                                        在发信时报那种错
                                        <p>redhat linux 7.1中 smtp 不是默认打开的吗?
                                        <p># netstat -a | grep "smtp" <br />
                                        tcp &nbsp; 0 &nbsp; 0 &nbsp; &nbsp;localhost:smtp &nbsp; &nbsp;*:* &nbsp; &nbsp;listen
                                        <p>c:&gt;telnet linuxhost smtp<br />
                                        无法打开到主机的连接 在 smtp 端口:连接失败 """"<br />
                                        <br />
                                        sendmail.cf <br />
                                        # SMTP daemon options
                                        <p>O DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA 改成
                                        <p>O DaemonPortOptions=Port=smtp,Addr=你的主机ip, Name=MTA</p>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=林晓风" target="_blank">林晓风</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2002/11/15 09:50am</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">李勇,<br />
                                        你的问题跟我的一样啊
                                        <p>可就是没人回答
                                        <p>哎.... 世态炎凉啊</p>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=李勇" target="_blank">李勇</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2002/11/15 09:51am</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">sendmail.cf 这个我已改了<br />
                                        另外在这个文件中 Cwlocalhost=主机ip<br />
                                        是不是应该这样。<br />
                                        我在两台机器7.1,7.2上都试过了，都是同样的毛病？？？？<br />
                                        大家救命啊<br />
                                        </td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=lzyking" target="_blank">lzyking</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2002/11/19 06:32am</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">Cwlocalhost 后面不要写 IP ,应该是这样 &nbsp; Cwlocalhost mail.domain.com domain.com<br />
                                        7.1的版本还应该<br />
                                        找到 O DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA 改成<br />
                                        O DaemonPortOptions=Port=smtp,Addr=你的主机ip, Name=MTA <br />
                                        7.2往后的版本要在上面的这行前面加一个 # ,使他不起作用.<br />
                                        注意重新启动 sendmail,命令为 /etc/rc.d/init.d/sendmail restart
                                        <p>之后,打开telnet, telnet ip 25 看能否上去(上去后可能什么都不显示,打help看看),要是可以的话,说明 sendmail没有问题 &nbsp;
                                        <p>你是否安了imap呢(默认系统没有安装 pop3 服务,请安装第2张盘里的 imap),<br />
                                        在telnet ip 110, 如果出现 OK 就好了,还要注意 DNS 中设MX记录
                                        <p>good luck<br />
                                        </p>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=logitec" target="_blank">logitec</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2003/01/03 05:21pm</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">[quote][b]下面引用由[u]李勇[/u]在 [i]2002/11/14 08:18pm[/i] 发表的内容：[/b]<br />
                                        Red Hat linux 7.1，<br />
                                        sendmail,pop3都起来了<br />
                                        用foxmail可以发信成功（没有错误信息），可是foxmail收不到。<br />
                                        在linux下用mail发信，foxmail却可以收到。<br />
                                        ...<br />
                                        [/quote]<br />
                                        哈哈，原来为此问题郁闷的不是我一个人阿。<br />
                                        OE也可以，WEBMAIL也可以，就是FOXMAIL不可以。我已经给FOXMAIL报告了，等等看有没有解决方案。</td>
                                    </tr>
                                    <tr>
                                        <td align="right" bgcolor="#eeeeee" colspan="2">&nbsp;</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table style="table-layout: fixed" cellspacing="1" cellpadding="8" width="100%" border="0">
                                <tbody>
                                    <tr>
                                        <td valign="top" width="20%" bgcolor="#ffffff" rowspan="2"><font color="#000000"><strong><a href="http://www.chinaunix.net/cgi-bin/bbs/profile.cgi?action=show&amp;member=chenjbok" target="_blank">chenjbok</a></strong></font></td>
                                        <td bgcolor="#ffffff"><font color="#000000"><strong>发表于： 2003/01/03 09:13pm</strong><br />
                                        </font></td>
                                    </tr>
                                    <tr>
                                        <td style="left: 0px; width: 100%; word-wrap: break-word" bgcolor="#ffffff">所有设置完成，我应如何添加邮件新用户？</td>
                                    </tr>
                                </tbody>
                            </table>
                            </td>
                        </tr>
                    </tbody>
                </table>
                </td>
            </tr>
        </tbody>
    </table>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/161924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-11-20 19:41 <a href="http://www.blogjava.net/liaojiyong/archive/2007/11/20/161924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VIM的几个简单常用的命令</title><link>http://www.blogjava.net/liaojiyong/archive/2007/11/16/161009.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 16 Nov 2007 06:17:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/11/16/161009.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/161009.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/11/16/161009.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/161009.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/161009.html</trackback:ping><description><![CDATA[<ol>
    <li>按Esc确保没在编辑状态
    <li>输入:q 退出
    <li>输入:w保存
    <li>输入:wq就是先保存再退出
    <li>拷贝是yy，拷贝多行是 数字+yy （比如15yy）:先输入 :4 转到第4行，然后按 7yy复制七行
    <li>删除是dd，删除多行是 数字+dd
    <li>粘贴是p
    <li>在当前行后面新加一行，按 o<br />
    查找某个独立的单词（比如说函数名），把光标移到字符串上（随便哪个字上），按 * 号<br />
    会自动查找 /\&lt;aaa\&gt; 这样子的<br />
    取消就是 :noh<br />
    按 n 查找下一个， Shift+n是上一个</li>
</ol>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/161009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-11-16 14:17 <a href="http://www.blogjava.net/liaojiyong/archive/2007/11/16/161009.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POI操作Excel文档－中级篇（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/11/14/160640.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 14 Nov 2007 14:27:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/11/14/160640.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/160640.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/11/14/160640.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/160640.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/160640.html</trackback:ping><description><![CDATA[<div style="margin-top: 10px; margin-left: 15px; overflow: auto">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p><strong>1、遍历workbook</strong> <br />
            <div class="code_title">代码</div>
            <div class="code_div">
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span class="comment">//&nbsp;load源文件 </span><span>&nbsp;&nbsp;</span></span></li>
                <li class=""><span>POIFSFileSystem&nbsp;fs&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;POIFSFileSystem(</span><span class="keyword">new</span><span>&nbsp;FileInputStream(filePath)); &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>HSSFWorkbook&nbsp;wb&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HSSFWorkbook(fs); &nbsp;&nbsp;</span></span></li>
                <li class=""><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;wb.getNumberOfSheets();&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;HSSFSheet&nbsp;sheet&nbsp;=&nbsp;wb.getSheetAt(i); &nbsp;&nbsp;</span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;sheet.getFirstRowNum();&nbsp;i&nbsp;&lt;&nbsp;sheet.getLastRowNum();&nbsp;i&nbsp;++)&nbsp;{ &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;HSSFRow&nbsp;row&nbsp;=&nbsp;sheet.getRow(i); &nbsp;&nbsp;</span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(row&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;。。。操作} &nbsp;&nbsp;</span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
                <li class=""><span class="comment">//&nbsp;目标文件 </span><span>&nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>FileOutputStream&nbsp;fos&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;FileOutputStream(objectPath); &nbsp;&nbsp;</span></span></li>
                <li class=""><span class="comment">//写文件 </span><span>&nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>swb.write(fos); &nbsp;&nbsp;</span></li>
                <li class=""><span>fos.close();&nbsp;&nbsp;</span></li>
            </ol>
            </div>
            </div>
            <script>render_code();</script>
            <p>&nbsp;</p>
            <p><strong>2、得到列和单元格</strong> <br />
            <div class="code_title">代码</div>
            <div class="code_div">
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span>HSSFRow&nbsp;row&nbsp;=&nbsp;sheet.getRow(i); &nbsp;&nbsp;</span></span></li>
                <li class=""><span>HSSFCell&nbsp;cell&nbsp;=&nbsp;row.getCell((</span><span class="keyword">short</span><span>)&nbsp;j);&nbsp;&nbsp;</span></span></li>
            </ol>
            </div>
            </div>
            <script>render_code();</script>
            <p>&nbsp;</p>
            <p><strong>3、设置sheet名称和单元格内容为中文</strong> <br />
            <div class="code_title">代码</div>
            <div class="code_div">
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span>wb.setSheetName(n,&nbsp;</span><span class="string">"中文"</span><span>,HSSFCell.ENCODING_UTF_16);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
                <li class=""><span>cell.setEncoding((</span><span class="keyword">short</span><span>)&nbsp;</span><span class="number">1</span><span>); &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>cell.setCellValue(</span><span class="string">"中文"</span><span>);&nbsp;&nbsp;</span></span></li>
            </ol>
            </div>
            </div>
            <script>render_code();</script>
            <p>&nbsp;</p>
            <p><strong>4、单元格内容未公式或数值，可以这样读写</strong> <br />
            <div class="code_title">代码</div>
            <div class="code_div">
            <div class="dp-highlighter">
            <ol class="dp-j">
                <li class="alt"><span><span>cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); &nbsp;&nbsp;</span></span></li>
                <li class=""><span>cell.getNumericCellValue()&nbsp;&nbsp;</span></li>
            </ol>
            </div>
            </div>
            <script>render_code();</script>
            <p>&nbsp;</p>
            <p><strong><br />
            5、设置列宽、行高</strong> <br />
            <div class="code_title">代码</div>
            <div class="code_div">
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span>sheet.setColumnWidth((</span><span class="keyword">short</span><span>)column,(</span><span class="keyword">short</span><span>)width); &nbsp;&nbsp;</span></span></li>
                <li class=""><span>row.setHeight((</span><span class="keyword">short</span><span>)height);&nbsp;&nbsp;</span></span></li>
            </ol>
            </div>
            </div>
            <script>render_code();</script>
            <p>&nbsp;</p>
            <p><strong><br />
            6、添加区域，合并单元格</strong> <br />
            <div class="code_title">代码</div>
            <div class="code_div">
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span>Region&nbsp;region&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Region((</span><span class="keyword">short</span><span>)rowFrom,(</span><span class="keyword">short</span><span>)columnFrom,(</span><span class="keyword">short</span><span>)rowTo,(</span><span class="keyword">short</span><span>)columnTo); &nbsp;&nbsp;</span></span></li>
                <li class=""><span>sheet.addMergedRegion(region); &nbsp;&nbsp;</span></li>
                <li class="alt"><span class="comment">//得到所有区域 </span><span>&nbsp;&nbsp;</span></span></li>
                <li class=""><span>sheet.getNumMergedRegions()&nbsp;&nbsp;</span></li>
            </ol>
            </div>
            </div>
            <script>render_code();</script>
            <p>&nbsp;</p>
            <p><strong>7、常用方法</strong> <br />
            根据单元格不同属性返回字符串数值 <br />
            <div class="code_title">代码</div>
            <div class="code_div">
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span class="keyword">public</span><span>&nbsp;String&nbsp;getCellStringValue(HSSFCell&nbsp;cell)&nbsp;{ &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;cellValue&nbsp;=&nbsp;</span><span class="string">""</span><span>; &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">switch</span><span>&nbsp;(cell.getCellType())&nbsp;{ &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;HSSFCell.CELL_TYPE_STRING: &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cellValue&nbsp;=&nbsp;cell.getStringCellValue(); &nbsp;&nbsp;</span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(cellValue.trim().equals(</span><span class="string">""</span><span>)||cellValue.trim().length()&lt;=</span><span class="number">0</span><span>) &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cellValue=</span><span class="string">"&nbsp;"</span><span>; &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;HSSFCell.CELL_TYPE_NUMERIC: &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cellValue&nbsp;=&nbsp;String.valueOf(cell.getNumericCellValue()); &nbsp;&nbsp;</span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;HSSFCell.CELL_TYPE_FORMULA: &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); &nbsp;&nbsp;</span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cellValue&nbsp;=&nbsp;String.valueOf(cell.getNumericCellValue()); &nbsp;&nbsp;</span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;HSSFCell.CELL_TYPE_BLANK: &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cellValue=</span><span class="string">"&nbsp;"</span><span>; &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;HSSFCell.CELL_TYPE_BOOLEAN: &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;HSSFCell.CELL_TYPE_ERROR: &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">default</span><span>: &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;cellValue; &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
            </ol>
            </div>
            </div>
            <script>render_code();</script><br />
            <strong><br />
            8、常用单元格边框格式</strong>
            <p>&nbsp;</p>
            <p>虚线HSSFCellStyle.BORDER_DOTTED <br />
            实线HSSFCellStyle.BORDER_THIN <br />
            <div class="code_title">代码</div>
            <div class="code_div">
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;HSSFCellStyle&nbsp;getCellStyle(</span><span class="keyword">short</span><span>&nbsp;type) &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSSFWorkbook&nbsp;wb&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HSSFWorkbook(); &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSSFCellStyle&nbsp;style&nbsp;=&nbsp;wb.createCellStyle(); &nbsp;&nbsp;</span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.setBorderBottom(type);</span><span class="comment">//下边框&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.setBorderLeft(type);</span><span class="comment">//左边框&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.setBorderRight(type);</span><span class="comment">//右边框&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.setBorderTop(type);</span><span class="comment">//上边框&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;style; &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
            </ol>
            </div>
            </div>
            <script>render_code();</script><br />
            <strong><br />
            9、设置字体和内容位置</strong> <br />
            <div class="code_title">代码</div>
            <div class="code_div">
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span>HSSFFont&nbsp;f&nbsp;&nbsp;=&nbsp;wb.createFont(); &nbsp;&nbsp;</span></span></li>
                <li class=""><span>f.setFontHeightInPoints((</span><span class="keyword">short</span><span>)&nbsp;</span><span class="number">11</span><span>);</span><span class="comment">//字号 </span><span>&nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);</span><span class="comment">//加粗 </span><span>&nbsp;&nbsp;</span></span></li>
                <li class=""><span>style.setFont(f); &nbsp;&nbsp;</span></li>
                <li class="alt"><span>style.setAlignment(HSSFCellStyle.ALIGN_CENTER);</span><span class="comment">//左右居中 </span><span>&nbsp;&nbsp;</span></span></li>
                <li class=""><span>style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);</span><span class="comment">//上下居中 </span><span>&nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>style.setRotation(</span><span class="keyword">short</span><span>&nbsp;rotation);</span><span class="comment">//单元格内容的旋转的角度 </span><span>&nbsp;&nbsp;</span></span></li>
                <li class=""><span>HSSFDataFormat&nbsp;df&nbsp;=&nbsp;wb.createDataFormat(); &nbsp;&nbsp;</span></li>
                <li class="alt"><span>style1.setDataFormat(df.getFormat(</span><span class="string">"0.00%"</span><span>));</span><span class="comment">//设置单元格数据格式 </span><span>&nbsp;&nbsp;</span></span></li>
                <li class=""><span>cell.setCellFormula(string);</span><span class="comment">//给单元格设公式 </span><span>&nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>style.setRotation(</span><span class="keyword">short</span><span>&nbsp;rotation);</span><span class="comment">//单元格内容的旋转的角度 </span><span>&nbsp;&nbsp;</span></span></li>
                <li class=""><span>cell.setCellStyle(style); &nbsp;&nbsp;</span></li>
            </ol>
            </div>
            </div>
            <script>render_code();</script><br />
            <strong><br />
            10、插入图片</strong> <br />
            论坛里看到的 <br />
            <div class="code_title">代码</div>
            <div class="code_div">
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span class="comment">//先把读进来的图片放到一个ByteArrayOutputStream中，以便产生ByteArray </span><span>&nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayOutputStream&nbsp;byteArrayOut&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ByteArrayOutputStream(); &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedImage&nbsp;bufferImg&nbsp;=&nbsp;ImageIO.read(</span><span class="keyword">new</span><span>&nbsp;File(</span><span class="string">"ok.jpg"</span><span>)); &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImageIO.write(bufferImg,</span><span class="string">"jpg"</span><span>,byteArrayOut); &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span class="comment">//读进一个excel模版 </span><span>&nbsp;&nbsp;</span></span></li>
                <li class=""><span>FileInputStream&nbsp;fos&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;FileInputStream(filePathName+</span><span class="string">"/stencil.xlt"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>fs&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;POIFSFileSystem(fos); &nbsp;&nbsp;</span></span></li>
                <li class=""><span class="comment">//创建一个工作薄 </span><span>&nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>HSSFWorkbook&nbsp;wb&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HSSFWorkbook(fs); &nbsp;&nbsp;</span></span></li>
                <li class=""><span>HSSFSheet&nbsp;sheet&nbsp;=&nbsp;wb.getSheetAt(</span><span class="number">0</span><span>); &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>HSSFPatriarch&nbsp;patriarch&nbsp;=&nbsp;sheet.createDrawingPatriarch(); &nbsp;&nbsp;</span></li>
                <li class=""><span>HSSFClientAnchor&nbsp;anchor&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HSSFClientAnchor(</span><span class="number">0</span><span>,</span><span class="number">0</span><span>,</span><span class="number">1023</span><span>,</span><span class="number">255</span><span>,(</span><span class="keyword">short</span><span>)&nbsp;</span><span class="number">0</span><span>,</span><span class="number">0</span><span>,(</span><span class="keyword">short</span><span>)</span><span class="number">10</span><span>,</span><span class="number">10</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>patriarch.createPicture(anchor&nbsp;,&nbsp;wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));&nbsp;&nbsp;</span></li>
            </ol>
            </div>
            </div>
            <script>render_code();</script>
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/160640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-11-14 22:27 <a href="http://www.blogjava.net/liaojiyong/archive/2007/11/14/160640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POI操作Excel文档－基础篇（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/11/14/160639.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 14 Nov 2007 14:26:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/11/14/160639.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/160639.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/11/14/160639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/160639.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/160639.html</trackback:ping><description><![CDATA[<div style="margin-top: 5px; margin-left: 15px"><strong>关键字:</strong> &nbsp; poi&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div style="margin-top: 10px; margin-left: 15px; overflow: auto">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p><strong>一．POI简介 </strong></p>
            <p>Jakarta POI 是apache的子项目，目标是处理ole2对象。它提供了一组操纵Windows文档的Java API </p>
            <p>目前比较成熟的是HSSF接口，处理MS Excel（97-2002）对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西，而是真正的Excel对象，你可以控制一些属性如sheet,cell等等。 </p>
            <p><strong>二．HSSF概况 </strong></p>
            <p>HSSF 是Horrible SpreadSheet Format的缩写，也即&#8220;讨厌的电子表格格式&#8221;。 也许HSSF的名字有点滑稽，就本质而言它是一个非常严肃、正规的API。通过HSSF，你可以用纯Java代码来读取、写入、修改Excel文件。 </p>
            <p>HSSF 为读取操作提供了两类API：usermodel和eventusermodel，即&#8220;用户模型&#8221;和&#8220;事件-用户模型&#8221;。前者很好理解，后者比较抽象，但操作效率要高得多。 <br />
            <strong><br />
            三．开始编码 </strong></p>
            <p><span style="color: red">1 ． 准备工作 </span></p>
            <p>要求:JDK 1.4+POI开发包 </p>
            <p>可以到 http://www.apache.org/dyn/closer.cgi/jakarta/poi/ 最新的POI工具包 </p>
            <p><span style="color: red">2 ． EXCEL 结构 </span></p>
            <p>HSSFWorkbook excell 文档对象介绍 <br />
            HSSFSheet excell的表单 <br />
            HSSFRow excell的行 <br />
            HSSFCell excell的格子单元 <br />
            HSSFFont excell字体 <br />
            HSSFName 名称 <br />
            HSSFDataFormat 日期格式 <br />
            在poi1.7中才有以下2项： <br />
            HSSFHeader sheet头 <br />
            HSSFFooter sheet尾 <br />
            和这个样式 <br />
            HSSFCellStyle cell样式 <br />
            辅助操作包括 <br />
            HSSFDateUtil 日期 <br />
            HSSFPrintSetup 打印 <br />
            HSSFErrorConstants 错误信息表 <br />
            <span style="color: red"><br />
            3 ．具体用法实例 （采用 usermodel ） </span></p>
            <p>如何读Excel </p>
            <p>读取Excel文件时，首先生成一个POIFSFileSystem对象，由POIFSFileSystem对象构造一个HSSFWorkbook，该HSSFWorkbook对象就代表了Excel文档。下面代码读取上面生成的Excel文件写入的消息字串： <br />
            <div class="code_title">代码</div>
            <div class="code_div">
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span>POIFSFileSystem&nbsp;fs=newPOIFSFileSystem(</span><span class="keyword">new</span><span>&nbsp;FileInputStream(</span><span class="string">"d:\test.xls"</span><span>));&nbsp; &nbsp;&nbsp;</span></span></li>
                <li class=""><span>HSSFWorkbook&nbsp;　wb&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HSSFWorkbook(fs);&nbsp; &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>　　}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
                <li class=""><span>　　e.printStackTrace();&nbsp; &nbsp;&nbsp;</span></li>
                <li class="alt"><span>　　}&nbsp; &nbsp;&nbsp;</span></li>
                <li class=""><span>　　HSSFSheet&nbsp;sheet&nbsp;=&nbsp;wb.getSheetAt(</span><span class="number">0</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>　　HSSFRow&nbsp;row&nbsp;=&nbsp;sheet.getRow(</span><span class="number">0</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
                <li class=""><span>　　HSSFCell&nbsp;cell&nbsp;=&nbsp;row.getCell((</span><span class="keyword">short</span><span>)&nbsp;</span><span class="number">0</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
                <li class="alt"><span>　　String&nbsp;msg&nbsp;=&nbsp;cell.getStringCellValue();&nbsp;&nbsp;&nbsp;</span></li>
            </ol>
            </div>
            </div>
            <script>render_code();</script>
            <p>&nbsp;</p>
            <p>如何写excel， </p>
            <p>将excel的第一个表单第一行的第一个单元格的值写成&#8220;a test&#8221;。 </p>
            <p>
            <div class="code_title">代码</div>
            <div class="code_div">
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span>POIFSFileSystem&nbsp;fs&nbsp;=</span><span class="keyword">new</span><span>&nbsp;POIFSFileSystem(</span><span class="keyword">new</span><span>&nbsp;FileInputStream(</span><span class="string">"workbook.xls"</span><span>));&nbsp; &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;</span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;HSSFWorkbook&nbsp;wb&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HSSFWorkbook(fs);&nbsp; &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;</span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;HSSFSheet&nbsp;sheet&nbsp;=&nbsp;wb.getSheetAt(</span><span class="number">0</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;</span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;HSSFRow&nbsp;row&nbsp;=&nbsp;sheet.getRow(</span><span class="number">0</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;</span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;HSSFCell&nbsp;cell&nbsp;=&nbsp;row.getCell((</span><span class="keyword">short</span><span>)</span><span class="number">0</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;</span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;cell.setCellValue(</span><span class="string">"a&nbsp;test"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;</span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Write&nbsp;the&nbsp;output&nbsp;to&nbsp;a&nbsp;file&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;</span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;FileOutputStream&nbsp;fileOut&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;FileOutputStream(</span><span class="string">"workbook.xls"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
                <li class=""><span>&nbsp;&nbsp;</span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;wb.write(fileOut);&nbsp; &nbsp;&nbsp;</span></li>
                <li class=""><span>&nbsp;&nbsp;</span></li>
                <li class="alt"><span>fileOut.close();&nbsp;&nbsp;&nbsp;</span></li>
            </ol>
            </div>
            </div>
            <script>render_code();</script>
            <p>&nbsp;</p>
            <p><span style="color: red">4 ． 可参考文档 </span></p>
            <p>POI 主页：http://jakarta.apache.org/poi/， </p>
            <p>初学者如何快速上手使用POI HSSF </p>
            <p><a href="http://jakarta.apache.org/poi/hssf/quick-guide.html%20。" target="blank">http://jakarta.apache.org/poi/hssf/quick-guide.html 。 </a></p>
            <p>代码例子 http://blog.java-cn.com/user1/6749/archives/2005/18347.html </p>
            <p>里面有很多例子代码，可以很方便上手。 <br />
            <strong><br />
            四．使用心得 </strong></p>
            <p>POI HSSF 的usermodel包把Excel文件映射成我们熟悉的结构，诸如Workbook、Sheet、Row、Cell等，它把整个结构以一组对象的形式保存在内存之中，便于理解，操作方便，基本上能够满足我们的要求，所以说这个一个不错的选择。</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/160639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-11-14 22:26 <a href="http://www.blogjava.net/liaojiyong/archive/2007/11/14/160639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POI Excel整理(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/11/14/160638.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 14 Nov 2007 14:25:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/11/14/160638.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/160638.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/11/14/160638.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/160638.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/160638.html</trackback:ping><description><![CDATA[<p>1.创建工作簿 (WORKBOOK)<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
2.创建工作表（SHEET）<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet1 = wb.createSheet("new sheet");<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet2 = wb.createSheet("second sheet");<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
3.创建单元格(CELL)<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet = wb.createSheet("new sheet");<br />
&nbsp;&nbsp;&nbsp; // Create a row and put some cells in it. Rows are 0 based.<br />
&nbsp;&nbsp;&nbsp; HSSFRow row = sheet.createRow((short)0);<br />
&nbsp;&nbsp;&nbsp; // Create a cell and put a value in it.<br />
&nbsp;&nbsp;&nbsp; HSSFCell cell = row.createCell((short)0);<br />
&nbsp;&nbsp;&nbsp; cell.setCellValue(1);<br />
&nbsp;&nbsp;&nbsp; // Or do it on one line.<br />
&nbsp;&nbsp;&nbsp; row.createCell((short)1).setCellValue(1.2);<br />
&nbsp;&nbsp;&nbsp; row.createCell((short)2).setCellValue("This is a string");<br />
&nbsp;&nbsp;&nbsp; row.createCell((short)3).setCellValue(true);<br />
&nbsp;&nbsp;&nbsp; // Write the output to a file<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
4.创建指定单元格式的单元格<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet = wb.createSheet("new sheet");<br />
&nbsp;&nbsp;&nbsp; // Create a row and put some cells in it. Rows are 0 based.<br />
&nbsp;&nbsp;&nbsp; HSSFRow row = sheet.createRow((short)0);<br />
&nbsp;&nbsp;&nbsp; // Create a cell and put a date value in it.&nbsp; The first cell is not styled<br />
&nbsp;&nbsp;&nbsp; // as a date.<br />
&nbsp;&nbsp;&nbsp; HSSFCell cell = row.createCell((short)0);<br />
&nbsp;&nbsp;&nbsp; cell.setCellValue(new Date());<br />
&nbsp;&nbsp;&nbsp; // we style the second cell as a date (and time).&nbsp; It is important to<br />
&nbsp;&nbsp;&nbsp; // create a new cell style from the workbook otherwise you can end up<br />
&nbsp;&nbsp;&nbsp; // modifying the built in style and effecting not only this cell but other cells.<br />
&nbsp;&nbsp;&nbsp; HSSFCellStyle cellStyle = wb.createCellStyle();<br />
&nbsp;&nbsp;&nbsp; cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));<br />
&nbsp;&nbsp;&nbsp; cell = row.createCell((short)1);<br />
&nbsp;&nbsp;&nbsp; cell.setCellValue(new Date());<br />
&nbsp;&nbsp;&nbsp; cell.setCellStyle(cellStyle);<br />
&nbsp;&nbsp;&nbsp; // Write the output to a file<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
5. 单元格的不同格式<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet = wb.createSheet("new sheet");<br />
&nbsp;&nbsp;&nbsp; HSSFRow row = sheet.createRow((short)2);<br />
&nbsp;&nbsp;&nbsp; row.createCell((short) 0).setCellValue(1.1);<br />
&nbsp;&nbsp;&nbsp; row.createCell((short) 1).setCellValue(new Date());<br />
&nbsp;&nbsp;&nbsp; row.createCell((short) 2).setCellValue("a string");<br />
&nbsp;&nbsp;&nbsp; row.createCell((short) 3).setCellValue(true);<br />
&nbsp;&nbsp;&nbsp; row.createCell((short) 4).setCellType(HSSFCell.CELL_TYPE_ERROR);<br />
&nbsp;&nbsp;&nbsp; // Write the output to a file<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
6.单元格的不通对齐方式<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws IOException<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HSSFSheet sheet = wb.createSheet("new sheet");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HSSFRow row = sheet.createRow((short) 2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createCell(wb, row, (short) 0, HSSFCellStyle.ALIGN_CENTER);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createCell(wb, row, (short) 1, HSSFCellStyle.ALIGN_CENTER_SELECTION);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createCell(wb, row, (short) 2, HSSFCellStyle.ALIGN_FILL);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createCell(wb, row, (short) 3, HSSFCellStyle.ALIGN_GENERAL);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createCell(wb, row, (short) 4, HSSFCellStyle.ALIGN_JUSTIFY);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createCell(wb, row, (short) 5, HSSFCellStyle.ALIGN_LEFT);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createCell(wb, row, (short) 6, HSSFCellStyle.ALIGN_RIGHT);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Write the output to a file<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileOut.close();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Creates a cell and aligns it a certain way.<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param wb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the workbook<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param row&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the row to create the cell in<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param column&nbsp;&nbsp;&nbsp; the column number to create the cell in<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param align&nbsp;&nbsp;&nbsp;&nbsp; the alignment for the cell.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private static void createCell(HSSFWorkbook wb, HSSFRow row, short column, short align)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HSSFCell cell = row.createCell(column);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cell.setCellValue("Align It");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HSSFCellStyle cellStyle = wb.createCellStyle();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cellStyle.setAlignment(align);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cell.setCellStyle(cellStyle);<br />
&nbsp;&nbsp;&nbsp; }<br />
7.单元格的边框设置<br />
Working with borders<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet = wb.createSheet("new sheet");<br />
&nbsp;&nbsp;&nbsp; // Create a row and put some cells in it. Rows are 0 based.<br />
&nbsp;&nbsp;&nbsp; HSSFRow row = sheet.createRow((short) 1);<br />
&nbsp;&nbsp;&nbsp; // Create a cell and put a value in it.<br />
&nbsp;&nbsp;&nbsp; HSSFCell cell = row.createCell((short) 1);<br />
&nbsp;&nbsp;&nbsp; cell.setCellValue(4);<br />
&nbsp;&nbsp;&nbsp; // Style the cell with borders all around.<br />
&nbsp;&nbsp;&nbsp; HSSFCellStyle style = wb.createCellStyle();<br />
&nbsp;&nbsp;&nbsp; style.setBorderBottom(HSSFCellStyle.BORDER_THIN);<br />
&nbsp;&nbsp;&nbsp; style.setBottomBorderColor(HSSFColor.BLACK.index);<br />
&nbsp;&nbsp;&nbsp; style.setBorderLeft(HSSFCellStyle.BORDER_THIN);<br />
&nbsp;&nbsp;&nbsp; style.setLeftBorderColor(HSSFColor.GREEN.index);<br />
&nbsp;&nbsp;&nbsp; style.setBorderRight(HSSFCellStyle.BORDER_THIN);<br />
&nbsp;&nbsp;&nbsp; style.setRightBorderColor(HSSFColor.BLUE.index);<br />
&nbsp;&nbsp;&nbsp; style.setBorderTop(HSSFCellStyle.BORDER_MEDIUM_DASHED);<br />
&nbsp;&nbsp;&nbsp; style.setTopBorderColor(HSSFColor.BLACK.index);<br />
&nbsp;&nbsp;&nbsp; cell.setCellStyle(style);<br />
&nbsp;&nbsp;&nbsp; // Write the output to a file<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
8.填充和颜色设置<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet = wb.createSheet("new sheet");<br />
&nbsp;&nbsp;&nbsp; // Create a row and put some cells in it. Rows are 0 based.<br />
&nbsp;&nbsp;&nbsp; HSSFRow row = sheet.createRow((short) 1);<br />
&nbsp;&nbsp;&nbsp; // Aqua background<br />
&nbsp;&nbsp;&nbsp; HSSFCellStyle style = wb.createCellStyle();<br />
&nbsp;&nbsp;&nbsp; style.setFillBackgroundColor(HSSFColor.AQUA.index);<br />
&nbsp;&nbsp;&nbsp; style.setFillPattern(HSSFCellStyle.BIG_SPOTS);<br />
&nbsp;&nbsp;&nbsp; HSSFCell cell = row.createCell((short) 1);<br />
&nbsp;&nbsp;&nbsp; cell.setCellValue("X");<br />
&nbsp;&nbsp;&nbsp; cell.setCellStyle(style);<br />
&nbsp;&nbsp;&nbsp; // Orange "foreground", foreground being the fill foreground not the font color.<br />
&nbsp;&nbsp;&nbsp; style = wb.createCellStyle();<br />
&nbsp;&nbsp;&nbsp; style.setFillForegroundColor(HSSFColor.ORANGE.index);<br />
&nbsp;&nbsp;&nbsp; style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);<br />
&nbsp;&nbsp;&nbsp; cell = row.createCell((short) 2);<br />
&nbsp;&nbsp;&nbsp; cell.setCellValue("X");<br />
&nbsp;&nbsp;&nbsp; cell.setCellStyle(style);<br />
&nbsp;&nbsp;&nbsp; // Write the output to a file<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
9.合并单元格操作<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet = wb.createSheet("new sheet");<br />
&nbsp;&nbsp;&nbsp; HSSFRow row = sheet.createRow((short) 1);<br />
&nbsp;&nbsp;&nbsp; HSSFCell cell = row.createCell((short) 1);<br />
&nbsp;&nbsp;&nbsp; cell.setCellValue("This is a test of merging");<br />
&nbsp;&nbsp;&nbsp; sheet.addMergedRegion(new Region(1,(short)1,1,(short)2));<br />
&nbsp;&nbsp;&nbsp; // Write the output to a file<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
10.字体设置<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet = wb.createSheet("new sheet");<br />
&nbsp;&nbsp;&nbsp; // Create a row and put some cells in it. Rows are 0 based.<br />
&nbsp;&nbsp;&nbsp; HSSFRow row = sheet.createRow((short) 1);<br />
&nbsp;&nbsp;&nbsp; // Create a new font and alter it.<br />
&nbsp;&nbsp;&nbsp; HSSFFont font = wb.createFont();<br />
&nbsp;&nbsp;&nbsp; font.setFontHeightInPoints((short)24);<br />
&nbsp;&nbsp;&nbsp; font.setFontName("Courier New");<br />
&nbsp;&nbsp;&nbsp; font.setItalic(true);<br />
&nbsp;&nbsp;&nbsp; font.setStrikeout(true);<br />
&nbsp;&nbsp;&nbsp; // Fonts are set into a style so create a new one to use.<br />
&nbsp;&nbsp;&nbsp; HSSFCellStyle style = wb.createCellStyle();<br />
&nbsp;&nbsp;&nbsp; style.setFont(font);<br />
&nbsp;&nbsp;&nbsp; // Create a cell and put a value in it.<br />
&nbsp;&nbsp;&nbsp; HSSFCell cell = row.createCell((short) 1);<br />
&nbsp;&nbsp;&nbsp; cell.setCellValue("This is a test of fonts");<br />
&nbsp;&nbsp;&nbsp; cell.setCellStyle(style);<br />
&nbsp;&nbsp;&nbsp; // Write the output to a file<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
11.自定义颜色<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet = wb.createSheet();<br />
&nbsp;&nbsp;&nbsp; HSSFRow row = sheet.createRow((short) 0);<br />
&nbsp;&nbsp;&nbsp; HSSFCell cell = row.createCell((short) 0);<br />
&nbsp;&nbsp;&nbsp; cell.setCellValue("Default Palette");<br />
&nbsp;&nbsp;&nbsp; //apply some colors from the standard palette,<br />
&nbsp;&nbsp;&nbsp; // as in the previous examples.<br />
&nbsp;&nbsp;&nbsp; //we'll use red text on a lime background<br />
&nbsp;&nbsp;&nbsp; HSSFCellStyle style = wb.createCellStyle();<br />
&nbsp;&nbsp;&nbsp; style.setFillForegroundColor(HSSFColor.LIME.index);<br />
&nbsp;&nbsp;&nbsp; style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);<br />
&nbsp;&nbsp;&nbsp; HSSFFont font = wb.createFont();<br />
&nbsp;&nbsp;&nbsp; font.setColor(HSSFColor.RED.index);<br />
&nbsp;&nbsp;&nbsp; style.setFont(font);<br />
&nbsp;&nbsp;&nbsp; cell.setCellStyle(style);<br />
&nbsp;&nbsp;&nbsp; //save with the default palette<br />
&nbsp;&nbsp;&nbsp; FileOutputStream out = new FileOutputStream("default_palette.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(out);<br />
&nbsp;&nbsp;&nbsp; out.close();<br />
&nbsp;&nbsp;&nbsp; //now, let's replace RED and LIME in the palette<br />
&nbsp;&nbsp;&nbsp; // with a more attractive combination<br />
&nbsp;&nbsp;&nbsp; // (lovingly borrowed from freebsd.org)<br />
&nbsp;&nbsp;&nbsp; cell.setCellValue("Modified Palette");<br />
&nbsp;&nbsp;&nbsp; //creating a custom palette for the workbook<br />
&nbsp;&nbsp;&nbsp; HSSFPalette palette = wb.getCustomPalette();<br />
&nbsp;&nbsp;&nbsp; //replacing the standard red with freebsd.org red<br />
&nbsp;&nbsp;&nbsp; palette.setColorAtIndex(HSSFColor.RED.index,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (byte) 153,&nbsp; //RGB red (0-255)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (byte) 0,&nbsp;&nbsp;&nbsp; //RGB green<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (byte) 0&nbsp;&nbsp;&nbsp;&nbsp; //RGB blue<br />
&nbsp;&nbsp;&nbsp; );<br />
&nbsp;&nbsp;&nbsp; //replacing lime with freebsd.org gold<br />
&nbsp;&nbsp;&nbsp; palette.setColorAtIndex(HSSFColor.LIME.index, (byte) 255, (byte) 204, (byte) 102);<br />
&nbsp;&nbsp;&nbsp; //save with the modified palette<br />
&nbsp;&nbsp;&nbsp; // note that wherever we have previously used RED or LIME, the<br />
&nbsp;&nbsp;&nbsp; // new colors magically appear<br />
&nbsp;&nbsp;&nbsp; out = new FileOutputStream("modified_palette.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(out);<br />
&nbsp;&nbsp;&nbsp; out.close();<br />
12.读和重写EXCEL文件<br />
&nbsp;&nbsp;&nbsp; POIFSFileSystem fs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new POIFSFileSystem(new FileInputStream("workbook.xls"));<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook(fs);<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet = wb.getSheetAt(0);<br />
&nbsp;&nbsp;&nbsp; HSSFRow row = sheet.getRow(2);<br />
&nbsp;&nbsp;&nbsp; HSSFCell cell = row.getCell((short)3);<br />
&nbsp;&nbsp;&nbsp; if (cell == null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cell = row.createCell((short)3);<br />
&nbsp;&nbsp;&nbsp; cell.setCellType(HSSFCell.CELL_TYPE_STRING);<br />
&nbsp;&nbsp;&nbsp; cell.setCellValue("a test");<br />
&nbsp;&nbsp;&nbsp; // Write the output to a file<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
13.在EXCEL单元格中使用自动换行<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet s = wb.createSheet();<br />
&nbsp;&nbsp;&nbsp; HSSFRow r = null;<br />
&nbsp;&nbsp;&nbsp; HSSFCell c = null;<br />
&nbsp;&nbsp;&nbsp; HSSFCellStyle cs = wb.createCellStyle();<br />
&nbsp;&nbsp;&nbsp; HSSFFont f = wb.createFont();<br />
&nbsp;&nbsp;&nbsp; HSSFFont f2 = wb.createFont();<br />
&nbsp;&nbsp;&nbsp; cs = wb.createCellStyle();<br />
&nbsp;&nbsp;&nbsp; cs.setFont( f2 );<br />
&nbsp;&nbsp;&nbsp; //Word Wrap MUST be turned on<br />
&nbsp;&nbsp;&nbsp; cs.setWrapText( true );<br />
&nbsp;&nbsp;&nbsp; r = s.createRow( (short) 2 );<br />
&nbsp;&nbsp;&nbsp; r.setHeight( (short) 0x349 );<br />
&nbsp;&nbsp;&nbsp; c = r.createCell( (short) 2 );<br />
&nbsp;&nbsp;&nbsp; c.setCellType( HSSFCell.CELL_TYPE_STRING );<br />
&nbsp;&nbsp;&nbsp; c.setCellValue( "Use \n with word wrap on to create a new line" );<br />
&nbsp;&nbsp;&nbsp; c.setCellStyle( cs );<br />
&nbsp;&nbsp;&nbsp; s.setColumnWidth( (short) 2, (short) ( ( 50 * 8 ) / ( (double) 1 / 20 ) ) );<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream( "workbook.xls" );<br />
&nbsp;&nbsp;&nbsp; wb.write( fileOut );<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
14.数字格式自定义<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet = wb.createSheet("format sheet");<br />
&nbsp;&nbsp;&nbsp; HSSFCellStyle style;<br />
&nbsp;&nbsp;&nbsp; HSSFDataFormat format = wb.createDataFormat();<br />
&nbsp;&nbsp;&nbsp; HSSFRow row;<br />
&nbsp;&nbsp;&nbsp; HSSFCell cell;<br />
&nbsp;&nbsp;&nbsp; short rowNum = 0;<br />
&nbsp;&nbsp;&nbsp; short colNum = 0;<br />
&nbsp;&nbsp;&nbsp; row = sheet.createRow(rowNum++);<br />
&nbsp;&nbsp;&nbsp; cell = row.createCell(colNum);<br />
&nbsp;&nbsp;&nbsp; cell.setCellValue(11111.25);<br />
&nbsp;&nbsp;&nbsp; style = wb.createCellStyle();<br />
&nbsp;&nbsp;&nbsp; style.setDataFormat(format.getFormat("0.0"));<br />
&nbsp;&nbsp;&nbsp; cell.setCellStyle(style);<br />
&nbsp;&nbsp;&nbsp; row = sheet.createRow(rowNum++);<br />
&nbsp;&nbsp;&nbsp; cell = row.createCell(colNum);<br />
&nbsp;&nbsp;&nbsp; cell.setCellValue(11111.25);<br />
&nbsp;&nbsp;&nbsp; style = wb.createCellStyle();<br />
&nbsp;&nbsp;&nbsp; style.setDataFormat(format.getFormat("#,##0.0000"));<br />
&nbsp;&nbsp;&nbsp; cell.setCellStyle(style);<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
15.调整工作单位置<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet = wb.createSheet("format sheet");<br />
&nbsp;&nbsp;&nbsp; HSSFPrintSetup ps = sheet.getPrintSetup();<br />
&nbsp;&nbsp;&nbsp; sheet.setAutobreaks(true);<br />
&nbsp;&nbsp;&nbsp; ps.setFitHeight((short)1);<br />
&nbsp;&nbsp;&nbsp; ps.setFitWidth((short)1); </p>
<div>&nbsp;&nbsp;&nbsp; // Create various cells and rows for spreadsheet.<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
16.设置打印区域<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet = wb.createSheet("Sheet1");<br />
&nbsp;&nbsp;&nbsp; wb.setPrintArea(0, "$A$1:$C$2");<br />
&nbsp;&nbsp;&nbsp; //sets the print area for the first sheet<br />
&nbsp;&nbsp;&nbsp; //Alternatively:<br />
&nbsp;&nbsp;&nbsp; //wb.setPrintArea(0, 0, 1, 0, 0) is equivalent to using the name reference (See the JavaDocs for more details)<br />
&nbsp;&nbsp;&nbsp; // Create various cells and rows for spreadsheet.<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
17.标注脚注<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet = wb.createSheet("format sheet");<br />
&nbsp;&nbsp;&nbsp; HSSFFooter footer = sheet.getFooter()<br />
&nbsp;&nbsp;&nbsp; footer.setRight( "Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages() );<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; // Create various cells and rows for spreadsheet.<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
18.使用方便的内部提供的函数<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet1 = wb.createSheet( "new sheet" );<br />
&nbsp;&nbsp;&nbsp; // Create a merged region<br />
&nbsp;&nbsp;&nbsp; HSSFRow row = sheet1.createRow( (short) 1 );<br />
&nbsp;&nbsp;&nbsp; HSSFRow row2 = sheet1.createRow( (short) 2 );<br />
&nbsp;&nbsp;&nbsp; HSSFCell cell = row.createCell( (short) 1 );<br />
&nbsp;&nbsp;&nbsp; cell.setCellValue( "This is a test of merging" );<br />
&nbsp;&nbsp;&nbsp; Region region = new Region( 1, (short) 1, 4, (short) 4 );<br />
&nbsp;&nbsp;&nbsp; sheet1.addMergedRegion( region );<br />
&nbsp;&nbsp;&nbsp; // Set the border and border colors.<br />
&nbsp;&nbsp;&nbsp; final short borderMediumDashed = HSSFCellStyle.BORDER_MEDIUM_DASHED;<br />
&nbsp;&nbsp;&nbsp; HSSFRegionUtil.setBorderBottom( borderMediumDashed,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; region, sheet1, wb );<br />
&nbsp;&nbsp;&nbsp; HSSFRegionUtil.setBorderTop( borderMediumDashed,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; region, sheet1, wb );<br />
&nbsp;&nbsp;&nbsp; HSSFRegionUtil.setBorderLeft( borderMediumDashed,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; region, sheet1, wb );<br />
&nbsp;&nbsp;&nbsp; HSSFRegionUtil.setBorderRight( borderMediumDashed,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; region, sheet1, wb );<br />
&nbsp;&nbsp;&nbsp; HSSFRegionUtil.setBottomBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);<br />
&nbsp;&nbsp;&nbsp; HSSFRegionUtil.setTopBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);<br />
&nbsp;&nbsp;&nbsp; HSSFRegionUtil.setLeftBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);<br />
&nbsp;&nbsp;&nbsp; HSSFRegionUtil.setRightBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);<br />
&nbsp;&nbsp;&nbsp; // Shows some usages of HSSFCellUtil<br />
&nbsp;&nbsp;&nbsp; HSSFCellStyle style = wb.createCellStyle();<br />
&nbsp;&nbsp;&nbsp; style.setIndention((short)4);<br />
&nbsp;&nbsp;&nbsp; HSSFCellUtil.createCell(row, 8, "This is the value of the cell", style);<br />
&nbsp;&nbsp;&nbsp; HSSFCell cell2 = HSSFCellUtil.createCell( row2, 8, "This is the value of the cell");<br />
&nbsp;&nbsp;&nbsp; HSSFCellUtil.setAlignment(cell2, wb, HSSFCellStyle.ALIGN_CENTER);<br />
&nbsp;&nbsp;&nbsp; // Write out the workbook<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream( "workbook.xls" );<br />
&nbsp;&nbsp;&nbsp; wb.write( fileOut );<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
19.在工作单中移动行，调整行的上下位置<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet = wb.createSheet("row sheet");<br />
&nbsp;&nbsp;&nbsp; // Create various cells and rows for spreadsheet.<br />
&nbsp;&nbsp;&nbsp; // Shift rows 6 - 11 on the spreadsheet to the top (rows 0 - 5)<br />
&nbsp;&nbsp;&nbsp; sheet.shiftRows(5, 10, -5);<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
20.选种指定的工作单<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet = wb.createSheet("row sheet");<br />
&nbsp;&nbsp;&nbsp; sheet.setSelected(true);<br />
&nbsp;&nbsp;&nbsp; // Create various cells and rows for spreadsheet.<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
21.工作单的放大缩小<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet1 = wb.createSheet("new sheet");<br />
&nbsp;&nbsp;&nbsp; sheet1.setZoom(3,4);&nbsp;&nbsp; // 75 percent magnification<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
22.头注和脚注<br />
&nbsp;&nbsp;&nbsp; HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp; HSSFSheet sheet = wb.createSheet("new sheet");<br />
&nbsp;&nbsp;&nbsp; HSSFHeader header = sheet.getHeader();<br />
&nbsp;&nbsp;&nbsp; header.setCenter("Center Header");<br />
&nbsp;&nbsp;&nbsp; header.setLeft("Left Header");<br />
&nbsp;&nbsp;&nbsp; header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16");<br />
&nbsp;&nbsp;&nbsp; FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br />
&nbsp;&nbsp;&nbsp; wb.write(fileOut);<br />
&nbsp;&nbsp;&nbsp; fileOut.close();<br />
//-------------------------------以上实例代码均来自官方网站<br />
//-------------------------------POI中使用的颜色是用颜色索引来实现，如下：<br />
&nbsp;&nbsp; /*<br />
&nbsp;&nbsp;&nbsp; * 颜色对照表 数字代表颜色索引<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8： BLACK<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 60： BROWN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 59： OLIVE_GREEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 58： DARK_GREEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 56： DARK_TEAL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18： DARK_BLUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 32： DARK_BLUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 62： INDIGO<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 63： GREY_80_PERCENT<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 53： ORANGE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19： DARK_YELLOW<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17： GREEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21： TEAL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 38： TEAL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12： BLUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 39： BLUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 54： BLUE_GREY<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23： GREY_50_PERCENT<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10： RED<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 52： LIGHT_ORANGE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 50： LIME<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 57： SEA_GREEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 49： AQUA<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 48： LIGHT_BLUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20： VIOLET<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 36： VIOLET<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 55： GREY_40_PERCENT<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14： PINK<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 33： PINK<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 51： GOLD<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13： YELLOW<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 34： YELLOW<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11： BRIGHT_GREEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 35： BRIGHT_GREEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15： TURQUOISE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 35： TURQUOISE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16： DARK_RED<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 37： DARK_RED<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 40： SKY_BLUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 61： PLUM<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25： PLUM<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 22： GREY_25_PERCENT<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 45： ROSE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 43： LIGHT_YELLOW<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 42： LIGHT_GREEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 41： LIGHT_TURQUOISE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 27：LIGHT_TURQUOISE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 44： PALE_BLUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 46： LAVENDER<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9： WHITE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24： CORNFLOWER_BLUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 26： LEMON_CHIFFON<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25： MAROON<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 28： ORCHID<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29： CORAL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30： ROYAL_BLUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 31： LIGHT_CORNFLOWER_BLUE<br />
&nbsp;&nbsp;&nbsp; */<br />
//----------------------------------------------------你可以按上面的方法来自定义颜色<br />
&nbsp;&nbsp; /*<br />
&nbsp;&nbsp;&nbsp; * 自定义颜色，去掉注释，贴加，其他则查看颜色对照表<br />
&nbsp;&nbsp; HSSFPalette palette = this.getCustomPalette();<br />
&nbsp;&nbsp; palette.setColorAtIndex(idx,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i,&nbsp; //RGB red (0-255)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j,&nbsp;&nbsp;&nbsp; //RGB green<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k&nbsp;&nbsp;&nbsp;&nbsp; //RGB blue<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; */<br />
//---------------------------------------------------用以上的基础知识我们就可以制作复杂的多表头，控制元/</div>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/160638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-11-14 22:25 <a href="http://www.blogjava.net/liaojiyong/archive/2007/11/14/160638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POI 复制excel一行到另外一个sheet页(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/11/14/160588.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 14 Nov 2007 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/11/14/160588.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/160588.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/11/14/160588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/160588.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/160588.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: import&nbsp;java.io.FileInputStream;import&nbsp;java.io.FileNotFoundException;import&nbsp;java.io.FileOutputStream;import&nbsp;java.io.IOException;import&nbsp;org.apache.poi.hssf.usermodel.H...&nbsp;&nbsp;<a href='http://www.blogjava.net/liaojiyong/archive/2007/11/14/160588.html'>阅读全文</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/160588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-11-14 16:51 <a href="http://www.blogjava.net/liaojiyong/archive/2007/11/14/160588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Installing Oracle 10g on RHEL AS 3 Step-by-Step(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/11/10/159486.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 09 Nov 2007 16:56:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/11/10/159486.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/159486.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/11/10/159486.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/159486.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/159486.html</trackback:ping><description><![CDATA[<div class="asset-body">
<p>不久前,Oracle(甲骨文)公司在美国加州的总部宣布, Oracle 10g 数据库 与 Oracle <acronym title="Real Application Cluster &#13;">RAC</acronym> 在 TPC-H 基准测试中创造了新的世界纪录.这是个令人震惊的消息.因为这个测试是在 Linux ( Red Hat Enterprise Linux Advanced Server 3) 的平台上进行的. 这充分显示了 Oracle 在低成本 Linux 集群服务器上高效管理大规模数据仓库的能力, 也表明 Linux 在性能价格比上显而易见的优势,标志着Linux在大规模企业应用上已经成熟. </p>
<p>相信很多朋友已经对10g跃跃欲试了,现在从这里让我们开始10g之旅.</p>
<p>本文描述了在Red Hat Enterprise Linux Advanced Server 3 (<acronym title="Red Hat Enterprise Linux&#13;">RHEL</acronym> 3)上安装Oracle 10g 必要的步骤和相关知识. 本文假定你的Linux 操作系统已经安装完毕,并且您应该具有一定的 Unix 操作系统背景知识.</p>
</div>
<div class="asset-more" id="more">
<h2>配置RedHat AS 3</h2>
<p>操作系统版本：</p>
<blockquote>Red Hat Enterprise Linux AS release 3 (Taroon)<br />
Kernel 2.4.21-4.EL on an i686 </blockquote>
<p>按照常规来安装操作系统,记得要安装开发工具(gcc等必要工具). </p>
<h2>必要的硬件信息检查</h2>
<blockquote>
<table>
    <tbody>
        <tr>
            <td><strong>检查内容</strong></td>
            <td><strong>最小值</strong></td>
            <td><strong>检查命令参考</strong></td>
        </tr>
        <tr>
            <td>物理内存</td>
            <td>512M</td>
            <td># grep MemTotal /proc/meminfo </td>
        </tr>
        <tr>
            <td>交换空间</td>
            <td>1.0 GB或者2倍内存大小</td>
            <td># grep SwapTotal /proc/meminfo </td>
        </tr>
        <tr>
            <td>/tmp 空间</td>
            <td>400 <acronym title="Megabyte&#13;">MB</acronym> </td>
            <td># df -k /tmp </td>
        </tr>
        <tr>
            <td>软件所需空间</td>
            <td>2.5 <acronym title="Gigabyte&#13;">GB</acronym> </td>
            <td># df -k (空间越大越好,如果是正式系统,应该进行详尽的规划) </td>
        </tr>
        <tr>
            <td>数据库文件</td>
            <td>1.2 <acronym title="Gigabyte&#13;">GB</acronym> </td>
            <td># df -k (空间越大越好,如果是正式系统,应该进行详尽的规划) </td>
        </tr>
    </tbody>
</table>
</blockquote>
<p>检查完如上各项之后, 应该修改核心参数.执行如下命令:</p>
<blockquote>
<pre>#vi /etc/sysctl.conf
</pre>
</blockquote>
<p>#注释:<br />
#表示使用root用户操作,$表示使用oracle 用户进行操作.提示符后面的蓝色部分表示需要输入的命令，以下同． </p>
在该文件末尾加入如下内容:
<blockquote>
<pre>kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
</pre>
</blockquote>编辑完之后,保存,执行 # /sbin/sysctl -p 命令操作来使我们所做的变更生效.
<p>注:上面kernel.shmmax/kernel.sem等是典型的核心参数配置.您可能需要根据您的实际环境进行适当的变动. </p>
<p>关于这些核心参数的说明在Oracle的 <a href="http://download-west.oracle.com/docs/html/A96167_01/toc.htm">Oracle9i Installation Guide Release 2 (9.2.0.1.0) for UNIX Systems</a> 中有很详细的说明.( http://download-west.oracle.com/docs/html/A96167_01/toc.htm ) </p>
然后,应该检查一下上面的操作是否正确:
<blockquote>
<pre># /sbin/sysctl -a | grep sem
# /sbin/sysctl -a | grep shm
# /sbin/sysctl -a | grep file-max
# /sbin/sysctl -a | grep ip_local_port_range
</pre>
</blockquote>
<h2>为Oracle用户设定Shell的限制</h2>
<p>一般来说，出于性能上的考虑,还需要需要进行如下的设定，以便改进Oracle用户的有关 nofile(可打开的文件描述符的最大数)和nproc(单个用户可用的最大进程数量)</p>
<blockquote>
<pre># vi /etc/security/limits.conf
# 添加如下的行
*               soft    nproc   2047
*               hard    nproc   16384
*               soft    nofile  1024
*               hard    nofile  65536
</pre>
</blockquote>
<p>添加如下的行到/etc/pam.d/login 文件：</p>
<blockquote>
<pre>session    required     /lib/security/pam_limits.so
</pre>
</blockquote>
<p>编辑 /etc/profile 文件,添加如下部分：</p>
<blockquote>
<pre>if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi</pre>
</blockquote>
<p>之后，执行$ unlimit 验证一下.</p>
<h2>检查并安装相关补丁</h2>
<p>在这个版本的RHEL上安装Oracle,必须要有几个软件包. 确认以下 rpm包都已经安装: </p>
<blockquote>
<pre>make-3.79
binutils-2.11
openmotif-2.2.2-16
setarch-1.3-1
compat-db-4.0.14.5
compat-gcc-7.3-2.96.122
compat-gcc-c++-7.3-2.96.122
compat-libstdc++-7.3-2.96.122
compat-libstdc++-devel-7.3-2.96.122
<p># rpm -qa | grep compat <br />
</p>
</pre>
</blockquote>
<p>&nbsp;</p>
<p># 在我的机器上输出如下:</p>
<blockquote>
<pre>compat-gcc-c++-7.3-2.96.122
compat-libstdc++-7.3-2.96.122
compat-libstdc++-devel-7.3-2.96.122
compat-glibc-7.x-2.2.4.32.5
compat-db-4.0.14-5
compat-gcc-7.3-2.96.122
# rpm -qa | grep openmotif
openmotif-devel-2.2.2-16
openmotif-2.2.2-16
# rpm -qa | grep setarch
setarch-1.3-1
</pre>
</blockquote>
<p>上面显示的内容是在笔者已经安装了具体的RPM包之后的结果.一般情况下,你的系统上的输出结果和这个不同.如果个别包没有安装,把系统安装光盘mount上,找到具体的软件包(大多数在第三张光盘上),然后利用如下的命令来安装相应的包:</p>
<blockquote>
<pre># rpm -ivh compat.....rpm
</pre>
</blockquote>
<p>要额外注意的是,这些软件包之间是有依赖性的,先后的顺序要找好.否则会报告不能安装的错误. 此外，最好验证一下 gcc和glibc的版本(要求是gcc-3.2.3-2 或者更高):</p>
<blockquote>
<pre>#gcc -v
#rpm -q glibc
</pre>
</blockquote>
<h2>创建用户和相关的组</h2>
<blockquote>
<pre># /usr/sbin/groupadd oinstall
# /usr/sbin/groupadd dba
# /usr/sbin/useradd -g oinstall -G dba oracle　
</pre>
</blockquote>
<p>如果只是测试目的的话，不创建 oinstall 组也没什么. 不过还是规范一点比较好.如果 oracle 用户和 dba 组等已经存在，作适当的调整即可. </p>
<h2>检查并调整环境变量 </h2>
<p>登录为oracle用户</p>
<blockquote>
<pre># su - oracle
$ cd
$ vi .bash_profile
</pre>
</blockquote>
<p>#添加如下内容,你的具体值应该不会和这个完全相同.</p>
<blockquote>
<pre>export ORACLE_BASE=/u/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.1.0/db_1
export ORACLE_SID=TEST
export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
export LC_CTYPE=en_US.UTF-8
</pre>
</blockquote>
<p>然后执行</p>
<blockquote>
<pre>$ source .bash_profile
</pre>
</blockquote>
<p>使环境变量生效. /u/app/oracle 等目录应该建立好并做合适的授权. </p>
<h2>开始安装10g</h2>
<p>mount你的安装盘.(我一般都是把文件拷贝到系统中一个具体的位置,比如/u/install ) .执行:</p>
<blockquote>
<pre>$ sh /u/install/runInstaller
</pre>
</blockquote>
<p>如果不能出现安装画面，查看本文后面的FAQ。</p>
<p>非常值得称道的是,10g的安装相比以前的多了一个 Checking operating system certification 的步骤。特别实用。安装文件会自动检测所需的条件。如果有不符合的地方，安装程序会报告给你.并会给出具体原因。大大减少了出错的可能.下面是检查成功输出的内容 : </p>
<p>
<blockquote>
<pre>Checking operating system certification
Expected result: One of redhat-2.1,redhat-3,UnitedLinux-1.0
Actual Result: redhat-3
Check complete. The overall result of this check is: Passed
=======================================================================
Checking kernel parameters
Checking for VERSION=2.4.9.25; found VERSION=2.4.21. Passed
Checking for shmall=2097152; found shmall=2097152. Passed
Checking for shmseg=10; found shmseg=4096. Passed
Checking for semmsl=250; found semmsl=250. Passed
Checking for semmni=128; found semmni=128. Passed
Checking for filemax=65536; found filemax=65536. Passed
Checking for shmmni=4096; found shmmni=4096. Passed
Checking for semmns=32000; found semmns=32000. Passed
Checking for semopm=100; found semopm=100.Passed
Checking for shmmin=1; found shmmin=1. Passed
Checking for shmmax=2147483648; found shmmax=2147483648. Passed
Check complete. The overall result of this check is: Passed
=======================================================================
Checking recommended operating system packages
Checking for make-3.79; found make-3.79.1-17. Passed
Checking for binutils-2.11.90.0.8-12; found binutils-2.14.90.0.4-26. Passed
Checking for gcc-2.96; found gcc-3.2.3-20. Passed
Checking for openmotif-2.1.30-11; found openmotif-2.2.2-16. Passed
Check complete. The overall result of this check is: Passed
=======================================================================
Checking recommended glibc version
Expected result: 2.2.4.31.7
Actual Result: 2.3.2.95.3
Check complete. The overall result of this check is: Passed
=======================================================================
Validating ORACLE_BASE location (if set)
Check complete. The overall result of this check is: Passed
=======================================================================
</pre>
</blockquote>
<p>&nbsp;</p>
<p>其他的步骤比较清晰，不再赘述.</p>
<p>最后系统会提示你运行 root.sh 文件.按照提示做即可.</p>
<h2><acronym title="Frequently Asked Questions&#13;">FAQ</acronym> (在Linux平台安装Oracle比较常见的问题) </h2>
<blockquote>
<h2>1. 不能启动安装界面</h2>
<p>运行runInstaller提示信息类似如下:</p>
<blockquote>
<pre>xlib:connection to "localhost:0.0" refused by server
xlib:client is not authorized to connect to server <br />
Exception in thread "main" java.lang.InternalError:
can't connect to x11 window server using "localhost:0.0" at .......
</pre>
</blockquote>
<p>解决办法: 设定你的DISPLAY环境参数.</p>
<blockquote>
<pre># export DISPLAY= your_IPaddress :0.0</pre>
</blockquote>
<p>把your_IPaddress换成你的IP.或者用root简单的执行一下# xhost + (要注意这样会有安全上的隐患).</p>
<h2>2.安装界面显示很多"口口"样子的乱码</h2>
<p>解决办法:查看locale输出</p>
<blockquote>
<pre># locale
LANG=en_US.UTF-8
LC_CTYPE=zh_CN.GB18030
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
</pre>
</blockquote>
<p>执行#export LC_CTYPE=en_US.UTF-8 然后重新调用安装程序. </p>
<h2>3. 用IE登录Linux服务器上的em出现乱码</h2>
<p>在Linux(Unix) 环境下成功安装了Oracle 10g,从windows下用IE浏览器登录 10g 的em, 按钮是"口口"这样的方框. </p>
<p>解决办法: 参考:
<p><a href="http://www.dbanotes.net/Oracle/Oracle-10g-font.properties.htm">http://www.dbanotes.net/Oracle/Oracle-10g-font.properties.htm</a> </p>
<p>&nbsp;</p>
<h2>4.创建数据库的时候出现ORA-03113的错误</h2>
<p>解决办法: 查看核心参数是否调整正确.参考:</p>
<blockquote>http://www.dbanotes.net/Oracle/ORA-03113.htm</blockquote>
<p><br />
<h2>5. RedHat 9 / FC1等系统10g不支持如何安装?</h2>
<br />
<p>解决办法：在10g不支持的Linux发行版上安装10g的解决方法</p>
<p>&nbsp;</p>
<p>1). 运行runInstaller -ignoreSysPrereqs，这样会跳过检查. </p>
<p>2). 摘自 <a href="http://www.puschitz.com/">www.puschitz.com</a> 修改/etc/redhat-release文件：</p>
<blockquote>
<pre>#su - root
#cp /etc/redhat-release /etc/redhat-release.backup
#cat &gt; /etc/redhat-release &lt;&lt;   EOF
Red Hat Enterprise Linux AS release 3 (Taroon)
EOF
</pre>
</blockquote>
<p>安装完毕，执行如下操作： </p>
<blockquote>
<pre>#su - root
#cp /etc/redhat-release.backup /etc/redhat-release
</pre>
</blockquote>
<p>3). <a href="http://www.dbanotes.net/Oracle/10G-Beta-Install-Bug.htm">http://www.dbanotes.net/Oracle/10G-Beta-Install-Bug.htm </a></p>
<p>同样的思路，我们可以修改Oracle 的install/oraparam.ini文件达到目的. </p>
<h2>6.如何关掉那些 ocssd.bin 进程？</h2>
<p>解决办法:编辑/etc/inittab文件(做好备份),注释掉这一行:</p>
<blockquote>
<pre>h1:3:respawn:/etc/init.d/init.cssd run &gt;/dev/null 2&gt;................
</pre>
</blockquote></blockquote>
<h2>参考信息</h2>
<p><a href="http://www.puschitz.com/InstallingOracle10g.shtml">Werner Puschitz 的 10g 安装指南</a> - http://www.puschitz.com/InstallingOracle10g.shtml<br />
Werner Puschitz 的站点的文章很翔实,如果您遇到了本文没有说清的问题,可以去看看那里.本文借鉴了该站点不少内容． </p>
<p><a href="http://www.google.com/">http://www.google.com</a> - http://www.google.com <br />
关于核心参数等信息一定要用Google查找． </p>
<p><a href="http://download-west.oracle.com/docs/html/B10813_01/toc.htm">Oracle Database Quick Installation Guide 10g Release 1 (10.1) for Linux x86 </a><br />
http://download-west.oracle.com/docs/html/B10813_01/toc.htm </p>
<p><a href="http://download-west.oracle.com/docs/html/B10811_02/toc.htm">Oracle Database Installation Guide 10g Release 1 (10.1) for UNIX Systems </a>http://download-west.oracle.com/docs/html/B10811_02/toc.htm </p>
</div>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/159486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-11-10 00:56 <a href="http://www.blogjava.net/liaojiyong/archive/2007/11/10/159486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>http://saguiitay.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=cat%3dDocumentum</title><link>http://www.blogjava.net/liaojiyong/archive/2007/11/06/158596.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Tue, 06 Nov 2007 08:52:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/11/06/158596.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/158596.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/11/06/158596.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/158596.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/158596.html</trackback:ping><description><![CDATA[<div class="bvEntry" id="entrycns!3B7FD118142669E2!774" bv:cns="cns!3B7FD118142669E2!774" bv:ca="true" bv:cat="Documentum">
<div id="LastMDatecns!3B7FD118142669E2!774">8月2日</div>
<h4 class="TextColor1" id="subjcns!3B7FD118142669E2!774" style="margin-bottom: 0px"><a href="http://saguiitay.spaces.live.com/blog/cns!3B7FD118142669E2!774.entry">Creating a user in Documentum</a></h4>
<div class="bvMsg" id="msgcns!3B7FD118142669E2!774">
<p>Here's 2 ways to create a user in Documentum:
<p>Using the DQL:
<p><font face="Courier New" size="2">create dm_cabinet object<br />
</font><font face="Courier New" size="2">set object_name = '%USERNAME%'<br />
</font><font face="Courier New" size="2">go<br />
<br />
</font><font face="Courier New" size="2">create dm_user object<br />
</font><font face="Courier New" size="2">set user_name = '%USER DISPLAY NAME%,<br />
</font><font face="Courier New" size="2">set default_folder = '/%USERNAME%',<br />
</font><font face="Courier New" size="2">set user_os_name = '%USERNAME%',<br />
</font><font face="Courier New" size="2">set user_privileges = %PRIVILEGES%',<br />
</font><font face="Courier New" size="2">set user_address = '%USER EMAIL%<br />
</font><font face="Courier New" size="2">go</font>
<p>Using the IAPI:
<p><font face="Courier New" size="2">create,c,dm_user<br />
set,c,l,user_name<br />
</font><font face="Courier New" size="2">set,c,l,user_os_name<br />
</font><font face="Courier New" size="2">set,c,l,user_address<br />
</font><font face="Courier New" size="2">save,c,l</font>
<p><font face="Courier New" size="2"></font></p>
</div>
<div class="footerLinks"><nobr>18:20</nobr>&nbsp;| <nobr><a id="blogAddComment0" href="http://saguiitay.spaces.live.com/blog/cns!3B7FD118142669E2!774.entry#post" bvitemtype="post">添加评论</a></nobr>&nbsp;| <nobr><a id="blogSendMessage0" title="给作者发送消息" href="http://spaces.live.com/api.aspx?wx_action=sendMessage&amp;wxp_toCid=4287375271627483618&amp;wx_ru=http%3a%2f%2fsaguiitay.spaces.live.com%2fdefault.aspx%3f_c11_BlogPart_BlogPart%3dblogview%26_c%3dBlogPart%26partqs%3dcat%3dDocumentum&amp;wxp_subject=%e7%ad%94%e5%a4%8d%ef%bc%9a%e6%82%a8%e7%9a%84%e6%97%a5%e5%bf%97%e2%80%9cCreating+a+user+in+Documentum%e2%80%9d&amp;wxp_body=%3cdiv%3e%3cbr+%2f%3e%3cbr+%2f%3e%3chr+%2f%3e%e6%9f%a5%e7%9c%8b%e6%97%a5%e5%bf%97%ef%bc%9a%3ca+href%3d%22http%26%2358%3b%26%2347%3b%26%2347%3bsaguiitay.spaces.live.com%26%2347%3bblog%26%2347%3bcns%26%2333%3b3B7FD118142669E2%26%2333%3b774.entry%22%3ehttp%26%2358%3b%26%2347%3b%26%2347%3bsaguiitay.spaces.live.com%26%2347%3bblog%26%2347%3bcns%26%2333%3b3B7FD118142669E2%26%2333%3b774.entry%3c%2fa%3e%3c%2fdiv%3e">发送消息</a></nobr>&nbsp;| <nobr><a id="blogPermalink0" title="此日志的固定链接" href="http://saguiitay.spaces.live.com/blog/cns!3B7FD118142669E2!774.entry">固定链接</a></nobr>&nbsp;| <nobr><a id="blogTrackbacks0" href="http://saguiitay.spaces.live.com/blog/cns!3B7FD118142669E2!774.entry#trackback" bvitemtype="trackback">查看引用通告 (0)</a></nobr>&nbsp;| <nobr><a id="blogThis0" title="写入您的共享空间日志" href="javascript:BlogIt('cns!3B7FD118142669E2!774');">写入日志</a></nobr>&nbsp;| <nobr><a id="blogCategory0" title="显示此类别的所有日志" href="http://saguiitay.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=cat%3dDocumentum">Documentum</a></nobr></div>
<div class="footer"></div>
</div>
<div class="bvEntry" id="entrycns!3B7FD118142669E2!679" bv:cns="cns!3B7FD118142669E2!679" bv:ca="true" bv:cat="Documentum">
<div id="LastMDatecns!3B7FD118142669E2!679">9月14日</div>
<h4 class="TextColor1" id="subjcns!3B7FD118142669E2!679" style="margin-bottom: 0px"><a href="http://saguiitay.spaces.live.com/blog/cns!3B7FD118142669E2!679.entry">Connecting to Documentum using .Net</a></h4>
<div class="bvMsg" id="msgcns!3B7FD118142669E2!679">
<div>I've spoke in an earlier post about working with Documentum in .Net. In this post, I'll show you how to connect to a DocBase, and get the list of cabinets.</div>
<div>&nbsp;</div>
<div>The following code will connect to a DocBase. It assumes that you have a <font face="Courier New, Courier, Monospace">Username</font>, <font face="Courier New, Courier, Monospace">Password</font> and <font face="Courier New, Courier, Monospace">DocBase</font> variables declared that contain valid information:</div>
<div><font size="2"><font face="Courier New, Courier, Monospace"></font></font>&nbsp;</div>
<div><font face="Courier New" color="#008000" size="2">// Get a client object</font></div>
<div><font size="2"><font face="Courier New, Courier, Monospace">DfClientX _clientx = </font></font><font face="Courier New, Courier, Monospace" color="#0000ff" size="2">new</font><font size="2"><font face="Courier New, Courier, Monospace"> DfClientX();<br />
</font><font face="Courier New, Courier, Monospace">IDfClient _client = _clientx.getLocalClient();<br />
</font></font><font face="Courier New, Courier, Monospace"><font color="#0000ff" size="2"><br />
if</font><font size="2"> (_client == </font><font color="#0000ff" size="2">null</font></font><font size="2"><font face="Courier New, Courier, Monospace">)<br />
</font></font><font face="Courier New, Courier, Monospace"><font color="#0000ff" size="2">&nbsp;&nbsp;&nbsp; throw</font><font size="2"> </font><font color="#0000ff" size="2">new</font><font size="2"> Exception(</font><font color="#800080" size="2">"Failed creating Documentum client"</font></font><font size="2"><font face="Courier New, Courier, Monospace">);<br />
</font><font face="Courier New, Courier, Monospace"><br />
<font color="#008000">// Retrieve the client's version</font><br />
Console.WriteLine(</font></font><font face="Courier New, Courier, Monospace" color="#800080" size="2">"Using DFC version '{0}'"</font><font size="2"><font face="Courier New, Courier, Monospace">, _clientx.getDFCVersion());<br />
</font><font face="Courier New, Courier, Monospace"><br />
<font color="#008000">// Create an object with the credentials of the user</font><br />
IDfLoginInfo _loginInfoObj = _clientx.getLoginInfo();<br />
</font><font face="Courier New, Courier, Monospace">_loginInfoObj.setUser(Username);<br />
</font><font face="Courier New, Courier, Monospace">_loginInfoObj.setPassword(Password);<br />
</font><font face="Courier New, Courier, Monospace"><br />
<font color="#008000">// Create a new session to the requested DocBase</font><br />
IDfSession _session = _client.newSession(DocBase, _loginInfoObj);<br />
</font></font><font face="Courier New, Courier, Monospace"><font color="#0000ff" size="2"><br />
if</font><font size="2"> (_session == </font><font color="#0000ff" size="2">null</font></font><font size="2"><font face="Courier New, Courier, Monospace"> || !_session.isConnected())<br />
</font><font face="Courier New, Courier, Monospace">{<br />
</font><font face="Courier New, Courier, Monospace"><font color="#0000ff">&nbsp;&nbsp;&nbsp; </font>Console.WriteLine(</font></font><font face="Courier New, Courier, Monospace" color="#800080" size="2">"Failed conecting to Documentum"</font><font size="2"><font face="Courier New, Courier, Monospace">);<br />
</font></font><font face="Courier New, Courier, Monospace"><font color="#0000ff" size="2">&nbsp;&nbsp;&nbsp; if</font><font size="2"> (_session != </font><font color="#0000ff" size="2">null</font></font><font size="2"><font face="Courier New, Courier, Monospace">)<br />
</font><font face="Courier New, Courier, Monospace"><font color="#0000ff">&nbsp;&nbsp;&nbsp; </font>{<br />
</font><font face="Courier New, Courier, Monospace"><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>Console.WriteLine(</font></font><font face="Courier New, Courier, Monospace" color="#800080" size="2">"DFC Messages:\r\n{0}"</font><font size="2"><font face="Courier New, Courier, Monospace">, _session.getMessage(1));<br />
</font><font face="Courier New, Courier, Monospace"><font color="#0000ff">&nbsp;&nbsp;&nbsp; </font>}<br />
</font></font><font face="Courier New, Courier, Monospace" color="#0000ff" size="2">&nbsp;&nbsp;&nbsp; return</font><font size="2"><font face="Courier New, Courier, Monospace">;<br />
</font><font face="Courier New, Courier, Monospace">}<br />
</font><font face="Courier New, Courier, Monospace"><br />
Console.WriteLine(</font></font><font face="Courier New, Courier, Monospace"><font color="#800080" size="2">"Using server version '{0}'"</font><font size="2">, _session.getServerVersion());<br />
</font></font></div>
<div><font face="Geneva, Arial, Sans-serif" size="2">Now, once we're connected to the Documentum DocBase, we'll list all the cabinets:</font></div>
<div><font face="Courier New, Courier, Monospace"><font size="2"></font></font>&nbsp;</div>
<div><font face="Courier New, Courier, Monospace"><font size="2"><font size="2">
<p>IDfQuery query = _clientx.getQuery();<br />
<font color="#008000">// Quering the "dm_cabinet" table returns only items of dm_cabinet type</font><br />
query.setDQL(</font><font color="#800080" size="2">"SELECT r_object_id, object_name, title FROM dm_cabinet"</font><font size="2">);<br />
</font><font size="2"><br />
<font color="#008000">// Query the session for the cabinets<br />
</font>IDfCollection col = query.execute(_session, (</font><font color="#0000ff" size="2">int</font><font size="2">)DFCLib.tagDfQueryTypes.IDfQuery_DF_READ_QUERY);<br />
<br />
<font color="#008000">// Loop through all the items in the collection</font><br />
</font><font color="#0000ff" size="2">while</font><font size="2"> (col.next())<br />
{<br />
&nbsp;&nbsp;&nbsp; <font color="#008000">// Get the current item from&nbsp;the collection</font></font><font size="2"><br />
&nbsp;&nbsp;&nbsp; IDfTypedObject typedObj = col.getTypedObject();<br />
&nbsp;&nbsp;&nbsp; <font color="#008000">// Print the item's name</font></font><font size="2"><br />
&nbsp;&nbsp;&nbsp; Console.WriteLine(</font><font color="#800080" size="2">"Cabinet name: {0}"</font><font size="2">, typedObj.getString(</font><font color="#800080" size="2">"object_name"</font><font size="2">))<br />
}<br />
col.Close();</font>
<p><font size="2"><font face="Geneva, Arial, Sans-serif">One of the most important thing to remember, is that you have to close the IDfCollection. Each session has a very limited number of collections it can have open at the same time. If&nbsp;you need more collections, I would suggest just caching the items inside a .Net collection for later use.</font></font></font></font></p>
</div>
</div>
<div class="footerLinks"><nobr>19:18</nobr>&nbsp;| <nobr><a id="blogAddComment1" href="http://saguiitay.spaces.live.com/blog/cns!3B7FD118142669E2!679.entry#post" bvitemtype="post">添加评论</a></nobr>&nbsp;| <nobr><a id="blogComments1" href="http://saguiitay.spaces.live.com/blog/cns!3B7FD118142669E2!679.entry#comment" bvitemtype="comment">阅读评论 (2)</a></nobr>&nbsp;| <nobr><a id="blogSendMessage1" title="给作者发送消息" href="http://spaces.live.com/api.aspx?wx_action=sendMessage&amp;wxp_toCid=4287375271627483618&amp;wx_ru=http%3a%2f%2fsaguiitay.spaces.live.com%2fdefault.aspx%3f_c11_BlogPart_BlogPart%3dblogview%26_c%3dBlogPart%26partqs%3dcat%3dDocumentum&amp;wxp_subject=%e7%ad%94%e5%a4%8d%ef%bc%9a%e6%82%a8%e7%9a%84%e6%97%a5%e5%bf%97%e2%80%9cConnecting+to+Documentum+using+.Net%e2%80%9d&amp;wxp_body=%3cdiv%3e%3cbr+%2f%3e%3cbr+%2f%3e%3chr+%2f%3e%e6%9f%a5%e7%9c%8b%e6%97%a5%e5%bf%97%ef%bc%9a%3ca+href%3d%22http%26%2358%3b%26%2347%3b%26%2347%3bsaguiitay.spaces.live.com%26%2347%3bblog%26%2347%3bcns%26%2333%3b3B7FD118142669E2%26%2333%3b679.entry%22%3ehttp%26%2358%3b%26%2347%3b%26%2347%3bsaguiitay.spaces.live.com%26%2347%3bblog%26%2347%3bcns%26%2333%3b3B7FD118142669E2%26%2333%3b679.entry%3c%2fa%3e%3c%2fdiv%3e">发送消息</a></nobr>&nbsp;| <nobr><a id="blogPermalink1" title="此日志的固定链接" href="http://saguiitay.spaces.live.com/blog/cns!3B7FD118142669E2!679.entry">固定链接</a></nobr>&nbsp;| <nobr><a id="blogTrackbacks1" href="http://saguiitay.spaces.live.com/blog/cns!3B7FD118142669E2!679.entry#trackback" bvitemtype="trackback">查看引用通告 (0)</a></nobr>&nbsp;| <nobr><a id="blogThis1" title="写入您的共享空间日志" href="javascript:BlogIt('cns!3B7FD118142669E2!679');">写入日志</a></nobr>&nbsp;| <nobr><a id="blogCategory1" title="显示此类别的所有日志" href="http://saguiitay.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=cat%3dDocumentum">Documentum</a></nobr></div>
<div class="footer"></div>
</div>
<div class="bvEntry" id="entrycns!3B7FD118142669E2!672" bv:cns="cns!3B7FD118142669E2!672" bv:ca="true" bv:cat="Documentum">
<div id="LastMDatecns!3B7FD118142669E2!672">9月12日</div>
<h4 class="TextColor1" id="subjcns!3B7FD118142669E2!672" style="margin-bottom: 0px"><a href="http://saguiitay.spaces.live.com/blog/cns!3B7FD118142669E2!672.entry">Retrieving extended permissions in Documentum with .Net</a></h4>
<div class="bvMsg" id="msgcns!3B7FD118142669E2!672">
<div>Following version 5 of the Documentum Content Server, security entities can have extended permissions on items. Those extended permissions include: Execute Procedure, Change Location, Change State, Change Permission and Change Ownership<br />
</div>
<div>In order to retrieve those permissions by code, it is required to manually check for those permissions. Assuming that you have the object ID of an item, here's the .Net code in order to know if the user has those extended permissions:</div>
<div>&nbsp;</div>
<div><font color="#008080" size="2"><font size="2">
<p></font><font face="Courier New, Courier, Monospace"><font color="#008080" size="2">IDfId</font><font size="2"> <font color="#000000">itemIdObj </font>= </font><font color="#0000ff" size="2">null</font></font><font face="Courier New, Courier, Monospace"><font size="2">;<br />
</font><font color="#008080" size="2">IDfSysObject</font><font size="2"> <font color="#000000">itemSysObj </font>= </font><font color="#0000ff" size="2">null</font></font><font face="Courier New, Courier, Monospace"><font size="2">;<br />
</font><font color="#008080" size="2">IDfACL</font><font size="2"> <font color="#000000">aclObj </font>= </font><font color="#0000ff" size="2">null</font></font><font face="Courier New, Courier, Monospace"><font size="2">;<br />
</font><font color="#0000ff" size="2">string</font><font size="2"> <font color="#000000">itemId </font>= </font><font color="#0000ff" size="2">null</font></font><font face="Courier New, Courier, Monospace" size="2">;<br />
</font><font face="Courier New, Courier, Monospace" color="#0000ff" size="2">try<br />
</font><font face="Courier New, Courier, Monospace" size="2">{<br />
</font><font face="Courier New, Courier, Monospace" color="#008000" size="2">&nbsp;&nbsp;&nbsp; // Get the Id object of the item<br />
</font><font size="2"><font face="Courier New, Courier, Monospace" color="#000000">&nbsp;&nbsp;&nbsp; itemIdObj = _clientx.getId(itemId);<br />
</font></font><font face="Courier New"><font color="#008000" size="2">&nbsp;&nbsp;&nbsp; // Get the item itself<br />
</font><font color="#000000" size="2">&nbsp;&nbsp;&nbsp; itemSysObj = (</font><font color="#008080" size="2">IDfSysObject</font></font><font face="Courier New" size="2"><font color="#000000">)_session.getObject(itemIdObj);<br />
</font><br />
</font><font face="Courier New" color="#008000" size="2">&nbsp;&nbsp;&nbsp; // Get the ACL of the item&nbsp;<br />
</font><font face="Courier New" color="#000000" size="2">&nbsp;&nbsp;&nbsp; aclObj = itemSysObj.getACL();<br />
</font><font face="Courier New"><font color="#008000" size="2">&nbsp;&nbsp;&nbsp; // Get extended permissions for entity i. This cde should be run for each entity<br />
</font><font color="#0000ff" size="2"><font color="#008000">&nbsp;&nbsp;&nbsp; </font>int</font></font><font face="Courier New"><font size="2"> <font color="#000000">xperms = aclObj.getAccessorXPermit(i);<br />
</font></font><font color="#0000ff" size="2"><font color="#008000">&nbsp;&nbsp;&nbsp; </font>if</font></font><font face="Courier New" size="2"> <font color="#000000">((xperms &amp; 1) == 1)<br />
&nbsp;&nbsp;&nbsp; {<br />
</font></font><font face="Courier New" color="#008000" size="2"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>// User has the "Execute Procedure"<br />
</font><font face="Courier New"><font color="#000000" size="2">&nbsp;&nbsp;&nbsp; }<br />
</font><font color="#0000ff" size="2"><font color="#008000">&nbsp;&nbsp;&nbsp; </font>if</font></font><font face="Courier New" size="2"> <font color="#000000">((xperms &amp; 2) == 2)<br />
&nbsp;&nbsp;&nbsp; {<br />
</font></font><font face="Courier New" color="#008000" size="2"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>// User has the "ChangeLocation"<br />
</font><font face="Courier New"><font size="2"><font color="#008000">&nbsp;</font><font color="#000000">&nbsp;&nbsp; }<br />
</font></font><font color="#0000ff" size="2"><font color="#008000">&nbsp;&nbsp;&nbsp; </font>if</font></font><font face="Courier New" size="2"> <font color="#000000">((xperms &amp; 32768) == 32768)<br />
&nbsp;&nbsp;&nbsp; {<br />
</font></font><font face="Courier New" color="#008000" size="2"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>// User has the "Change State"<br />
</font><font face="Courier New"><font color="#000000" size="2">&nbsp;&nbsp;&nbsp; }<br />
</font><font color="#0000ff" size="2"><font color="#008000">&nbsp;&nbsp;&nbsp; </font>if</font></font><font face="Courier New" size="2"> <font color="#000000">((xperms &amp; 65536) == 65536)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</font></font><font face="Courier New" color="#008000" size="2"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>// User has the "Change Permission"<br />
</font><font face="Courier New"><font size="2"><font color="#008000">&nbsp;</font><font color="#000000">&nbsp;&nbsp; }<br />
</font></font><font color="#0000ff" size="2"><font color="#008000">&nbsp;&nbsp;&nbsp; </font>if</font></font><font face="Courier New" size="2"> <font color="#000000">((xperms &amp; 131072) == 131072)<br />
&nbsp;&nbsp;&nbsp; {<br />
</font></font><font face="Courier New" color="#008000" size="2"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>// User has the "Change Ownership"<br />
</font><font face="Courier New"><font size="2"><font color="#008000">&nbsp;</font><font color="#000000">&nbsp;&nbsp; }<br />
}<br />
</font></font><font color="#0000ff" size="2">catch</font><font size="2"> <font color="#000000">(</font></font><font color="#008080" size="2">Exception</font></font><font face="Courier New" color="#000000" size="2"> ex)<br />
{<br />
</font><font face="Courier New"><font color="#008000" size="2"><font color="#000000">&nbsp;&nbsp;&nbsp; </font>// Log exception<br />
</font><font color="#000000" size="2">}</font></font></font></p>
</div>
</div>
<div class="footerLinks"><nobr>12:09</nobr>&nbsp;| <nobr><a id="blogAddComment2" href="http://saguiitay.spaces.live.com/blog/cns!3B7FD118142669E2!672.entry#post" bvitemtype="post">添加评论</a></nobr>&nbsp;| <nobr><a id="blogSendMessage2" title="给作者发送消息" href="http://spaces.live.com/api.aspx?wx_action=sendMessage&amp;wxp_toCid=4287375271627483618&amp;wx_ru=http%3a%2f%2fsaguiitay.spaces.live.com%2fdefault.aspx%3f_c11_BlogPart_BlogPart%3dblogview%26_c%3dBlogPart%26partqs%3dcat%3dDocumentum&amp;wxp_subject=%e7%ad%94%e5%a4%8d%ef%bc%9a%e6%82%a8%e7%9a%84%e6%97%a5%e5%bf%97%e2%80%9cRetrieving+extended+permissions+in+Documentum+with+.Net%e2%80%9d&amp;wxp_body=%3cdiv%3e%3cbr+%2f%3e%3cbr+%2f%3e%3chr+%2f%3e%e6%9f%a5%e7%9c%8b%e6%97%a5%e5%bf%97%ef%bc%9a%3ca+href%3d%22http%26%2358%3b%26%2347%3b%26%2347%3bsaguiitay.spaces.live.com%26%2347%3bblog%26%2347%3bcns%26%2333%3b3B7FD118142669E2%26%2333%3b672.entry%22%3ehttp%26%2358%3b%26%2347%3b%26%2347%3bsaguiitay.spaces.live.com%26%2347%3bblog%26%2347%3bcns%26%2333%3b3B7FD118142669E2%26%2333%3b672.entry%3c%2fa%3e%3c%2fdiv%3e">发送消息</a></nobr>&nbsp;| <nobr><a id="blogPermalink2" title="此日志的固定链接" href="http://saguiitay.spaces.live.com/blog/cns!3B7FD118142669E2!672.entry">固定链接</a></nobr>&nbsp;| <nobr><a id="blogTrackbacks2" href="http://saguiitay.spaces.live.com/blog/cns!3B7FD118142669E2!672.entry#trackback" bvitemtype="trackback">查看引用通告 (0)</a></nobr>&nbsp;| <nobr><a id="blogThis2" title="写入您的共享空间日志" href="javascript:BlogIt('cns!3B7FD118142669E2!672');">写入日志</a></nobr>&nbsp;| <nobr><a id="blogCategory2" title="显示此类别的所有日志" href="http://saguiitay.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=cat%3dDocumentum">Documentum</a></nobr></div>
<div class="footer"></div>
</div>
<div class="bvEntry" id="entrycns!3B7FD118142669E2!669" bv:cns="cns!3B7FD118142669E2!669" bv:ca="true" bv:cat="Documentum">
<div id="LastMDatecns!3B7FD118142669E2!669">9月10日</div>
<h4 class="TextColor1" id="subjcns!3B7FD118142669E2!669" style="margin-bottom: 0px"><a href="http://saguiitay.spaces.live.com/blog/cns!3B7FD118142669E2!669.entry">Retrieving a list of available Documentum DocBases</a></h4>
<div class="bvMsg" id="msgcns!3B7FD118142669E2!669">
<div>While adding support for EMC Documentum to the <a href="http://www.tzunami.net/">Tzunami Deployer, our SharePoint migration tool</a>, I needed to allow the user to enter the name of a DocBase to connect to. I wanted a interface that is a bit more that just a TextBox where the user can enter the DocBase name. I ended up using a ComboBox,<font face="Verdana, Geneva, Arial, Sans-serif"> and added a "Refresh" button, similar to the one used in the Server Explorer of Visual Studio. When the user press the "Refresh" button, the ComboBox </font>gets populated by the list of known DocBases. Bellow is the code in the event handler of the button:</div>
<div>&nbsp;</div>
<div><font size="2">
<p>c<font face="Courier New, Courier, Monospace">omboBoxDocBase.Items.Clear();<br />
</font></font><font face="Courier New, Courier, Monospace" color="#0000ff" size="2">try<br />
</font><font face="Courier New, Courier, Monospace"><font size="2">{<br />
</font><font color="#008080" size="2">&nbsp;&nbsp;&nbsp; IDfClientX</font><font size="2"> clientx = </font><font color="#0000ff" size="2">new</font><font size="2"> </font><font color="#008080" size="2">DfClientX</font></font><font face="Courier New, Courier, Monospace"><font size="2">();<br />
</font><font color="#008080" size="2">&nbsp;&nbsp;&nbsp; IDfClient</font></font><font face="Courier New, Courier, Monospace"><font size="2"> client = clientx.getLocalClient();<br />
</font><font color="#008080" size="2">&nbsp;&nbsp;&nbsp; IDfDocbaseMap</font></font><font face="Courier New, Courier, Monospace"><font size="2">&nbsp;docbaseMap = client.getDocbaseMap();</font></font>
<p><font face="Courier New, Courier, Monospace"><font size="2"><font color="#0000ff" size="2">&nbsp;&nbsp;&nbsp; int</font><font size="2"><font color="#000000"> docbaseCount = myMap.getDocbaseCount();</font></font><br />
</font><font color="#0000ff" size="2"><font color="#008080">&nbsp;&nbsp;&nbsp; </font>for</font><font size="2"> (</font><font color="#0000ff" size="2">int</font></font><font face="Courier New, Courier, Monospace"><font size="2"> i = 0; i &lt; <font color="#000000">docbaseCount</font>; i++)<br />
<font color="#008080">&nbsp;&nbsp;&nbsp; </font>{<br />
<font color="#008080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>comboBoxDocBase.Items.Add(docbaseMap.getDocbaseName(i));<br />
<font color="#008080">&nbsp;&nbsp;&nbsp; </font>}<br />
}<br />
</font><font color="#0000ff" size="2">catch</font><font size="2"> (</font><font color="#008080" size="2">Exception</font></font><font size="2"><font face="Courier New, Courier, Monospace"> ex)<br />
{<br />
<font color="#008000">&nbsp;&nbsp;&nbsp; // Log the exception and show the user a warning</font></font></font><font size="2"><br />
<font face="Courier New, Courier, Monospace">}</font></font>
<p>This allowed me to easily allow average users to just select from a list of available servers, and advanced users can just enter the name of the DocBase.</p>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/158596.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-11-06 16:52 <a href="http://www.blogjava.net/liaojiyong/archive/2007/11/06/158596.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 安装</title><link>http://www.blogjava.net/liaojiyong/archive/2007/11/06/158451.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Tue, 06 Nov 2007 01:52:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/11/06/158451.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/158451.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/11/06/158451.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/158451.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/158451.html</trackback:ping><description><![CDATA[首先,准备安装需要的软件包和补丁包: <br />
从网上下载升级补丁包,用于将Oracle9.2.0升级到9.2.0.4: <br />
p3006854_9204_LINUX.zip <br />
所有的补丁说明如下： <br />
p3095277_9204_LINUX.zip 9.2.0.4.0的升级补丁包. <br />
p3006854_9204_LINUX.zip 在运行 runInstaller 之前打. <br />
p3119415_9204_LINUX.zip 在升级到9.2.0.4.0之后打. <br />
p2617419_210_GENERIC.zip 打3119415补丁所需要的补丁. <br />
<br />
1.用rpm -qa│grep compat 查看系统中是否安有以下几个软件包： <br />
加载文件命令：#rpm &#8211;ivh /mnt/cdrom/RedHat/RPMB/file.rpm <br />
compat-libstdc++-7.3-2.96.122 <br />
compat-gcc-c++-7.3-2.96.122 <br />
compat-libstdc++-devel-7.3-2.96.122 <br />
compat-db-4.0.14-5 <br />
compat-gcc-7.3-2.96.122 <br />
tcl-devel-8.3.5-92.i386.ipm <br />
<br />
其他相关软件包（安装上述软件包时可能需要）： <br />
glibc-kemheadsers-2.4-8.34.i386.rpm <br />
glib-headers-2.3.2-95.20.i386.rpm <br />
glib-derel-2.3.2-95.20.i386.rpm <br />
<br />
2. rpm -qa │ grep openmotif查看下列软件包 <br />
openmotif21-2.1.30-8 <br />
3. rpm -qa │ grep setarch查看: <br />
setarch-1.3-1 <br />
<br />
第二,准备安装过程中需要的用户和用户组 <br />
在安装的过程中我们使用两个用户同时进行，其中一个是root用户，另外一个是你新建立的oracle用户。 <br />
<br />
1、打开一个终端，以root用户登录或者是：su - root <br />
2、建立oracle 用户和密码 <br />
# groupadd oinstall (在安装oracle时UNIX Group name：oinstall) <br />
# groupadd dba <br />
# useradd -g oinstall -G dba oracle <br />
# passwd oracle <br />
<br />
第三,安装准备步骤. <br />
1、准备文件目录： <br />
# mkdir -p /opt/ora9/product/9.2 <br />
# mkdir /var/opt/oracle <br />
# chown oracle.dba /var/opt/oracle <br />
# chown -R oracle.dba /opt/ora9 <br />
注：如果提示参数太少，可以在目录属性－权限 直接设置成 oracle 权限 dba <br />
<br />
2、设置内核参数，调节信号灯及共享内存： <br />
<br />
修改 /etc/sysctl.conf 这个文件，加入以下的语句： <br />
kernel.shmmax = 2147483648 (机器内存2G，如果你的没这么大可相应设置小些) <br />
kernel.shmmni = 4096 <br />
kernel.shmall = 2097152 <br />
kernel.sem = 250 32000 100 128 <br />
fs.file-max = 65536 <br />
net.ipv4.ip_local_port_range = 1024 65000 <br />
<br />
sem 4个参数依次为SEMMSL(每个用户拥有信号量最大数)；SEMMNS(系统信号量最大数)；SEMOPM(每次semopm系统调用操作数)；SEMMNI(系统辛苦量集数最大数). <br />
Shmmax 最大共享内存2GB 物理内存如果小的话可以设置成 536870912. <br />
Shmmni 最小共享内存 4096KB. <br />
Shmall 所有内存大小. <br />
<br />
设置完成后用命令 more /etc/sysctl.conf |grep kernel.s 检查. <br />
<br />
3、设置oracle对文件的要求： <br />
编辑文件：/etc/security/limits.conf 加入以下语句： <br />
oracle soft nofile 65536 <br />
oracle hard nofile 65536 <br />
oracle soft nproc 16384 <br />
oracle hard nproc 16384 <br />
<br />
4、设置系统环境： <br />
首先设置root用户这个终端的。 <br />
export ORACLE_BASE=/opt/ora9 <br />
export ORACLE_HOME=/opt/ora9/product/9.2 <br />
(Oracle被安装在这些位置) <br />
<br />
5.设置oracle用户的环境， 新开一个终端， <br />
su - oracle <br />
***注意一定要新开一个 *** <br />
<br />
打开.bash_profile文件，将如下内容加入： <br />
(命令vi $HOME/.bash_profile 编辑用VI使用可查手册 I 进入edit ;w 存盘 ;q退出) <br />
#oracle 9i <br />
export DISPLAY=&#8221;192.9.200.24:0.0&#8221; (127.0.0.1:0.0) <br />
export ORACLE_BASE=/opt/ora9 <br />
export ORACLE_HOME=/opt/ora9/product/9.2 <br />
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/Apache/Apache/bin:$PATH <br />
export ORACLE_OWNER=oracle <br />
export ORACLE_SID=ora9i (数据库全局变量名) <br />
export ORACLE_TERM=xterm (xterm窗口模式 vt100 终端调试模式) <br />
export LD_ASSUME_KERNEL=2.4.1 <br />
export THREADS_FLAG=native <br />
export LD_LIBRARY_PATH=/opt/ora9/product/9.2/lib:$LD_LIBRARY_PATH <br />
export PATH=/opt/ora9/product/9.2/bin:$PATH <br />
export NLS_LANG=AMERICAN (设置语言AMERICAN英文) <br />
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data <br />
保存后退出. 执行： source .bash_profile 查看 set | more <br />
然后。退出登录，再次进入，这时候oracle的环境就已经生效了. <br />
<br />
6、解压文件，安装前打补丁，切换到root用户的控制台：(注：打补丁前执行以下语句) <br />
#su &#8211; root <br />
#mv /usr/bin/gcc /usr/bin/gcc323 <br />
#ln &#8211;s /usr/bin/gcc296 /usr/bin/gcc <br />
#mv /usr/bin/g++296 /usr/bin/g++ <br />
#ln &#8211;s /usr/bin/g++ /usr/bin/g++296 <br />
第四,开始正式安装 <br />
1、建立oracle安装临时目录 su - root <br />
#cd /home <br />
#mkdir ora9i <br />
#cd ora9i <br />
这些目录你可以自己定义,用来存放安装文件。 <br />
<br />
2.解gz文件 (窗口模式解压不会把原档案删除，终端模式解压后自动删除原档案) <br />
#gunzip gunzip lnx_920_disk1.cpio.gz <br />
#gunzip lnx_920_disk2.cpio.gz <br />
#gunzip lnx_920_disk3.cpio.gz <br />
<br />
3.释放cpio文件 <br />
#cpio -idmv &lt; lnx_920_disk1.cpio <br />
#cpio -idmv &lt; lnx_920_disk2.cpio <br />
#cpio -idmv &lt; lnx_920_disk3.cpio <br />
//这个步骤将生成三个文件夹：DISK1, DISK2, DISK3 <br />
root身份运行，在/home/ora9i <br />
p3006854_9204_LINUX.zip 补丁安装：(已经将补丁解压到光盘) <br />
#unzip p3006854_9204_LINUX.zip <br />
#cd /home/ora9i /3006854 <br />
#sh rhe13_pre_install.sh <br />
Applying patch... <br />
Patch successfully applied <br />
<br />
4．完成Oracle的安装： <br />
新开一个控制终端(用root用户开) <br />
#xhost +192.168.0.2 (本地IP地址) <br />
(xhost disable访问控制，客户端可以从任何主机进行连接) <br />
这个命令用来保证oracle用户调用X11,否则无法安装 <br />
#su - oracle <br />
在登录终端中切换到oracle用户： <br />
在oracle主目录里运行:# /home/ora9i/Disk1/runInstaller <br />
<br />
********************************************** <br />
安装过程中的注意事项： <br />
1.在安装中让你输入 UNIX group name：oinstall (#groupadd oinstall) <br />
如果提示orainstRoot.sh权限问题，在root终端下执行： <br />
#sh /tmp/orainstRoot.sh 然后继续 <br />
2.在安装中选择 software only 不要建数据库 <br />
3. 安装过程中提示/opt/ora9/product/9.2 权限问题，可另开窗口修改权限为oracle-dba <br />
在结束的时候还会提示权限问题，另开窗口修改权限为root-root <br />
注意的是以下几点: <br />
Relink阶段,会出两个错误:ins_oemagent.mk 和 ins_ctx.mk. 点 Ignore 忽略. <br />
<br />
在部分文档里,要求oracle用户的bash_profile文件中降LD_ASSUME_KERNEL设置为2.4.19,千万不要这样设置,否则会在Rlink时会有一大堆报错 <br />
<br />
再安装过程中,系统会提醒你用root身份去执行两个sh文件,再root的登录终端中按提示操作就可以了 <br />
如果有NLS的错误提示，可以#unset LANG命令,把语言默认成英文. <br />
<br />
************************************************ <br />
5．开始升级oracle su - oracle <br />
安装结束后,HTTPD会自动运行.在升级之前,需要将它停下来. <br />
$ cd $ORACLE_HOME/Apache/Apache/bin <br />
$ apachectl stop <br />
./apachectl stop: httpd stopped <br />
LISTENER也需要停下来. <br />
$ lsnrctl stop <br />
LSNRCTL for Linux: Version 9.2.0.1.0 - Production on 07-NOV-2003 16:25:41 <br />
Copyright &#169; 1991, 2002, Oracle Corporation. All rights reserved. <br />
Connecting to (ADDRESS=(PROTOCOL=tcp)(PORT=1521)) <br />
The command completed successfully <br />
注意: 如果不停的话,oracle会提示不能覆盖文件.这个时候再去将服务停下来也可以,点Retry就可以了. <br />
<br />
开始打补丁升级. <br />
注意打补丁时使用root用户,切换到root用户控制台： <br />
解包: <br />
# unzip /home/ora9i/p3095277_9204_LINUX.zip <br />
Archive: p3095277_9204_LINUX.zip <br />
inflating: 9204_lnx32_release.cpio <br />
inflating: README.html <br />
inflating: patchnote.css <br />
(会在/home/ora9/Disk1下自动生成9204_lnx32_release.cpio) <br />
# cpio &#8211;idmv &lt; /home/ora9/Disk1/9204_lnx32_release.cpio <br />
做完这个后，再切换到oracle用户控制台， 再次运行/home/ora9i/Disk1/runInstaller升级，注意必须先选择最下面的安装选项，安装OUI <br />
要不然没有办法打那个最上面的升级补丁。 <br />
升级完OUI后，要退出，再次运行/home/ora9i/Disk1/runInstaller <br />
选择第一个选项,将Oracle升级到9.2.0.4。 <br />
这时候还是会有一个错误出现。再次选择忽略它。 <br />
安装过程中如果出现/opt/ora9/product/9.2 没有权限，直接找到文件夹更改权限. <br />
<br />
6.打其他的补丁： <br />
切换到root的终端。 <br />
首先安装 opatch. <br />
# unzip p2617419_210_GENERIC.zip <br />
Archive: p2617419_210_GENERIC.zip <br />
creating: OPatch/ <br />
creating: OPatch/docs/ <br />
inflating: Opatch/docs/FAQ <br />
...... <br />
inflating: README.txt <br />
#pwd (查看执行权限) <br />
#export PATH=$PATH:/home/ora9i/Opatch:/sbin <br />
(修改PATH时要要包括解压缩出来的Opatch 和 sbin目录) <br />
# unzip p3119415_9204_LINUX.zip <br />
Archive: p3119415_9204_LINUX.zip <br />
creating: 3119415/ <br />
inflating: 3119415/README.txt <br />
<br />
# cd 3119415 <br />
# opatch apply <br />
<br />
****如果提示HOME变量错误可执行语句：**** <br />
#export ORACLE_BASE=/opt/ora9 <br />
#export ORACLE_HOME=/opt/ora9/product/9.2 <br />
出现success的提示就全部安装成功. <br />
(出现选择ORACLE_HOME=/opt/ora9/product/9.2选择N) <br />
<br />
最后切换到oracle终端 <br />
#dbca (如果有乱码执行：#unset LANG) <br />
建oracle数据库 <br />
(查看安装完成后的检查和测试内容) <br />
*************************************** <br />
可能会出现错误提示： /etc/oratab file doesn&#8217;t exist <br />
可执行下面语句： <br />
#cd /opt/ora9/product/9.2/install/utl <br />
#sh root.sh <br />
**************************************** <br />
<br />
数据库建立完成后挂起oracle <br />
启动oracle监听 <br />
$lsnrctl <br />
lsnrctl&gt;status (查状态) <br />
lsnrctl&gt;start <br />
<br />
检查oracle服务是否挂起 <br />
$ps &#8211;ef |grep ora <br />
<br />
连接数据库 <br />
$sqlplus /nolog <br />
SQL&gt;connect / as sysdba <br />
SQL&gt;startup mount <br />
检查是否连接oracle <br />
SQL&gt;select sysdate from dual; <br />
Sp2-0640:Not connected <br />
挂起 <br />
SQL&gt;startup <br />
************************************************** <br />
如果出现错误信息： <br />
ORA-01078:failucr in processing system parameters <br />
LRM-00109:could not open parametet file/opt/ora9/product/9.2/dbs/initora9i.or <br />
执行： <br />
#cp /opt/ora9/admin/orcl/pfile/init.ora.613200412101 /opt/ora9/product/9.2/dbs/initora9.ora <br />
<img src ="http://www.blogjava.net/liaojiyong/aggbug/158451.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-11-06 09:52 <a href="http://www.blogjava.net/liaojiyong/archive/2007/11/06/158451.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SWT/JFace实践：为Composite添加滚动条效果（ScrolledComposite）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/10/31/157093.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 31 Oct 2007 01:07:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/10/31/157093.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/157093.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/10/31/157093.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/157093.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/157093.html</trackback:ping><description><![CDATA[工作中一个任务是为一个已经有的Composite添加滚动条，原以为可以这样实现：<br />
&nbsp;&nbsp;&nbsp; Composite scrollabledComposite = new Composite(parent, SWT.H_SCROLL | SWT.V_SCROLL);<br />
&nbsp;&nbsp;&nbsp;&nbsp; 再设置一下其它的参数就可以了，谁知这样是可以添加滚动条，但是滚动条里的Composite根本不会跟着动；于是，查API，发现有ScrolledComposite这个类，好家伙，这个类里的注释连main () 方法都提供了，正点！
<p>于是，我的代码如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parentComposite.setLayout(new FillLayout());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ScrolledComposite scrolledComposite = new ScrolledComposite(parentComposite,&nbsp; SWT.H_SCROLL|SWT.V_SCROLL);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Composite mainComposite = new Composite(scrolledComposite,SWT.NONE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scrolledComposite.setContent(mainComposite);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainComposite.setBackground(Display.getCurrent().getSystemColor&nbsp;(SWT.COLOR_WHITE));// White color<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainComposite.setLayout(new GridLayout(1,true));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridData data = new GridData(GridData.FILL_BOTH);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainComposite.setLayoutData(data);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Composite topComposite = new Composite(mainComposite, SWT.BORDER);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; topComposite.setLayout(new GridLayout(2, false));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; topComposite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));// White color</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reloadBtn = new Button(topComposite, SWT.PUSH);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reloadBtn.setText("&amp;Reload from preferences");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reloadBtn.setToolTipText("Reload values from preference page(Shift+R)");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveBtn = new Button(topComposite, SWT.PUSH);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveBtn.setText("&amp;Save to preferences");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveBtn.setToolTipText("save values to preference page(Shift+S)");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scrolledComposite.setExpandHorizontal(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scrolledComposite.setExpandVertical(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scrolledComposite.setMinWidth(800);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scrolledComposite.setMinHeight(400);</p>
<p><br />
&nbsp;<span style="color: red">总结：<br />
</span>&nbsp;1）在为Composite添加滚动条时，最上面的Composite的布局需设为FillLayout();<br />
&nbsp;2) 不要直接往scrolledComposite上面添加控件;<br />
&nbsp;3) 在创建完ScrolledComposite后不要忘记使用setContent()方法去设置滚动条所控制的Composite;<br />
&nbsp;4) 最重要的是,Scrolledcomposite的以下四个参数必须设置才能出现滚动条：<br />
&nbsp;&nbsp;&nbsp; scrolledComposite.setExpandHorizontal(true);<br />
&nbsp;&nbsp;&nbsp; scrolledComposite.setExpandVertical(true);<br />
&nbsp;&nbsp;&nbsp; scrolledComposite.setMinWidth(800);<br />
&nbsp;&nbsp;&nbsp; scrolledComposite.setMinHeight(400);<br />
&nbsp;&nbsp;&nbsp; 只有前两项设为true之后，后面的两项才起作用。<br />
5） 对于setMinWidth()和setMinHeight()方法，API的注释中是说用来设置滚动条出现的最小宽度和高度，但是我试了一下，有时出现滚动条了，<br />
&nbsp;&nbsp;&nbsp; 但是拖动滚动条还是不能显示Composite里面的全部内容，于是把setMinWidth()和setMinHeight()设大一些就可以了，个人感觉滚动条出现的<br />
&nbsp;&nbsp;&nbsp; 宽度和高度检测Scrolledcomposite自己已经实现了，这里的宽度和高度是指拖动滚动条里可以看到的Composite的最大宽度和最大高度。</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/157093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-10-31 09:07 <a href="http://www.blogjava.net/liaojiyong/archive/2007/10/31/157093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>把控制台重定向到GUI组件上（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/10/31/157092.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 31 Oct 2007 01:04:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/10/31/157092.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/157092.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/10/31/157092.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/157092.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/157092.html</trackback:ping><description><![CDATA[最近为一个项目的服务器的做一个界面的时候，为了能把原来在后台打印出来的相关信息重定向到GUI界面的时候，费了一些心思。都是以前在实现的时候大多数信息的打印和测试时使用的都是System.out和System.err之类，图个方便<img src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/images/emteeth.gif" align="absMiddle" border="0"  alt="" />，没有使用log功能。当然这是个不好的习惯。<br />
&nbsp;&nbsp;&nbsp;刚开始的时候用Swing做了一个面板，采用JTextPane组件作为打印信息的容器。可能是太久没有用Swing了，在测试的时候这个东西的水平滑动块老是随着信息的显示自动地滑向最后的地方，而且打印信息看起来很凌乱。后来就换用SWT，把打印的信息容器换用Text组件，把样式定义为SWT.MULT | SWT.V_SCROLL | SWT.WRAP ，让它可以自动换行。<br />
&nbsp;&nbsp;&nbsp;查一下JDK的API文档，System类提供了可以重定向的方法setOut(PrintStream out)、setErr(PrintStream err)、setIn(InputStream in)。在此我们只需求使用setOut和setErr就够了，这二个方法都要传入一个PrintStream类型的参数，只要在调用打印信息的前面调用这二个方法重设输出流和错误流就可以达到我们的目的。那么我们继承PrintStream类，并把要显示信息的组件作为参数传入到这个自定义的打印流类中。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_47_461_Open_Image" onclick="this.style.display='none'; Codehighlighter1_47_461_Open_Text.style.display='none'; Codehighlighter1_47_461_Closed_Image.style.display='inline'; Codehighlighter1_47_461_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_47_461_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_47_461_Closed_Text.style.display='none'; Codehighlighter1_47_461_Open_Image.style.display='inline'; Codehighlighter1_47_461_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyPrintStream&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;PrintStream&nbsp;</span><span id="Codehighlighter1_47_461_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Text&nbsp;text;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img id="Codehighlighter1_123_160_Open_Image" onclick="this.style.display='none'; Codehighlighter1_123_160_Open_Text.style.display='none'; Codehighlighter1_123_160_Closed_Image.style.display='inline'; Codehighlighter1_123_160_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_123_160_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_123_160_Closed_Text.style.display='none'; Codehighlighter1_123_160_Open_Image.style.display='inline'; Codehighlighter1_123_160_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;MyPrintStream(OutputStream&nbsp;out,&nbsp;Text&nbsp;text)&nbsp;</span><span id="Codehighlighter1_123_160_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">(out);<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.text&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;text;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img id="Codehighlighter1_164_196_Open_Image" onclick="this.style.display='none'; Codehighlighter1_164_196_Open_Text.style.display='none'; Codehighlighter1_164_196_Closed_Image.style.display='inline'; Codehighlighter1_164_196_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_164_196_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_164_196_Closed_Text.style.display='none'; Codehighlighter1_164_196_Open_Image.style.display='inline'; Codehighlighter1_164_196_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_164_196_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_164_196_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">11</span><span style="color: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;在这里重截,所有的打印方法都要调用的方法<br />
</span><span style="color: #008080">12</span><span style="color: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img id="Codehighlighter1_247_457_Open_Image" onclick="this.style.display='none'; Codehighlighter1_247_457_Open_Text.style.display='none'; Codehighlighter1_247_457_Closed_Image.style.display='inline'; Codehighlighter1_247_457_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_247_457_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_247_457_Closed_Text.style.display='none'; Codehighlighter1_247_457_Open_Image.style.display='inline'; Codehighlighter1_247_457_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;write(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;buf,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;off,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;len)&nbsp;</span><span id="Codehighlighter1_247_457_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;String&nbsp;message&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(buf,&nbsp;off,&nbsp;len);<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img id="Codehighlighter1_306_326_Open_Image" onclick="this.style.display='none'; Codehighlighter1_306_326_Open_Text.style.display='none'; Codehighlighter1_306_326_Closed_Image.style.display='inline'; Codehighlighter1_306_326_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_306_326_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_306_326_Closed_Text.style.display='none'; Codehighlighter1_306_326_Open_Image.style.display='inline'; Codehighlighter1_306_326_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_306_326_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_306_326_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;SWT非界面线程访问组件的方式&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img id="Codehighlighter1_372_452_Open_Image" onclick="this.style.display='none'; Codehighlighter1_372_452_Open_Text.style.display='none'; Codehighlighter1_372_452_Closed_Image.style.display='inline'; Codehighlighter1_372_452_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_372_452_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_372_452_Closed_Text.style.display='none'; Codehighlighter1_372_452_Open_Image.style.display='inline'; Codehighlighter1_372_452_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Display.getDefault().syncExec(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Thread()</span><span id="Codehighlighter1_372_452_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img id="Codehighlighter1_394_448_Open_Image" onclick="this.style.display='none'; Codehighlighter1_394_448_Open_Text.style.display='none'; Codehighlighter1_394_448_Closed_Image.style.display='inline'; Codehighlighter1_394_448_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_394_448_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_394_448_Closed_Text.style.display='none'; Codehighlighter1_394_448_Open_Image.style.display='inline'; Codehighlighter1_394_448_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run()</span><span id="Codehighlighter1_394_448_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img id="Codehighlighter1_400_417_Open_Image" onclick="this.style.display='none'; Codehighlighter1_400_417_Open_Text.style.display='none'; Codehighlighter1_400_417_Closed_Image.style.display='inline'; Codehighlighter1_400_417_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_400_417_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_400_417_Closed_Text.style.display='none'; Codehighlighter1_400_417_Open_Image.style.display='inline'; Codehighlighter1_400_417_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_400_417_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_400_417_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;在这里把信息添加到组件中&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text.append(message);<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">);<br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
把组件作为参数传入到这个打印流中，并重写父类的write(byte[] buf, int off, int len)方法，把写出的信息添加到组件上，注意到重载了带OutputStream的构造方法。<br />
&nbsp;&nbsp;&nbsp;这里有二点必须注意，确保组件在调用打印信息添加前是已经被正确创建的，另外必须注册不同GUI组件对线程的访问形式，像上面的SWT就对界面的访问有严格的规定。<br />
&nbsp;&nbsp; 完成了PrintStream后，下面是如何使用，在我们启动界面后，使用下面的方式：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">MyPrintStream&nbsp;mps&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MyPrintStream(System.out,&nbsp;text);<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setOut(mps);<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setErr(mps);</span></div>
<br />
，这样就可以把原来程序里的所有System.out和System.err信息转移到你的GUI界面上。<br />
<img src ="http://www.blogjava.net/liaojiyong/aggbug/157092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-10-31 09:04 <a href="http://www.blogjava.net/liaojiyong/archive/2007/10/31/157092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个ActionDelegate代理多个Action </title><link>http://www.blogjava.net/liaojiyong/archive/2007/10/31/157091.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 31 Oct 2007 00:59:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/10/31/157091.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/157091.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/10/31/157091.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/157091.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/157091.html</trackback:ping><description><![CDATA[以前在做Eclipse插件的时候，习惯一个功能定义一个操作项。比如说在org.eclipse.ui.popupMenus扩展点上，如果有添加这个功能，但是添加的类型有多样，我们假定现在有添加A、B、C、D四个元素，在扩展点上添加一个viewerContribution扩展，添加四个Action，分别为A、B、C、D。因为这四个添加功能非常相近，所以我们可以只写一个ActionDelegate，把这四个Action的代理类都指向同一个。但是ID必须区分。声明定义如下：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">viewerContribution<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="test.viewerContribution1"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetID</span><span style="color: #0000ff">="test.testView"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="test.AddTestDelegate"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</span><span style="color: #0000ff">="add.a"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label</span><span style="color: #0000ff">="A"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menubarPath</span><span style="color: #0000ff">="test"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="test.AddTestDelegate"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</span><span style="color: #0000ff">="add.b"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label</span><span style="color: #0000ff">="B"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menubarPath</span><span style="color: #0000ff">="test"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="test.AddTestDelegate"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</span><span style="color: #0000ff">="add.c"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label</span><span style="color: #0000ff">="C"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menubarPath</span><span style="color: #0000ff">="test"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="test.AddTestDelegate"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</span><span style="color: #0000ff">="add.d"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label</span><span style="color: #0000ff">="D"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menubarPath</span><span style="color: #0000ff">="test"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">viewerContribution</span><span style="color: #0000ff">&gt;</span></div>
<p>&nbsp;&nbsp;&nbsp; 上面的主要区别是在id，在所有的代理ActionDelegate中的run(IAction action)方法中都带有一个参数action，这个参数有个用途就是可以在运行时区别是对应的那个action。下面我们看一下AddTestDelegate类的定义：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;test;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.jface.action.IAction;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.jface.viewers.ISelection;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.ui.IViewActionDelegate;<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.ui.IViewPart;<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img id="Codehighlighter1_238_713_Open_Image" onclick="this.style.display='none'; Codehighlighter1_238_713_Open_Text.style.display='none'; Codehighlighter1_238_713_Closed_Image.style.display='inline'; Codehighlighter1_238_713_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_238_713_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_238_713_Closed_Text.style.display='none'; Codehighlighter1_238_713_Open_Image.style.display='inline'; Codehighlighter1_238_713_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;AddTestDelegate&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;IViewActionDelegate&nbsp;</span><span id="Codehighlighter1_238_713_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_238_713_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;IViewPart&nbsp;view;<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img id="Codehighlighter1_292_316_Open_Image" onclick="this.style.display='none'; Codehighlighter1_292_316_Open_Text.style.display='none'; Codehighlighter1_292_316_Closed_Image.style.display='inline'; Codehighlighter1_292_316_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_292_316_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_292_316_Closed_Text.style.display='none'; Codehighlighter1_292_316_Open_Image.style.display='inline'; Codehighlighter1_292_316_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;AddTestDelegate()&nbsp;</span><span id="Codehighlighter1_292_316_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_292_316_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO&nbsp;自动生成构造函数存根</span><span style="color: #008000"><br />
</span><span style="color: #008080">13</span><span style="color: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img id="Codehighlighter1_353_377_Open_Image" onclick="this.style.display='none'; Codehighlighter1_353_377_Open_Text.style.display='none'; Codehighlighter1_353_377_Closed_Image.style.display='inline'; Codehighlighter1_353_377_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_353_377_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_353_377_Closed_Text.style.display='none'; Codehighlighter1_353_377_Open_Image.style.display='inline'; Codehighlighter1_353_377_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init(IViewPart&nbsp;view)&nbsp;</span><span id="Codehighlighter1_353_377_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_353_377_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.view&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;view;<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img id="Codehighlighter1_413_616_Open_Image" onclick="this.style.display='none'; Codehighlighter1_413_616_Open_Text.style.display='none'; Codehighlighter1_413_616_Closed_Image.style.display='inline'; Codehighlighter1_413_616_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_413_616_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_413_616_Closed_Text.style.display='none'; Codehighlighter1_413_616_Open_Image.style.display='inline'; Codehighlighter1_413_616_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run(IAction&nbsp;action)&nbsp;</span><span id="Codehighlighter1_413_616_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_413_616_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;action.getId();<br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img id="Codehighlighter1_472_486_Open_Image" onclick="this.style.display='none'; Codehighlighter1_472_486_Open_Text.style.display='none'; Codehighlighter1_472_486_Closed_Image.style.display='inline'; Codehighlighter1_472_486_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_472_486_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_472_486_Closed_Text.style.display='none'; Codehighlighter1_472_486_Open_Image.style.display='inline'; Codehighlighter1_472_486_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(id.equals(</span><span style="color: #000000">"</span><span style="color: #000000">add.a</span><span style="color: #000000">"</span><span style="color: #000000">))</span><span id="Codehighlighter1_472_486_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_472_486_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">TODO</span><span style="color: #008000"><br />
</span><span style="color: #008080">25</span><span style="color: #008000"><img id="Codehighlighter1_514_528_Open_Image" onclick="this.style.display='none'; Codehighlighter1_514_528_Open_Text.style.display='none'; Codehighlighter1_514_528_Closed_Image.style.display='inline'; Codehighlighter1_514_528_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_514_528_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_514_528_Closed_Text.style.display='none'; Codehighlighter1_514_528_Open_Image.style.display='inline'; Codehighlighter1_514_528_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(id.equals(</span><span style="color: #000000">"</span><span style="color: #000000">add.b</span><span style="color: #000000">"</span><span style="color: #000000">))</span><span id="Codehighlighter1_514_528_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_514_528_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">TODO</span><span style="color: #008000"><br />
</span><span style="color: #008080">27</span><span style="color: #008000"><img id="Codehighlighter1_556_570_Open_Image" onclick="this.style.display='none'; Codehighlighter1_556_570_Open_Text.style.display='none'; Codehighlighter1_556_570_Closed_Image.style.display='inline'; Codehighlighter1_556_570_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_556_570_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_556_570_Closed_Text.style.display='none'; Codehighlighter1_556_570_Open_Image.style.display='inline'; Codehighlighter1_556_570_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(id.equals(</span><span style="color: #000000">"</span><span style="color: #000000">add.c</span><span style="color: #000000">"</span><span style="color: #000000">))</span><span id="Codehighlighter1_556_570_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_556_570_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">TODO</span><span style="color: #008000"><br />
</span><span style="color: #008080">29</span><span style="color: #008000"><img id="Codehighlighter1_598_612_Open_Image" onclick="this.style.display='none'; Codehighlighter1_598_612_Open_Text.style.display='none'; Codehighlighter1_598_612_Closed_Image.style.display='inline'; Codehighlighter1_598_612_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_598_612_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_598_612_Closed_Text.style.display='none'; Codehighlighter1_598_612_Open_Image.style.display='inline'; Codehighlighter1_598_612_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(id.equals(</span><span style="color: #000000">"</span><span style="color: #000000">add.d</span><span style="color: #000000">"</span><span style="color: #000000">))</span><span id="Codehighlighter1_598_612_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_598_612_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">30</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">TODO</span><span style="color: #008000"><br />
</span><span style="color: #008080">31</span><span style="color: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">34</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">35</span><span style="color: #000000"><img id="Codehighlighter1_687_710_Open_Image" onclick="this.style.display='none'; Codehighlighter1_687_710_Open_Text.style.display='none'; Codehighlighter1_687_710_Closed_Image.style.display='inline'; Codehighlighter1_687_710_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_687_710_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_687_710_Closed_Text.style.display='none'; Codehighlighter1_687_710_Open_Image.style.display='inline'; Codehighlighter1_687_710_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;selectionChanged(IAction&nbsp;action,&nbsp;ISelection&nbsp;selection)&nbsp;</span><span id="Codehighlighter1_687_710_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_687_710_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">36</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO&nbsp;自动生成方法存根</span><span style="color: #008000"><br />
</span><span style="color: #008080">37</span><span style="color: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
</span><span style="color: #008080">38</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">39</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">40</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<p>&nbsp;&nbsp;&nbsp; 我们可以在运行时通过action.getId()在识别是对应的那个Action。<br />
&nbsp;&nbsp; 总结：这个途径可以为插件开发中避免写过多的ActionDelegate，把一些功能较为接近实现代码又比较少的操作合并在一起。当然，对于操作步骤比较多的，为了代码维护的方便，还是建议单独为它定义一个代理。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/157091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-10-31 08:59 <a href="http://www.blogjava.net/liaojiyong/archive/2007/10/31/157091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>保存你的RCP视图状态（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/10/31/157087.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 31 Oct 2007 00:46:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/10/31/157087.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/157087.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/10/31/157087.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/157087.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/157087.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 每当做开发的时候，你有可能在一次调试程序的过程中打开很多个编辑器，或是对Eclipse默认的视图布局不满意，手工作了一些调整。如果在工作的过程你因为有事离开或是不小心把Eclipse关掉了，不用担心，在你下次打开的时候，Eclipse仍然会为您记住上次的工作场景。下面是一个例子场景:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/liaojiyong/archive/2007/10/31/157087.html'>阅读全文</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/157087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-10-31 08:46 <a href="http://www.blogjava.net/liaojiyong/archive/2007/10/31/157087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>添加完整的Eclipse RCP帮助系统(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/10/31/157086.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 31 Oct 2007 00:44:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/10/31/157086.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/157086.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/10/31/157086.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/157086.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/157086.html</trackback:ping><description><![CDATA[开发基于Eclipse开的RCP软件可以直接加入Eclipse的帮助系统，使您的产品更加完善。Eclipse帮助系统提供的良好组织模式以及基于lucene的全文搜索功能。在Eclipse的网站上有一篇文章专门介绍如何为Mail示例RCP添加帮助系统的，但是写的不完全，按照里面的说明添加后无法正常地显示帮助框架。网上有少部分文章也提及这个主题，但是都没有说明白。<br />
&nbsp;&nbsp;&nbsp; 经过一翻摸索，最后终于折腾出来，在这里记录下面，与大家分享。如果你做过RCP产品，下面这些内容应该很熟悉。<br />
&nbsp;&nbsp;&nbsp; 1. 添加帮助的菜单。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在ApplicationActionBarAdvisor类中加入帮助菜单项。代码片断如下：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">帮助</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;IWorkbenchAction&nbsp;helpAction;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;创建操作<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">protected</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;makeActions(IWorkbenchWindow&nbsp;window)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">/*</span><span style="color: rgb(0,128,0)">&nbsp;帮助&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.....<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helpAction&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;ActionFactory.HELP_CONTENTS.create(window);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;register(helpAction);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .....</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;填充主菜单<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">protected</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;fillMenuBar(IMenuManager&nbsp;menuBar)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">/*</span><span style="color: rgb(0,128,0)">&nbsp;主菜单栏&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IMenuManager&nbsp;mainMenu&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;getActionBarConfigurer().getMenuManager();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MenuManager&nbsp;helpMenu&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;MenuManager(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">帮助(&amp;H)</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">,&nbsp;IWorkbenchActionConstants.M_HELP);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helpMenu.add(introAction);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helpMenu.add(helpAction);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainMenu.add(helpMenu);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
&nbsp;&nbsp; 2.&nbsp; 添加相关的依赖项。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打开plugin.xml，转到"依赖项"的tab页,点击"添加"按钮，需要加入下面的这些依赖项：
<div style="border-right: rgb(102,102,102) 1px solid; border-top: rgb(102,102,102) 1px solid; border-left: rgb(102,102,102) 1px solid; border-bottom: rgb(102,102,102) 1px solid">1.<span><span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"> </span></span><tt>org.apache.lucene<br />
2.</tt><tt>org.eclipse.help.appserver<br />
3.</tt><tt>org.eclipse.help.base<br />
4.</tt><tt>org.eclipse.help.ui<br />
5.</tt><tt>org.eclipse.help.webapp<br />
6.</tt><tt>org.eclipse.tomcat<br />
7.org.eclipse.ui.forms<br />
</tt></div>
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 3. 添加org.eclipse.help.toc扩展点<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 这个非常容易，转到"扩展"tab页，点击&#8220;添加&#8221;按钮。网上或是相关的书籍有很多关于添加help内容的介绍，为了节省篇幅，这里直接添加一个扩展向导来完成。选择"扩展向导"--&gt;"帮助内容"，确定后可以看到&#8220;所有扩展&#8221;的列表中多了一个org.eclipse.help.toc扩展，这里可能需要修改一下，生成的toc.xml和testToc.xml里面的label属性标签不能是乱码，不然帮助框架会读不出，到时候显示不出帮助的组织结构。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 结构如下：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">extension<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255,0,0)">point</span><span style="color: rgb(0,0,255)">="org.eclipse.help.toc"</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">toc&nbsp;</span><span style="color: rgb(255,0,0)">file</span><span style="color: rgb(0,0,255)">="toc.xml"</span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">toc<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255,0,0)">file</span><span style="color: rgb(0,0,255)">="testToc.xml"</span><span style="color: rgb(255,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;primary</span><span style="color: rgb(0,0,255)">="true"</span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">extension</span><span style="color: rgb(0,0,255)">&gt;</span></div>
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 4. 部署产品配置<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 为您的RCP添加一个产品配置，打开产品配置编辑器（xxx.product），转到"配置"tab页，点击&#8220;添加&#8221;，加入你的插件，然后点击&#8220;添加必需的插件&#8221;,这样在&#8220;插件和段&#8221;列表会看到你的插件以及你的RCP要完整启动的所有必需相关插件。在这里你应该看到你在plugin.xml中依赖的那七个help相关的插件，以及一些以nl1结尾的插件，这些是语言插件。保存，转到&#8220;概述&#8221;tab页，点击"启动产品"。然后打开&#8220;帮助--&gt; 帮助内容&#8221;，就可能看到你的帮助系统了。<br />
&nbsp;&nbsp;&nbsp; 到此一个完整的帮助系统就完成了。下面是一个截图：<br />
&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.blogjava.net/images/blogjava_net/nighty/h.jpg" />
<img src ="http://www.blogjava.net/liaojiyong/aggbug/157086.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-10-31 08:44 <a href="http://www.blogjava.net/liaojiyong/archive/2007/10/31/157086.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle启动停止命令 (转)     </title><link>http://www.blogjava.net/liaojiyong/archive/2007/10/26/156094.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 26 Oct 2007 04:48:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/10/26/156094.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/156094.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/10/26/156094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/156094.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/156094.html</trackback:ping><description><![CDATA[<p>1、启动数据库：</p>
<div>oracle@suse92:~&gt; sqlplus /nolog</div>
<div>&nbsp;</div>
<div>SQL*Plus: Release 9.2.0.4.0 - Production on Fri Jan 20 02:29:37 2006</div>
<div>&nbsp;</div>
<div>Copyright (c) 1982, 2002, Oracle Corporation.&nbsp;All rights reserved.</div>
<div>&nbsp;</div>
<div>SQL&gt; connect /as sysdba</div>
<div>Connected to an idle instance.</div>
<div>SQL&gt; startup</div>
<div>ORACLE instance started.</div>
<div>&nbsp;</div>
<div>Total System Global Area&nbsp;135352820 bytes</div>
<div>Fixed Size<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 455156 bytes</span></div>
<div>Variable Size<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 109051904 bytes</span></div>
<div>Database Buffers<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25165824 bytes</span></div>
<div>Redo Buffers<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 679936 bytes</span></div>
<div>Database mounted.</div>
<div>2、关闭数据库：</div>
<div>oracle@suse92:~&gt; sqlplus /nolog</div>
<div>&nbsp;</div>
<div>SQL*Plus: Release 9.2.0.4.0 - Production on Fri Jan 20 02:29:37 2006</div>
<div>&nbsp;</div>
<div>Copyright (c) 1982, 2002, Oracle Corporation.&nbsp;All rights reserved.</div>
<div>&nbsp;</div>
<div>SQL&gt; connect /as sysdba</div>
<div>Connected to an idle instance.</div>
<div>SQL&gt; shutdwon abort;</div>
<div>3、启动监听器</div>
<div>oracle@suse92:~&gt; lsnrctl start</div>
<div>4、停止监听器</div>
<div>oracle@suse92:~&gt; lsnrctl stop</div>
<div>5、查看监听器状态</div>
<div>　　oracle@suse92:~&gt; lsnrctl</div>
<div>　　LSNRCTL&gt; status</div>
<div>　　LSNRCTL&gt; exit</div>
<div></div>
<div>-------------------------------------------------------------------</div>
<div>More Detail:</div>
<div><a href="http://www.softone.com.cn/serve04_03.asp">http://www.softone.com.cn/serve04_03.asp</a></div>
<div></div>
<div><span class="b12red">ORACLE 安装配置方法 (以ORACLE8.1.6为例)</span><br />
<br />
<span class="b12red">一、安装</span><br />
<br />
<strong>1、服务端</strong><br />
　　服务端安装前提条件：操作系统为WINDOWS 2000、WINDOWS NT。<br />
　　步骤：<br />
　　1) 找到ORACLE 8.1.6的安装目录，点击SETUP.EXE文件，进入"Oracle Universal Installer"界面；<br />
　　　<img height="309" alt="" src="http://www.softone.com.cn/images/p11.jpg" width="399" /><br />
<br />
　　2) 在弹出的窗体中选择"下一步"继续安装，弹出以下窗体；如果以前安装过ORACLE，则点击"卸装产品"按钮(卸载过程见第二章：卸载)，如果要查看以前安装的ORACLE，点击"已安装产品"按钮。<br />
　　　<img height="320" alt="" src="http://www.softone.com.cn/images/p12.jpg" width="409" /><br />
<br />
　　3) 选择文件来源和待安装目录，点击"下一步"，弹出以下界面；<br />
来源路径一般为默认路径，但不管是本地安装还是在其它机器上安装，安装数据来源路径必须为ORACLE目录下STAGE文件夹下的PRODUCTS.JAR文件。<br />
　　名称默认为：ORAHOME81，该名称是ORACLE安装时在注册表中名称，建议不要修改，采用系统默认的名称。<br />
　　路径为当前ORACLE待安装的路径，可修改。修改时，建议只修改安装的磁盘分区，如图中的"e"，后面的"Oracle\Ora81"建议采用系统默认安装目录。<br />
　　　<img height="296" alt="" src="http://www.softone.com.cn/images/p13.jpg" width="374" /><br />
<br />
　　4) 在"可用产品"窗体中，如果安装服务端程序，则在"选择要安装的产品"选项中选择"Oracle 8i Enterprise Edition 8.1.6.0.0；如果安装客户端程序，则在"选择要安装的产品"选项中选择"Oracle 8i Client 8.1.6.0.0；选择安装产品后，点击"下一步"，弹出以下窗体：<br />
　　　<img height="269" alt="" src="http://www.softone.com.cn/images/p14.jpg" width="349" /><br />
<br />
　　5）、选择安装类型，一般选择默认的"典型（1001MB）"，"自定义"为高级用户选项，建议不选择此项，选择安装类型后，点击"下一步"，弹出以下窗体；<br />
　　　<img height="313" alt="" src="http://www.softone.com.cn/images/p15.jpg" width="397" /> <br />
<br />
　　6）、输入全局数据库名和SID，全局数据库名为ORACLE连接串，可任意录入，如：test.softone.com，SID为ORACLE连接服务，客户端需以此录入的SID进行连接（需牢记），录入完成后，点击"下一步"，弹出以下界面；<br />
　　　<img height="309" alt="" src="http://www.softone.com.cn/images/p16.jpg" width="399" /> <br />
<br />
　　7）在"摘要"窗口点击"安装"，弹出以下界面：<br />
　　　<img height="300" alt="" src="http://www.softone.com.cn/images/p17.jpg" width="386" /><br />
<br />
　　8）安装完成后出现以下界面，进行系统自动配置NET8 CONFIGURATION ASSISTANT.<br />
　　　<img height="307" alt="" src="http://www.softone.com.cn/images/p18.jpg" width="382" /><br />
<br />
　　9）NET8配置完成后，系统自动创建数据库<br />
　　　<img height="251" alt="" src="http://www.softone.com.cn/images/p19.jpg" width="376" /> <br />
<br />
　　10）数据库创建完成，点击"确定" 退出<br />
　　　<img height="209" alt="" src="http://www.softone.com.cn/images/p20.jpg" width="371" /> <br />
<br />
　　11）安装完成，点击"退出"按钮，退出安装过程。<br />
　　　<img height="307" alt="" src="http://www.softone.com.cn/images/p21.jpg" width="393" /><br />
<br />
<strong>2、客户端</strong><br />
　　操作过程同服务端安装。<br />
<br />
<span class="b12red">二、卸载</span><br />
<br />
<strong>1、服务端</strong><br />
　　1）、找到ORACLE 8.1.6的安装目录，点击SETUP.EXE文件，弹出以下界面：<br />
<br />
　　2）、在弹出的窗体中选择"卸装产品"按钮，弹出以下界面；<br />
<br />
　　3）、选择已安装的产品，点击"删除"按钮，弹出以下窗体；<br />
<br />
　　4）在弹出"确认"对话框，点击"是"，弹出以下窗体；<br />
<br />
　　5）、删除完成后，弹出以下界面，点击"关闭"按钮退出。<br />
<br />
　　6）、退出后回到欢迎界面：<br />
<br />
　　7）、用户可点击"下一步"进行安装或点击"退出"按钮结束卸载过程。<br />
<br />
<strong>2、客户端</strong><br />
　　与服务端卸载过程相同。<br />
<br />
<span class="b12red">三、ORACLE实例启动和关闭</span><br />
<br />
<strong>1、使用SQL*PLUS启动和终止实例</strong><br />
<br />
1.1、本地启动<br />
　　在命令提示符下输入：<br />
　　SQLPLUS /NOLOG<br />
　　CONNECT /AS SYSDBA<br />
　　STARTUP<br />
<br />
1.2、本地关闭<br />
　　在命令提示符下输入：<br />
　　SQLPLUS /NOLOG<br />
　　CONNECT /AS SYSDBA<br />
　　SHUTDOWN<br />
<br />
1.3、远程启动<br />
　　在命令提示符下输入（此方式必须先进行关闭数据库操作，见1.4、远程关闭（要求远程数据库必须是已启动），在E:\ORACLE\ORA81\SYSMAN\IFILES目录下生成一个DE_TEST_ZCB_8112.ORA文件后，再以此文件启动数据库）：<br />
　　SQLPLUS /NOLOG<br />
　　CONNECT INTERNAL/ORACLE@TEST.SOFTONE.COM AS SYSDBA<br />
　　STARTUP FILE=E:\ORACLE\ORA81\SYSMAN\IFILES\DE_TEST_ZCB_8112.ORA<br />
　　此路径为远程启动服务路径，一般情况下在本地安装目录的ORACLE\ORA81\SYSMAN\IFILES下。<br />
INTERNAL 为用户名，ORACLE为密码，TEST.SOFTONE.COM为远程服务连接串。<br />
<br />
1.4、远程关闭<br />
　　在命令提示符下输入：<br />
　　SQLPLUS /NOLOG<br />
　　CONNECT INTERNAL/ORACLE@TEST.SOFTONE.COM AS SYSDBA<br />
　　SHUTDOWN<br />
　　INTERNAL 为用户名，ORACLE为密码，TEST.SOFTONE.COM为远程服务连接串。 <br />
<br />
<strong>2、 用服务器管理器启动和终止实例</strong><br />
<br />
2.1、本地启动<br />
　　在命令提示符下输入：<br />
　　SVRMGRL<br />
　　CONNECT INTERNAL<br />
　　STARTUP<br />
<br />
2.2、本地关闭<br />
　　在命令提示符下输入：<br />
　　SVRMGRL<br />
　　CONNECT INTERNAL<br />
　　SHUTDOWN<br />
<br />
2.3、远程启动<br />
　　在命令提示符下输入（此方式必须先进行关闭数据库操作，见2.4、远程关闭（要求远程数据库必须是已启动），在E:\ORACLE\ORA81\SYSMAN\IFILES目录下生成一个DE_TEST_ZCB_8112.ORA文件后，再以此文件启动数据库）：<br />
　　SVRMGRL<br />
　　CONNECT INTERNAL/ORACLE@TEST.SOFTONE.COM AS SYSDBA<br />
　　STARTUP<br />
　　PFILE= E:\ORACLE\ORA81\SYSMAN\IFILES\DE_TEST_ZCB_8112.ORA<br />
　　INTERNAL 为用户名，ORACLE为密码，TEST.SOFTONE.COM为远程服务连接串。<br />
　　此路径为远程启动服务路径，一般情况下在本地安装目录的ORACLE\ORA81\SYSMAN\IFILES下。<br />
<br />
2.4、远程关闭<br />
　　在命令提示符下输入：<br />
　　SVRMGRL<br />
　　CONNECT INTERNAL/ORACLE@TEST.SOFTONE.COM AS SYSDBA<br />
　　SHUTDOWN<br />
<br />
<strong>3、 用实例管理程序启动和终止实例</strong><br />
　　1）、打开管理程序,如图<br />
<br />
　　2）、点击DBA STUDIO，进入"oracle enterprise manager 登录"窗口<br />
<br />
　　3）、选择"LAUNCH DBA STUDIO STANDALONE"，点击"确定"按钮，弹出以下窗体；<br />
<br />
　　4）、在左边的列表中双击或点击右键菜单中的"连接"，弹出以下窗体；<br />
<br />
　　5）、录入用户名：INTERNAL，口令：oracle，选择连接身份为"SYSDBA"，点击确定，出现以下界面，选择例程下的数据库，点击"打开"单选框，再点击"应用"按纽<br />
<br />
　　6）如果没有使用的数据库，可在文件菜单中选择"将数据库添加到树"<br />
<br />
　　7）录入主机名，端口号、SID和网络服务名。主机名为本地计算机名，如果连接远程服务器，则录入远程计算机名；端口号默认为1521，不能修改；SID为安装时录入的SID（必须一致），如果连接的为远程数据库，则录入远程服务器的SID；网络服务名可为安装时录入的网络服务名，可任意修改；最后点击"确定"即可。<br />
<br />
　　8）、重复步骤4、5。<br />
<br />
4、 使用服务控制面板启动和终止实例<br />
　　　<img height="392" alt="" src="http://www.softone.com.cn/images/p22.jpg" width="554" /><br />
<span class="b12red"><br />
四、NET8监听器</span><br />
<br />
1）、 在命令提示符下录入：<br />
　　LSNRCTL<br />
　　START（启动）<br />
　　STOP（关闭）<br />
　　STATUS（查看状态）<br />
<br />
2）、也可在控制面板的服务中选择ORACLE ORAHOME81 TNSLISTENER，双击或点击鼠标右键点击"启动"。 <br />
<br />
<span class="b12red">五、TNSNAMES.ORA配置</span><br />
<br />
　　在安装目录下，如：E:\Oracle\Ora81\network\ADMIN下用写字板或记事本打开TNSNAME.ORA文件，文件内容大概如下：<br />
　　TEST.SOFTONE.COM =<br />
　　(DESCRIPTION =<br />
　　(ADDRESS_LIST =<br />
　　(ADDRESS = (PROTOCOL = TCP)(HOST = zcb_8115)(PORT = 1521))<br />
　　)<br />
　　(CONNECT_DATA =<br />
　　(SERVICE_NAME = test)<br />
　　)<br />
　　)<br />
　　蓝色部分为安装时录入的信息。<br />
<br />
　　如果该文件没有配置成功，该文件可通过以下步骤进行配置：<br />
　　1）、在程序菜单中打开NET8 CONFIGURATION ASSISTANT<br />
<br />
　　2）、选择Net8 Configuration Assistant,打开，进入"Net8 Configuration Assistant:欢迎"窗口<br />
<br />
　　2）、选择"本地网络服务名设置"，点击"下一步"， 弹出以下窗体；<br />
<br />
　　3）、在"Net8 Configuration Assistant:网络服务名配置"窗口中选择"添加"，点击"下一步"， 弹出以下窗体；<br />
<br />
　　4）在"Net8 Configuration Assistant:网络服务名配置，数据库版本"窗口中选择"ORACLE 8I数据库或服务"，点击"下一步"，弹出以下窗体；<br />
<br />
　　5）在"Net8 Configuration Assistant:网络服务名配置，服务名"窗口输入服务名，此服务名跟安装时录入的服务名（SID）相同，录入后，点击"下一步"，弹出以下窗体；<br />
<br />
　　6）、在"Net8 Configuration Assistant:网络服务名配置，请选择协议"窗口选择"TCP"此时只能选择"TCP"，点击"下一步", 弹出以下窗体；<br />
<br />
　　7）在"Net8 Configuration Assistant:网络服务名配置，TCP/IP协议"窗口输入主机名（如果连接本地数据库，则录入本地计算机名，如果连接远程数据库，则录入远程计算机名），选择默认的"请使用标准端口号1521"（建议最好不要修改），点击"下一步"，弹出以下窗体；<br />
<br />
　　8）、在"Net8 Configuration Assistant:网络服务名配置，测试"窗口选择"是，进行测试"，点击"下一步"，弹出以下窗体；<br />
<br />
　　9）、当"Net8 Configuration Assistant:网络服务名配置，正在连接"窗口对话框中出现提示"正在连接&#8230;.测试成功"信息，表示测试通过。此时点击"下一步"，进入"Net8 Configuration Assistant: 网络服务名配置，网络服务名"窗口；<br />
<br />
　　10）、在"Net8 Configuration Assistant:网络服务名配置，网络服务名"窗口输入网络服务名，服务名为ORACLE连接串，可任意录入，如：test，点击"下一步"，弹出以下窗体；<br />
<br />
　　11）、在"Net8 Configuration Assistant:网络服务名配置，是否需要另一个网络服务名"窗口中选择"否"，点击"下一步"，进入"网络服务名配置完成" 窗口；<br />
<br />
　　12）、在"网络服务名配置完成"窗口中点击"下一步"，弹出以下窗体；<br />
<br />
　　13）、在"欢迎"窗口点击"完成"，退出配置过程<br />
<br />
　　TNSNAMES.ORA配置完成后，再配置BDE（BDE如何配置略），可通过BDE、PLSQL、SQL EXPLORER和TNSPING命令来测试ORACLE是否连接正确。下面用TNSPING来测试是否连接。<br />
<br />
　　在命令提示符下录入：　TNSPING TEST.SOFTONE.COM<br />
<br />
<span class="b12red">六、表空间、用户的创建和删除</span><br />
<br />
<strong>1、表空间的创建、删除</strong><br />
　　1）、命令方式创建表空间<br />
录入命令：<br />
CREATE TABLESPACE CHECKUP_HISTORY DATAILE '/M01/ORADATA/BIBDB/CHECKUP_HISTORY.DBF' SIZE 1000M;<br />
这条语句创建了一个名为CHECKUP_HISTORY.DBF的文件，容量为1000MB，容纳了存储在CHECKUP_HISTORY表空间的所有数据。<br />
<br />
　　2）、建议用此方式建立表空空间<br />
　　打开DBA STUDIO，<br />
<br />
　　选择存储下表空间，单击右键，选择创建，出现以下界面：<br />
<br />
　　录入名称和其他相关的设置（其它设置建议使用默认值），点击"创建"按纽<br />
　　如果要删除某表空间，则选中该表空间，然后点击鼠标右键，选择"移去"即可。<br />
<br />
<strong>2、用户的创建、删除</strong><br />
　　1）、命令方式建立、删除用户<br />
　　建立<br />
　　create user pharmacy<br />
　　identified by pharmacy<br />
　　default tablespace PHARMACY<br />
　　temporary tablespace TEMP<br />
　　profile DEFAULT;<br />
　　grant dba to pharmacy;<br />
　　 删除<br />
　　DROP USER PHARMACY CASCADE<br />
<br />
　　2）、通过PLSQL建立、删除用户<br />
　　建立：<br />
　　打开PLSQL，以SYSTEM，manager登录，选择USERS，以鼠标右键选择NEW，输入名称、密码、表空间、临时表空间和用户权限，点击"APPLY"。<br />
　　删除<br />
　　选择用户，以鼠标右键选择"DROP"<br />
<br />
　　3）用ORACLE 建立、删除用户<br />
　　建立：<br />
　　打开DBA STUDIO<br />
　　选择安全下用户，点击鼠标右键选择"创建" <br />
　　输入名称、口令和用户权限，点击"创建"按纽<br />
　　删除：<br />
　　选择需删除的用户，点击鼠标右键，选择"移去"。<br />
<br />
<span class="b12red">七、数据脚本导入、导出</span><br />
<strong>1、 导入</strong><br />
　　1）、命令方式导入<br />
　　IMP PHARMACY/PHARMACY@TEST.SOFTONE.COM D:\DD\PHARMACY.DMP FULL=Y<br />
　　此方式导入的数据库带有表结构和数据内容。<br />
<br />
　　2）、使用PLSQL导入<br />
　　选择TOOLS菜单下的IMPORT TABLES ，选择需要导入的脚本，点击"IMPORT"按纽<br />
　　此方式导入的数据库文件中带有表结构和数据内容。<br />
　　此方式导入的数据库可能只有表结构，也可能只有数据内容（根据录制的脚本而定）。<br />
<br />
　　3）、在PLSQL的NEW菜单下选择COMMAND WINDOW,右键菜单中选择"LOAD"，选择需要导入的数据脚本，系统自动进行导入操作。<br />
<br />
<strong>2、导出</strong><br />
　　1）、命令方式导出<br />
　　EXP PHARMACY/PHARMACY@TEST.SOFTONE.COM D:\DD\200.DMP<br />
　　此方式导出的数据库带有表结构和数据内容。建议使用此方式进行数据导出。<br />
<br />
　　2）、使用PLSQL工具导出<br />
　　选择TOOLS菜单下的EXPORT TABLES ，选择需要导出的表名称，录入需要导出的脚本名称，点击"EXPORT"按纽<br />
　　 此方式导出的数据带有数据结构和数据内容。<br />
　　此方式导出的数据只带有数据结构，不带数据内容。<br />
<br />
　　3）在PLSQL工具的TOOLS菜单下选择EXPORT USER OBJECTS （版本为5.1以上才有此功能），录入需要导出的脚本名称（默认为全部选中，如果只导出部分表或触发器等等，用鼠标在列表中自行选择），点击"EXPORT"按纽<br />
<br />
　　此方式导出的数据库只带有表结构，不导出数据内容。如果只导出表结构，建议使用此方式进行导出。</div>
http://blog.csdn.net/ak_2005/archive/2007/03/05/1520739.aspx
<img src ="http://www.blogjava.net/liaojiyong/aggbug/156094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-10-26 12:48 <a href="http://www.blogjava.net/liaojiyong/archive/2007/10/26/156094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ms sql 远程备份 job(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/10/26/155998.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 26 Oct 2007 00:19:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/10/26/155998.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/155998.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/10/26/155998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/155998.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/155998.html</trackback:ping><description><![CDATA[<p>mssql数据库远程备份的job <br />
<br />
<br />
/*在远程机器操作系统的计算机管理里建立一个用户名为dbbackup的用户，密码为1234，同时在那台机器的非系统盘里建一个名为backup的共享文件夹，为了安全另外设置这个文件夹只有这个dbbackup用户可以访问。*/ <br />
<br />
declare @sql varchar(500)<br />
<br />
<br />
select @sql='\\10.2.0.12\backup\dbname'+'_db_'+convert(varchar(10),getdate(),112) +<br />
<br />
<br />
substring(convert(varchar(10),getdate(),108),1,2) +'.bak'<br />
<br />
<br />
exec master..xp_cmdshell 'net use \\10.2.0.12\backup 1234 /user:remotehost\dbbackup'<br />
<br />
<br />
backup database dbname to disk=@sql --备份数据库，这里的10.2.0.12为远程机器的ip，remotehost为远程机器的机器名，dbname为本地sqlserver服务器要备份的数据库<br />
<br />
<br />
go<br />
<br />
<br />
declare @sql varchar(500)<br />
<br />
<br />
select @sql='del '+'\\10.2.0.12\backup\dbname'+'_db_'+convert(varchar(10),dateadd(day,-7,getdate()),112) +<br />
<br />
<br />
substring(convert(varchar(10),dateadd(day,-7,getdate()),108),1,2) +'.bak'<br />
<br />
<br />
exec master..xp_cmdshell @sql --删除7天前的备份，也就是只保留7个最新备份<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
最近我在为公司的框架程序（以数据应用为导向的应用体系）做数据管理模块，这个模块的需求比较简单：备份、恢复和清理日志。我公司的软件基本上以C/S为基本架构，所以数据管理模块中两个主要的功能&#8216;备份与恢复&#8217;都可能会在Client端操作，备份与恢复&#8217;的文件也都有可能存储在client端，因而这个数据管理模块就必须能够实现在远程备份与恢复数据库。 文章的前提阐述完了，就该说说如何具体实现吧。其实都很简单，我想写个远程备份的测试实例<br />
给大家看,就能够很清楚的描述吧！<br />
实例说明：<br />
环境：win2k sqlserver 2K 查询分析器<br />
SQLSERVER服务实例名称:mainserver<br />
需要备份的数据库名称: msdb <br />
本地机器名称（Client端）：david<br />
本地用户:zf 密码：123<br />
本地域名：domain<br />
本地提供备份需求的文件夹:e:\test 第一步: 建立共享文件夹<br />
在程序代码中调用（或者CMD窗口） net share test=e:\test<br />
或者用NetShareAdd这个API<br />
简要说明：<br />
net share : 是WINDOWS内部的网络命令。<br />
作用：建立本地的共享资源，显示当前计算机的共享资源信息。 <span class="Cms791">字串8</span> <br />
语法：参见 net share /? <br />
第二步: 建立共享信用关系<br />
master..xp_cmdshell 'net use \\david\test 123 /user:domain\zf'<br />
简要说明：<br />
1：xp_cmdshell ：是SQLSERVER的扩展存储过程。<br />
作用，以操作系统命令行解释器的方式执行给定的命令字符串，<br />
并以文本行方式返回任何输出。<br />
语法：参见SQLSERVER联机帮助<br />
2:net use : 是WINDOWS内部的网络命令。<br />
作用，将计算机与共享资源连接或断开，或者显示关于计算机<br />
连接的信息。该命令还控制持久网络连接。<br />
语法：参见 net use /? 第三步:备份数据库<br />
backup database msdb to disk='\\david\test\msdb.bak'<br />
这个不需要说明吧，语法参见SQLSERVER联机帮助 第四步: 删除共享文件夹<br />
在程序代码中调用（或者CMD窗口） net share test /delete<br />
或者用NetShareDel这个API<br />
结果:<br />
已处理 1376 页，这些页属于数据库 'msdb' 的文件 'MSDBData'（位于文件 1 上）。 </p>
<p class="Cms791">字串1</p>
<p><br />
已处理 1 页，这些页属于数据库 'msdb' 的文件 'MSDBLog'（位于文件 1 上）。<br />
BACKUP DATABASE 操作成功地处理了 1377 页，花费了 3.653 秒（3.086 MB/秒）。 这样mainserver服务器上的msdb就备份到了david机器的E:\test\msdb.bak文件了，使用起来很简单吧？恢复数据库操作也是一样，只要将第三个步骤的语句改为'restore database msdb from disk='\\david\test\msdb.bak'就可以啦。。你看完了也可以试试呀？！（最简单的测试工具查询分析器 CMD窗口）备注：xp_cmdshell 这个扩展存储过程只能SA级别的用户调用，而且是SQLSERVER的安全隐患之一，许多DBA都喜欢将其删除或者禁用，所以开发人员使用时要倍加小心哦。<br />
文章中的例子只是简要的说明了应如何利用扩展存储过程实现远程备份与恢复，没有涉及安全以及其他方面的考虑，希望读者在代码中自行完善。 <br />
<br />
<br />
go</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/155998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-10-26 08:19 <a href="http://www.blogjava.net/liaojiyong/archive/2007/10/26/155998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 指令大全</title><link>http://www.blogjava.net/liaojiyong/archive/2007/10/11/152103.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 11 Oct 2007 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/10/11/152103.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/152103.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/10/11/152103.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/152103.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/152103.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;cat cd chmod chown cp cut 名称：cat 使用权限：所有使用者 使用方式：cat [-AbeEnstTuv] [--help] [--version] fileName 说明：把档案串连接后传到基本输出（萤幕或加 &gt; fileName 到另一个档案） 参数： -n 或 --number 由 1 开始对所有输出的行数编...&nbsp;&nbsp;<a href='http://www.blogjava.net/liaojiyong/archive/2007/10/11/152103.html'>阅读全文</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/152103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-10-11 17:08 <a href="http://www.blogjava.net/liaojiyong/archive/2007/10/11/152103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 常用命令</title><link>http://www.blogjava.net/liaojiyong/archive/2007/10/07/150916.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Sun, 07 Oct 2007 13:29:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/10/07/150916.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/150916.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/10/07/150916.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/150916.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/150916.html</trackback:ping><description><![CDATA[什么是Linux终端<br />
&nbsp;&nbsp;&nbsp; 键盘和现实器合称为终端，也称控制台，一台计算机的IO设备就是一个物理控制台；在一台机器上用软件方法实现多个乡互不干扰、独立工作的控制台界面，就是实现了多个虚拟控制台。Linux虚拟控制台有六个，如果直接方式选择X WINDOW，那么x window在第7个虚拟终端上。在 Linux 系统中的字符操作控制台界面，通过组合键 Alt + (F1 - F6) 可以切换到另外的控制台。在图像用户界面下通过组合键 Ctrl+Alt + (F1 - F6)可以切换到字符控制台， 每一个控制台是系统中一个完全独立的会话，不同的用户可以同时使用。虚拟控制台使Linux成为一个多用户操作系统。这一多控制台的特点与 Windows 中的多桌面不同。在 Linux 中，每一个控制台可以分别由完全不同的用户来控制。例如，您可能在控制台 1 中以 root身份登录，而在控制台 2 中以 yifan 身份登录。两个控制台在各自的用户空间中运行不同的程序。如果您是在图形模式下，那么您可以打开一个 终端 (terminal)以进入控制台窗口。通常在桌面的任务条上会有终端的按钮。您也可以从上下文菜单（在桌面上单击右键）打开终端 。<br />
什么是shell<br />
&nbsp;&nbsp; shell是系统用户界面，它提供用户与内核交互的接口。用户就能通过键盘输入指令来操作计算机了，它再将执行结果显示给用户。shell用户界面，也就是我们常说的字符操作界面。shell是一个命令解释器，拥有自己内建的 shell 命令集。此外，shell也能被系统中其他有效的Linux 实用程序和应用程序（utilities and application programs）所调用。 shell 是如何执行命令解释的，shell 首先检查命令是否是内部命令，不是的话再检查是否是一个应用程序，这里的应用程序可以是Linux本身的实用程序，比如ls 和 rm，也可以是购买的商业程序，比如 xv，或者是公用软件（public domain software），就象 ghostview。然后shell试着在搜索路径里寻找这些应用程序。搜索路径是一个能找到可执行程序的目录列表。如果你键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件，（学过DOS的朋友，一定对内部，外部命令的含义很了解）将会显示一条错误信息。而如果命令被成功的找到的话，shell的内部命令或应用程序将被分解为系统调用并传给Linux内核。 <br />
shell的种类<br />
目前流行的Shell有 bash、ksh、csh<br />
　　bash是Linux系统默认使用的Shell，它由Brian Fox和Chet Ramey共同完成，是Bourne Again Shell的缩写，内部命令一共有40个。Linux使用它作为默认的Shell是因为它有以下的特色：<br />
　　（1）可以使用类似DOS下面的doskey的功能，用上下方向键查阅和快速输入并修改命令。<br />
　　（2）自动通过查找匹配的方式，给出以某字串开头的命令。<br />
　　（3）包含了自身的帮助功能，你只要在提示符下面键入help就可以得到相关的帮助。<br />
　　ksh是Korn Shell的缩写，由Eric Gisin编写，共有42条内部命令。该Shell最大的优点是几乎和商业发行版的ksh完全相容，这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。<br />
　　csh是Linux比较大的内核，它由以William Joy为代表的共计47位作者编成，共有52个内部命令。该Shell其实是指向/bin/tcsh这样的一个Shell，也就是说，csh其实就是tcsh。 <br />
一凡在此介绍Linux 常用命令，主要是介绍bash的命令<br />
bash 主要有支持三种通配符： <br />
* 匹配任何字符和任何数目的字符 <br />
? 匹配任何单字符 <br />
[...] 匹配任何包含在括号里的单字符 <br />
有的还支持-，它表示字符范围，如[a-h]表示从a到h的任意一个字符<br />
bash命令的一般格式如下：命令名【选项】【参数1】【参数2】...【选项】是对命令的特别定义，以减号(-)开始，多个选项可以用一个减号(-)连起来，如ls -l -a 与ls -la 相同。【参数】提供命令运行的信息，或者是命令执行过程中所使用的文件名。使用分号(;)可以将两个命令隔开，这样可以实现一行中输入多个命令。命令的执行顺序和输入的顺序相同。有的参数也以--开头。命令、选项和参数可以用空格或TAB隔开。<br />
bash命令补全<br />
在送入命令的任何时刻，可以按&lt;Tab&gt;键，当这样做时，系统将试图补全此时已输入的命令。如果已经输入的字符串不足以唯一地确定它应该使用的命令，系统将发出警告声。再次按&lt;Tab&gt;键，系统则会给出可用来用来补全的字符串清单。使用命令补全功能，可以提高使用长命令或操作较长名字的文件或文件夹的都是非常有意义的。<br />
历史命令<br />
系统会把过去输入过的命令记忆下来，只要按方向键中的上下箭头，就可以选择以前输入过的命令了。<br />
联机帮助<br />
可以通过man命令来查看任何命令的联机帮助信息。它将命令名作为参数，该命令的语法格式为： man 【命令名】 在任何命令之后给--help参数，也可以显示该命令的帮助信息。
<p>Linux的文件与文件类型，和DOS，WIN有点相似，在此不做介绍。注意LINUX文件名区分大小写。</p>
<p>目录和文件的基本操作<br />
1、文件查看和连接命令<br />
将文件连接到一起，用&#8220;&gt;&#8221;操作将几个文件组合成一个新的文件，或者是用&#8220;&gt;&gt;&#8221;把文件追加到已存文件的后面。 <br />
语法： <br />
cat　　[参数]filelist <br />
-n或--number:由1开始对所有输出的行数进行编号<br />
-b或--number-nonblank：和n相似，但对空行不编号<br />
-s：遇到两行空白，替换为一行空白 <br />
-v：显示不可打印的字符<br />
filelist：用于结合文件的可选列表。 <br />
2、分屏显示命令<br />
类似于cat，但它是每次显示一页，按空格显示下一页，按&lt;q&gt;键退出，按&lt;h〉键给出帮助信息。该命令还有搜索字符的功能。<br />
语法<br />
more&nbsp; [选项] &lt;file&gt;...<br />
-num:指定每屏显示的行数<br />
-d：在屏幕下面提示信息<br />
-l：more默认遇到送纸符^L会暂停，使用该选项可以取消该功能<br />
-f：计算实际行数<br />
-p：不是以卷动的方式显示每页，而是先清屏再显示<br />
-s：遇到两行空白，替换为一行空白 <br />
-u：不显示下划线<br />
+/&lt;string&gt;:在文件中搜索字符串string，并显示字符串所在页的内容<br />
+/&lt;num&gt;:从第num行开始显示<br />
file用于显示的文件</p>
<p>3、按页显示文件。类似于more，但允许在文件中前后移动。 <br />
语法： <br />
less　[参数]文件名 <br />
-i：查询时忽略大小写。<br />
-num:指定每页显示的行数<br />
-p&lt;string&gt;:在文件中搜索字符串string，并从第一个符合条件的地方开始显示<br />
-S：当某列的内容超过显示画面的宽度时，直接将超出的部分截断舍弃，默认情况下会把超出的部分折回来显示<br />
复制、删除和移动命令<br />
1、拷贝文件。 <br />
&nbsp;语法： <br />
&nbsp;cp[选项]&lt;source&gt;&lt;dest&gt;<br />
&nbsp;cp[选项]&lt;source&gt;....&lt;directory&gt;<br />
&nbsp;-r　　递归拷贝目录<br />
&nbsp;-f　　删除已存在的目标文件再复制<br />
&nbsp;-a　　在备份中尽可能的保留源文件的结构和属性。<br />
2、删除<br />
&nbsp;&nbsp; rm [选项] &lt;name&gt;....<br />
&nbsp;&nbsp; 该命令用于逐个删除指定的文件或目录。默认清苦下，&lt;name&gt;为文件名，rm命令不删除目录，只有指定-d选项时候，才能删除目录<br />
语法： <br />
-f　　强制删除，包括只读文件，并且不给用户任何提示<br />
-i　　在删除每个文件时提示用户<br />
-r　　递归删除目录下的内容 <br />
&nbsp;<br />
移动或更名文件和目录 <br />
语法： <br />
mv 　[参数]源文件目标文件 <br />
-f　　强制复盖已有文件。 <br />
-i　　在复盖已有文件前提示用户。 <br />
-u　　在目标文件的时间比原文件新时不复盖目标文件。 <br />
-v　　在移动文件时输出相关信息。 <br />
创建和删除目录命令<br />
1、创建目录命令<br />
mkdir　　[参数]目录名 <br />
-p　　如果父目录不存在，创建所有的父目录。<br />
2、删除空目录。 <br />
语法： <br />
rmdir　　[参数]目录列表 <br />
-p 表示删除指定目录后，如果该目录的父目录为空，则将一并删除<br />
切换工作目录和显示目录命令<br />
1、改变当前工作目录。 <br />
语法： <br />
cd 目录名 <br />
如果后面不加目录名，则返回用户的根目录，此外用户必须拥有进入该目录的权限。另外cd ~ 指切换到自己的主目录，cd ../.. 可以切换到单前目录的上上目录<br />
2、显示正在工作或当前的目录名。 <br />
pwd　[参数] <br />
3、列出目录中的内容。 <br />
语法： <br />
ls　[参数][目录] <br />
-A 　显示所有文件，包括隐藏文件（以&#8220;.&#8221;开头的文件，但不列出当前目录&#8220;.&#8221;和上级目录&#8220;..&#8221; <br />
-a 　显示所有文件，包括&#8220;.&#8221;和&#8220;..&#8221;目录。&nbsp; <br />
-d 　只列出目录名；不列出它的内容。 <br />
-l 　给出文件的长列表。包括权限、所有权、大小、文件名、最后修改时间等等。<br />
-t&nbsp;&nbsp; 按时间顺序显示<br />
-F&nbsp;&nbsp; 在列出的文件名后以符号表示文件类型，一般文件不加符号，可执行文件&#8220;*&#8221;，目录加&#8220;/&#8221;<br />
-R&nbsp;&nbsp; 若目录下有文件，则递归地列出目录下的文件<br />
查找与定位命令<br />
1、查找文件或目录命令<br />
格式<br />
find [path....] [expression]<br />
该命令在目录树层次中从path开始向下查找文件，将符合expression要求的文件列出来。输入命令中第一个以<br />
-、(、)、，、！开始的参数作为expression的部分，在这些符号之前的参数都被认为是要搜索的路径，在这<br />
些符号之后的才被认为是expression的部分，如果不给出path，则使用当前工作的目录，如果不给出expressi<br />
on,则使用-print作为预设expression<br />
expression的参数有二三十个之多，这里只提几个常用的<br />
-amin&lt;n&gt; 在过去n分钟内被访问过的文件<br />
-anewer&lt;file&gt; 比文件file更晚被访问过的文件<br />
-atime&lt;n&gt; 在过去n天被访问过的文件<br />
-cmin&lt;n&gt;&nbsp; 在过去n分钟内修改过的文件<br />
-cnewer&lt;file&gt; 比文件file更新的文件<br />
-ctime&lt;n&gt; 在过去n天内修改过的文件<br />
-empty 内容为空的文件<br />
-gid&lt;n&gt;或-group&lt;name&gt; gid是n或是group名是name的文件<br />
-ipath&lt;p&gt;,-path&lt;p&gt; 路径名称符合p的文件，ipath表示忽略大小写<br />
-name&lt;name&gt;,-iname&lt;name&gt; 文件名称符合name的文件，iname表示忽略大小写<br />
-size&lt;n单位&gt; 文件大小是n个单位<br />
-type&lt;文件类型〉文件类型的含义与名利ls的选型一样<br />
-pid&lt;n&gt; 进程id是n的文件<br />
exp1 exp2 或者exp1 -a exp2 或者exp1 -and exp2 含义相同，表示同时满足这两个条件<br />
!expr或者-not expr 表示expr的否定<br />
exp1 -o exp2 或者exp1 -or exp2 表示满足其中一个条件就可以<br />
2、文件定位命令<br />
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案<br />
名称及路径的资料库，之后当寻找时就只需查询这个资料库，而不必实际深入档案系统之中了。在一般的 <br />
distribution 之中，资料库的建立都被放在 contab 中自动执行。一般使用者在使用时只要用 <br />
locate [选项] &lt;search string&gt;<br />
-u 建立资料库，-u 会由根目录开始<br />
-U 建立资料库，-U 则可以指定开始的位置。 <br />
-e 将排除在寻找的范围之外。 <br />
-l 如果 是 1．则启动安全模式。在安全模式下，使用者不会看到权限无法看到的档案。这会始速度减慢，因<br />
为 locate 必须至实际的档案系统中取得档案的权限资料。 <br />
-f 将特定的档案系统排除在外，例如我们没有到理要把 proc 档案系统中的档案放在资料库中。 <br />
-q 安静模式，不会显示任何错误讯息。 <br />
-n 至多显示 个输出。 <br />
-r 使用正规运算式 做寻找的条件。 <br />
-o 指定资料库存的名称。 <br />
-d 指定资料库的路径 <br />
-h 显示辅助讯息 <br />
-v 显示更多的讯息 <br />
-V 显示程式的版本讯息 <br />
连接命令<br />
ln [选项] &lt;source&gt; &lt;dest&gt;<br />
Linux/Unix 档案系统中，有所谓的连结(link)，我们可以将其视为档案的别名，而连结又可分为两种 : 硬连<br />
结(hard link)与软连结(symbolic link)，硬连结的意思是一个档案可以有多个名称，而软连结的方式则是产<br />
生一个特殊的档案，该档案的内容是指向另一个档案的位置。硬连结是存在同一个档案系统中，而软连结却可<br />
以跨越不同的档案系统。 ln source dist 是产生一个连结(dist)到 source，至于使用硬连结或软链结则由<br />
参数决定。 不论是硬连结或软链结都不会将原本的档案复制一份，只会占用非常少量的磁碟空间。 <br />
-f : 链结时先将与 dist 同档名的档案删除<br />
-d : 允许系统管理者硬链结自己的目录<br />
-i : 在删除与 dist 同档名的档案时先进行询问<br />
-n : 在进行软连结时，将 dist 视为一般的档案<br />
-s : 进行软链结(symbolic link)<br />
-v : 在连结之前显示其档名<br />
-b : 将在链结时会被覆写或删除的档案进行备份</p>
<p>改变文件或目录的时间命令<br />
touch [选项] &lt;file1&gt; [&lt;file2&gt;....]<br />
-a 改变档案的读取时间记录。 <br />
-m 改变档案的修改时间记录。 <br />
-c 假如目的档案不存在，不会建立新的档案。与 --no-create 的效果一样。 <br />
-f 不使用，是为了与其他 unix 系统的相容性而保留。 <br />
-r 使用参考档的时间记录，与 --file 的效果一样。 <br />
-d 设定时间与日期，可以使用各种不同的格式。 <br />
-t 设定档案的时间记录，格式与 date 指令相同。 <br />
--no-create 不会建立新档案。 </p>
<p>备份命令<br />
tar&nbsp; &lt;主选项&gt; [辅选项] &lt;文件或目录&gt;<br />
tar可以为文件和目录创建档案。利用tar，用户可以为某一特定文件创建档案（备份文件），也可以在档案中<br />
改变文件，或者向档案中加入新的文件。tar最初被用来在磁带上创建档案，现在，用户可以在任何设备上创<br />
建档案，如软盘。利用tar命令，可以把一大堆的文件和目录全部打包成一个文件，这对于备份文件或将几个<br />
文件组合成为一个文件以便于网络传输是非常有用的。Linux上的tar是GNU版本的。<br />
主选项：<br />
c 创建新的档案文件。如果用户想备份一个目录或是一些文件，就要选择这个选项。<br />
r 把要存档的文件追加到档案文件的未尾。例如用户已经作好备份文件，又发现还有一个目录或是一些文件忘<br />
记备份了，这时可以使用该选项，将忘记的目录或文件追加到备份文件中。<br />
t 列出档案文件的内容，查看已经备份了哪些文件。<br />
u 更新文件。就是说，用新增的文件取代原备份文件，如果在备份文件中找不到要更新的文件，则把它追加到<br />
备份文件的最后。<br />
x 从档案文件中释放文件。<br />
辅选项：<br />
b 该选项是为磁带机设定的。其后跟一数字，用来说明区块的大小，系统预设值为20（20*512 bytes）。<br />
f 使用档案文件或设备，这个选项通常是必选的。<br />
k 保存已经存在的文件。例如我们把某个文件还原，在还原的过程中，遇到相同的文件，不会进行覆盖。<br />
m 在还原文件时，把所有文件的修改时间设定为现在。<br />
M 创建多卷的档案文件，以便在几个磁盘中存放。<br />
v 详细报告tar处理的文件信息。如无此选项，tar不报告文件信息。<br />
w 每一步都要求确认。<br />
z 用gzip来压缩/解压缩文件，加上该选项后可以将档案文件进行压缩，但还原时也一定要使用该选项进行解<br />
压缩。 <br />
tar的最基本的用法举例<br />
　　tar -cf all.tar *.jpg<br />
　　这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包，-f指定包的文件名。<br />
　&nbsp; tar -rf all.tar *.gif<br />
　　这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。<br />
&nbsp;&nbsp;&nbsp; tar -uf all.tar logo.gif<br />
　　这条命令是更新原来tar包all.tar中logo.gif文件，-u是表示更新文件的意思。 <br />
　　tar -tf all.tar<br />
　　这条命令是列出all.tar包中所有文件，-t是列出文件的意思<br />
　　tar -tvf all.tar |more<br />
　　这条命令是列出all.tar包中所有文件，并以分屏方式<br />
压缩和解压命令</p>
<p>gzip命令是用来压缩文件的。它不仅可以用来压缩大的、较少使用的文件以节省磁盘空间，还可以和tar命令<br />
一起构成Linux操作系统中比较流行的压缩文件格式。据统计，gzip命令对文本文件有60%～70%的压缩率。 <br />
gzip [选项] [文件名]<br />
-c 输出并保留原文件<br />
-d 将压缩文件解压，默认情况下为压缩<br />
-l 显示压缩文件的压缩的提示信息<br />
-r 递归的压缩或解压<br />
-t，可以用来测试压缩文件的完整性。如果文件正常，gzip不会给出任何显示。如果想看到OK这两个字母，可<br />
以在测试某个文件时使用-tv参数。 <br />
-v 对每个操作的文件，显示文件名和压缩比例<br />
&nbsp;<br />
&nbsp;</p>
<p>unzip 命令位于/usr/bin目录中，它们和MS DOS下的pkzip、pkunzip及MS Windows中的Winzip软件功能一样，<br />
将文件压缩成.zip文件，以节省硬盘空间，当需要的时候再将压缩文件用unzip命令解开。该命令使用权限是<br />
所有用户。<br />
unzip [选项] [压缩文件名]<br />
-d&lt;目录&gt; 知道解压的某个目录下，默认为当前目录<br />
-n：解压缩时不要覆盖原有的文件。<br />
-o：不必先询问用户，unzip执行后覆盖原有文件<br />
-j：不处理压缩文件中原有的目录路径，把所有文件解压到同一目录<br />
-v：察看压缩文件的内容，但不解压<br />
-t：检查压缩文件是否正确，但不解压<br />
显示文字命令<br />
echo [-n] &lt;字符串〉<br />
在屏幕上显示字符串，-n表示不换行<br />
显示日立命令<br />
cal [选项] [[月]年]<br />
- j 显示出给定月中的每一天是一年中的第几天（从1月1日算起）。<br />
- y 显示出整年的日历。<br />
-1 显示当月的日历<br />
-3显示前一月，本月，下月的日历<br />
-s以星期天作为一周的第一天<br />
-m以星期一作为一周的第一天<br />
如cal 5 2006<br />
显示2006年5月份的日历</p>
<p>日期时间命令<br />
date [选项] [+FormatString] 显示日期时间<br />
date &lt;setstring&gt; 设置日期时间<br />
它的选项比较多，一凡在此就不一一列出来了<br />
清屏命令clear<br />
软件包管理<br />
RPM全称是 Red Hat Package Manager（Red Hat包管理器）。几乎所有的 Linux 发行版本都使用这种形式的<br />
软件包管理安装、更新和卸载软件。<br />
01、安装<br />
rpm -i ( or --install) options file1.rpm ... fileN.rpm<br />
-h (or --hash) 安装时输出hash记号 (``#'')<br />
--test 只对安装进行测试，并不实际安装。<br />
--percent 以百分比的形式输出安装的进度。<br />
--excludedocs 不安装软件包中的文档文件<br />
--includedocs 安装文档<br />
--replacepkgs 强制重新安装已经安装的软件包<br />
--replacefiles 替换属于其它软件包的文件<br />
--force 忽略软件包及文件的冲突<br />
--noscripts 不运行预安装和后安装脚本<br />
--prefix 将软件包安装到由 指定的路径下<br />
--ignorearch 不校验软件包的结构<br />
--ignoreos 不检查软件包运行的操作系统<br />
--nodeps 不检查依赖性关系<br />
--ftpproxy 用 作为 FTP代理<br />
--ftpport 指定FTP的端口号为 <br />
通用选项<br />
-v 显示附加信息<br />
-vv 显示调试信息<br />
--root 让RPM将指定的路径做为"根目录"，这样预安装程序和后安装程序都会安装到这个目录下<br />
--rcfile 设置rpmrc文件为 <br />
--dbpath 设置RPM 资料库存所在的路径为 <br />
02、删除<br />
命令格式：<br />
rpm -e ( or --erase) options pkg1 ... pkgN<br />
参数<br />
pkg1 ... pkgN ：要删除的软件包<br />
详细选项<br />
--test 只执行删除的测试<br />
--noscripts 不运行预安装和后安装脚本程序<br />
--nodeps 不检查依赖性</p>
<p>03、升级<br />
命令格式<br />
rpm -U ( or --upgrade) options file1.rpm ... fileN.rpm<br />
参数<br />
file1.rpm ... fileN.rpm 软件包的名字<br />
详细选项<br />
-h (or --hash) 安装时输出hash记号 (``#'')<br />
--oldpackage 允许"升级"到一个老版本<br />
--test 只进行升级测试<br />
--excludedocs 不安装软件包中的文档文件<br />
--includedocs 安装文档<br />
--replacepkgs 强制重新安装已经安装的软件包<br />
--replacefiles 替换属于其它软件包的文件<br />
--force 忽略软件包及文件的冲突<br />
--percent 以百分比的形式输出安装的进度。<br />
--noscripts 不运行预安装和后安装脚本<br />
--prefix 将软件包安装到由 指定的路径下<br />
--ignorearch 不校验软件包的结构<br />
--ignoreos 不检查软件包运行的操作系统<br />
--nodeps 不检查依赖性关系<br />
--ftpproxy 用 作为 FTP代理<br />
--ftpport 指定FTP的端口号为 <br />
04、查询<br />
命令格式：<br />
rpm -q ( or --query) options<br />
参数：<br />
pkg1 ... pkgN ：查询已安装的软件包<br />
详细选项<br />
-p (or ``-'') 查询软件包的文件<br />
-f 查询属于哪个软件包<br />
-a 查询所有安装的软件包<br />
--whatprovides 查询提供了 功能的软件包<br />
-g 查询属于 组的软件包<br />
--whatrequires 查询所有需要 功能的软件包<br />
信息选项<br />
示软件包的全部标识<br />
-i 显示软件包的概要信息<br />
-l 显示软件包中的文件列表<br />
-c 显示配置文件列表<br />
-d 显示文档文件列表<br />
-s 显示软件包中文件列表并显示每个文件的状态<br />
--scripts 显示安装、卸载、校验脚本<br />
--queryformat (or --qf) 以用户指定的方式显示查询信息<br />
--dump 显示每个文件的所有已校验信息<br />
--provides 显示软件包提供的功能<br />
--requires (or -R) 显示软件包所需的功能</p>
<p>05、校验已安装的软件包<br />
命令格式：<br />
rpm -V ( or --verify, or -y) options<br />
参数<br />
pkg1 ... pkgN 将要校验的软件包名<br />
软件包选项<br />
-p Verify against package file <br />
-f 校验所属的软件包<br />
-a Verify 校验所有的软件包<br />
-g 校验所有属于组 的软件包<br />
详细选项<br />
--noscripts 不运行校验脚本<br />
--nodeps 不校验依赖性<br />
--nofiles 不校验文件属性</p>
<p>06、校验软件包中的文件<br />
语法：<br />
rpm -K ( or --checksig) options file1.rpm ... fileN.rpm<br />
参数：<br />
file1.rpm ... fileN.rpm 软件包的文件名<br />
连接帮助命令<br />
man &lt;command&gt;<br />
info &lt;command&gt;&nbsp; 该功能比man强大，但目前只在Linux中有，其他的UNIX中没有该命令<br />
help &lt;command&gt;<br />
但linux编辑器，桌面，网络管理配置，该平台上简单的软件开发。。。。还有好多东西要整理的，希望怀宝宝这段空闲时间能整理。<br />
</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/150916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-10-07 21:29 <a href="http://www.blogjava.net/liaojiyong/archive/2007/10/07/150916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux基础知识</title><link>http://www.blogjava.net/liaojiyong/archive/2007/10/07/150915.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Sun, 07 Oct 2007 13:28:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/10/07/150915.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/150915.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/10/07/150915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/150915.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/150915.html</trackback:ping><description><![CDATA[Linux最早是由芬兰赫尔辛基大学一位叫Linus Torvalds的学生设计的.它是一套免费使用和自由传播的<br />
类NUIX系统,源代码开发,能在各类硬件平台(包括Intel x86系列和RISC处理器)上运行.<br />
&nbsp;<br />
Linux受广大计算机爱好者喜爱的原因:<br />
&nbsp;1.Linux在pc计算机上实现了全部的UNIX特性,具有多任务,多用户的能力,而且在很多方面相当稳定高效.<br />
&nbsp;2.Linux属于自由软件,用户不需要支付任何费用就可以获得它及其它的原代码,并可以对它进行须改,无偿使用它,无约束传播.<br />
&nbsp;<br />
Linux具有以下主要特性：<br />
&nbsp; 开放性<br />
&nbsp; 开放性是指系统遵循世界标准规范，特别是遵循开放系统互连（OSI）国际标准。凡遵循国际标准所开发的硬件和软件，都能彼此兼容，可方便地实现互连。 <br />
&nbsp; 多用户<br />
&nbsp; 多用户是指系统资源可以被不同用户各自拥有使用，即每个用户对自己的资源（例如：文件、设备）有特定的权限，互不影响。Linux和Unix都具有多用户的特性。 <br />
&nbsp; 多任务<br />
&nbsp; 多任务是现代计算机的最主要的一个特点。它是指计算机同时执行多个程序，而且各个程序的运行互相独立。Linux系统调度每一个进程平等地访问微处理器。由于CPU的处理速度非常快，其结果是，启动的应用程序看起来好像在并行运行。事实上，从处理器执行一个应用程序中的一组指令到Linux调度微处理器再次运行这个程序之间只有很短的时间延迟，用户是感觉不出来的。 <br />
&nbsp; 良好的用户界面<br />
&nbsp; Linux向用户提供了两种界面：'用户界面和系统调用。<br />
&nbsp; Linux的传统用户界面是基于文本的命令行界面，即shell，它既可以联机使用，又可存在文件上脱机使用。shell有很强的程序设计能力，用户可方便地用它编制程序，从而为用户扩充系统功能提供了更高级的手段。可编程Shell是指将多条命令组合在一起，形成一个Shell程序，这个程序可以单独运行，也可以与其他程序同时运行。 <br />
&nbsp; 系统调用给用户提供编程时使用的界面。用户可以在编程时直接使用系统提供的系统调用命令。系统通过这个界面为用户程序提供低级、高效率的服务。 <br />
Linux还为用户提供了图形用户界面。它利用鼠标、菜单、窗口、滚动条等设施，给用户呈现一个直观、易操作、交互性强的友好的图形化界面。 <br />
&nbsp; 设备独立性<br />
&nbsp; 设备独立性是指操作系统把所有外部设备统一当作成文件来看待，只要安装它们的驱动程序，任何用户都可以象使用文件一样，操纵、使用这些设备，而不必知道它们的具体存在形式。 <br />
具有设备独立性的操作系统，通过把每一个外围设备看作一个独立文件来简化增加新设备的工作。当需要增加新设备时、系统管理员就在内核中增加必要的连接。这种连接（也称作设备驱动程序）保证每次调用设备提供服务时，内核以相同的方式来处理它们。当新的及更好的外设被开发并交付给用户时，操作允许在这些设备连接到内核后，就能不受限制地立即访问它们。设备独立性的关键在于内核的适应能力。其他操作系统只允许一定数量或一定种类的外部设备连接。而设备独立性的操作系统能够容纳任意种类及任意数量的设备，因为每一个设备都是通过其与内核的专用连接独立进行访问。 <br />
Linux是具有设备独立性的操作系统，它的内核具有高度适应能力，随着更多的程序员加入Linux编程，会有更多硬件设备加入到各种Linux内核和发行版本中。另外，由于用户可以免费得到Linux的内核源代码，因此，用户可以修改内核源代码，以便适应新增加的外部设备。 <br />
&nbsp; 供了丰富的网络功能<br />
&nbsp; 完善的内置网络是Linux的一大特点。Linux在通信和网络功能方面优于其他操作系统。其他操作系统不包含如此紧密地和内核结合在一起的连接网络的能力，也没有内置这些联网特性的灵活性。而Linux为用户提供了完善的、强大的网络功能。 <br />
&nbsp; 支持Internet是其网络功能之一。Linux免费提供了大量支持Internet的软件，Internet是在Unix领域中建立并繁荣起来的，在这方面使用Linux是相当方便的，用户能用Linux与世界上的其他人通过Internet网络进行通信。 <br />
&nbsp; 文件传输是其网络功能之二。用户能通过一些Linux命令完成内部信息或文件的传输。 <br />
远程访问是其网络功能之三。Linux不仅允许进行文件和程序的传输，它还为系统管理员和技术人员提供了访问其他系统的窗口。通过这种远程访问的功能，一位技术人员能够有效地为多个系统服务，即使那些系统位于相距很远的地方。 <br />
&nbsp; 可靠的系统安全<br />
&nbsp; Linux采取了许多安全技术措施，包括 对读、写进行权限控制 带保护的子系统 审计跟踪 核心授权等，这为网络多用户环境中的用户提供了必要的安全保障。 <br />
&nbsp; 良好的可移植性<br />
&nbsp; 可移植性是指将操作系统从一个平台转移到另一个平台使它仍然能按其自身的方式运行的能力. <br />
Linux是一种可移植的操作系统，能够在从微型计算机到大型计算机的任何环境中和任何平台上运行。<br />
可移植性为运行Linux的不同计算机平台与其他任何机器进行准确而有效的通信提供了手段，不需要另外增加特殊的和昂贵的通信接口。 <br />
&nbsp;&nbsp; 在说Linux特点时,也顺别提一下它的缺点,Linux没有核心团队,来自世界各地的爱好者都可以发布自己的补丁(patch),缺点是源代码可能杂乱无章并且可能相互冲突.其实从另个方面说也是优点,爱好者都可以发布自己的补丁(patch),这使Linux充满着活力,不断更新进步.
<p>Linux与其他操作系统的区别<br />
&nbsp; Linux可以与MS-DOS、Windows等其他操作系统共存于同一台机器上。它们均为操作系统，具有一些共性，但是互相之间各有特色，有所区别。至于MS-DOS、Windows对我们一般计算机爱好来说是非常熟悉的操作系统了,在此只列出Linux与UNIX的区别.<br />
&nbsp; 某些PC机的Unix和Linux在实现方面相类似。几乎所有的商业Unix版本都基本支持同样的软件、程序设计环境和网络特性。然而，Linux和Unix的商业版本依然存在许多差别。Linux支持的硬件范围和商业Unix不一样。一般来说，商业Unix支持的硬件多一些，可是Linux支持的硬件也在不断扩大。突出的是，Linux至少和商用Unix一样稳定。对许多用户来说，最重要的因素是价格。Linux是免费软件，用户可以从Internet网上下载。如果上网不方便，可以很便宜地通过邮购得到Linux的磁盘或CD-ROM。当然也可以直接从朋友那里得到。商业Unix的价值不应被贬低。除了软件本身的价格外，用户还需支付文档、售后支持和质保费。对于较大的机构，这些都很重要，但是PC机用户也许从中得不到什么好处。许多商业公司和大学等单位已经发现，在实验室用廉价的PC机运行Linux比用工作站运行商业Unix还好。Linux可以在PC机上提供工作站的功能，而PC机的价格是工作站的几分之一。也有一些针对PC机的便宜的Unix，其中最有名的是386BSD。在许多方面，386BSD软件包和Linux兼容，但Linux更适合用户的需求。最显著的是，Linux的开发是开放的，任何志愿者都可以对开发过程做出贡献。相比之下，386BSD是由封闭的团队开发的。正是这样，这两种产品存在着严重的概念上和设计上的差别：Linux的目标是从头开始开发一个完整的Unix系统；386BSD的目标则是对现有的BSD做些修改，以适合80386系统。当然现在也有许多免费的在PC机上运行的UNIX,如NetBSD,FreeBSD,OpenBSD等,NetBSD,FreeBSD,OpenBSD在硬件支持方面不如Linux,在系统性能方面,具专家分析,FreeBSD在网络性能,软件移植和系统规范化上比Linux略强些.</p>
<p>Linux下的目录树<br />
&nbsp; / <br />
&nbsp; 这就是根目录。在Windows，DOS或者其他类似的操作系统里面，每个分区都会有一个相应的根目录。但是Linux和其他Unix系统把所有的文件都放在一个目录树里面，/ 就是唯一的根目录。一般来讲，根目录下面很少保存什么文件，或者只有一个内核映像在这里。 <br />
&nbsp; /boot <br />
&nbsp;很多Linux系统把内核映像和其他一些和启动有关的文件放在这里。 <br />
&nbsp; /tmp <br />
&nbsp; 一般只有启动的时候产生的临时文件才会放在这个地方。我们自己的那些临时文件都放在 /var/tmp。 <br />
&nbsp; /mnt <br />
&nbsp; 这个目录下面放着一些用来mount其他设备的子目录，比如说/mnt/cdrom或者/mnt/floppy。 <br />
&nbsp; /lib <br />
&nbsp; 启动的时候所需要用到的库文件都放在这个目录下。那些非启动用的库文件都会放在/usr/lib下。内核模块是被放在/lib/modules/（内核版本）下的。 <br />
&nbsp; /proc <br />
&nbsp; 这个目录在磁盘上其实是不存在的。里面的文件都是关于当前的系统状态的，包括正在运行的进程，硬件状态，内存使用的多少&#8230;&#8230; <br />
&nbsp; /dev <br />
&nbsp; 这个目录下保存着所有的设备文件。里面有一些Linux内核创建的用来控制硬件设备的特殊文件。注意，网卡设备文件（eth0，ppp0等）不在这儿。 <br />
&nbsp; /var <br />
&nbsp; 这里有一些被系统改变过的数据。比如说/var/tmp，就是用来储存临时文件的。还有很多其他的进程和模块把它们的记录文件也放在这个地方。下面将会列举一些重要的子目录： <br />
&nbsp; /var/log <br />
&nbsp; 这里放着绝大部分的记录文件。随着时间的增长，这个目录可能会变得很臃肿。所以需要定期来清理一下。 <br />
&nbsp; /var/run <br />
&nbsp; 包括了各种运行时的小信息。 <br />
&nbsp; /var/lib <br />
&nbsp; 包括了一些系统运行的时候需要的文件。如果你用笔记本上网，/var/lib/pcmcia/stab可能会对你有用。 <br />
&nbsp; /var/spool <br />
&nbsp; 邮件，新闻，打印序列的所在地。 <br />
&nbsp; /root <br />
&nbsp; Root用户的主目录。 <br />
&nbsp; /home <br />
&nbsp; 一般用户的主目录都会放在这个目录下。你可以通过$ cd ~ 来进入你自己的主目录。 <br />
&nbsp; /etc <br />
&nbsp; 如果你是Root用户的话，这个目录应该是你最常来的地方。这里保存着绝大部分的系统配置文件。相对来讲，单个用户的系统配置文件将会保存在这个用户自己的主目录里面。这里的文件会根据你所安装的软件而增减。下面将会列举一下重要的子目录： <br />
&nbsp; /etc/X11 <br />
&nbsp; 这里放着X系统所需要的配置文件。XF86Config就是把配置储存到这个地方的。/etc/X11/fonts里面放着一些服务器需要的字体。还有一些窗口管理器存放的配置文件也是放在这个地方的。 <br />
&nbsp; /etc/init.d <br />
&nbsp; 这个目录保存着启动描述文件，包括各种模块和服务的加载描述。所以如果不清楚的话，最好不要随便删这里的东西。这里的文件都是系统进行配置的，不是用户自己用来配置的。 <br />
&nbsp; /etc/rcS.d <br />
这里放着一些连接到/etc/init.d的连接文件，根据runlevel的不同而执行相应的描述。这里的文件名都是由S来开头的，然后是一个两位的数字——表示各种服务启动的顺序。比如，S24foo就是在S42bar前面执行的。接着就是相应的连接到/etc/init.d下面的文件的名字了。 <br />
&nbsp; /etc/rc0.d - /etc/rc6.d <br />
&nbsp; 这里面也是一些连接文件，和/etc/rcS.d差不多。不同的是，这些只会在指定的runlevel下运行相应的描述。0表示关机，6表示重启。所有以 K开头的文件表示关闭，所有以S开头的文件表示重启。目前来讲，文件的命名方式和/etc/rcS.d是一样的。注意，在Debian下，2表示启动。 <br />
&nbsp; /bin, /sbin <br />
这里分别放着启动的时候所需要的普通程序和系统程序。很多程序在启动以后也很有用，它们放在这个目录下是为它们会经常被其他程序所调用。 <br />
&nbsp; /usr <br />
&nbsp; 这是一个很庞大的目录，几乎所有的文件都放在这下面，除了上面所说的那些。下面将会列举一些重要的子目录： <br />
&nbsp; /usr/X11R6, /usr/X11, /usr/Xfree86 <br />
&nbsp; 这里面保存着X系统所需要的文件，它的目录结构和/usr是一样的。 <br />
&nbsp; /usr/bin <br />
&nbsp; v二进制可执行文件存放的目录，这里放着绝大部分的应用程序。 <br />
&nbsp; /usr/sbin <br />
&nbsp; 这里放着绝大部分的系统程序。 <br />
&nbsp; /usr/games <br />
&nbsp; 游戏程序和相应的数据会放在这里。 <br />
&nbsp; /usr/include <br />
&nbsp; 这个目录保存着C和C++的头文件。除非你是程序员，否则你可能不会感兴趣。 <br />
&nbsp; /usr/lib <br />
&nbsp; 启动时用不到的库文件都会被放在这里。 <br />
&nbsp; /usr/info <br />
&nbsp; 这里保存着GNU Info程序所需要的数据。 <br />
&nbsp; /usr/man <br />
&nbsp; 这里保存着man程序所需要的数据。 <br />
&nbsp; /usr/src <br />
&nbsp; 这里保存着源代码文件。Linux内核的源代码都放在/usr/src/linux下了。 <br />
&nbsp; /usr/doc <br />
&nbsp; 这里保存着各种文档文件。这些文件可以帮助你了解Linux，解决问题和提供一些技巧。或者你可以通过访问 <a href="http://www.linuxdoc.org/">http://www.linuxdoc.org</a> 来活得更多的知识。 <br />
&nbsp; /usr/local <br />
&nbsp; 这里面保存着本地计算机所需要的文件。在用户进行远程访问的时候特别有意义。这个目录在有些Linux系统下就是一个单独的分区，存放一些这台机子所属的那个用户的文件。里面的结构和/usr是一样的。 <br />
&nbsp; /usr/shared, /usr/share <br />
&nbsp; 这里保存着各种共享文件，比如说某个应用程序所需要的声音文件。 </p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/150915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-10-07 21:28 <a href="http://www.blogjava.net/liaojiyong/archive/2007/10/07/150915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux系统安装MySQL</title><link>http://www.blogjava.net/liaojiyong/archive/2007/09/10/143871.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Sun, 09 Sep 2007 23:57:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/09/10/143871.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/143871.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/09/10/143871.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/143871.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/143871.html</trackback:ping><description><![CDATA[红旗Linux系统默认安装后，没有自带数据库软件，这满足不了我们做Java EE开发的需求，因此我们需要自己安装数据库软件，首选的当然是MySQL。虽然在红旗的工具光盘中，提供有MySQL 4.0的RPM包，但是我仍然选择MySQL 5.0。到MySQL的官方网站可以下载该软件的最新版本，如下图：<br />
<img height="600" alt="01.PNG" src="http://www.blogjava.net/images/blogjava_net/youxia/LinuxAndJava5/01.PNG" width="800" border="0" /><br />
<br />
　　在下载页面可以看到，5.1是beta版，6.0是alpha版，因此我们没有必要追求最新的版本，就用5.0好了。从5.0版开始，MySQL分为社区版和企业版，当然，企业版是要钱的了，所以我们只能选择社区版。<br />
<br />
　　MySQL的打包方式也有很多种，可以直接下载源代码，自己编译，也可以下载针对特定Linux系统的RPM包。我选择的是non rpm的打包方式，下载下来后就是一个名为mysql-5.0.45-linux-i686.tar.gz的压缩文件，大小为77.5M。当然，你也可以选择For Red Hat Enterprise Linux 4的RPM包，因为红旗Linux系统发布的时候就宣称对红帽的RPM包兼容，而在红旗提供的工具光盘种，我看到有不少软件包是RHEL 4中的，因此可以确定，红旗Linux至少能够支持RHEL 4中的RPM包。<br />
<br />
　　如果使用的是RPM包，那么安装起来就很简单了，不爽的是Server和Client以及其它的库都单独打包，下载起来麻烦。而我下载的单一压缩文件就方便多了，不过解压后需要经过一些设置才可以使用。<br />
<br />
　　1、先将压缩包解压，放置到/usr/mysql目录<br />
　　2、建立mysql用户<br />
　　3、运行mysql_install_db初始化数据库<br />
<br />
　　整个过程如下图，在设置的过程中，我们还可以看到MySQL的数据将会存放在/usr/mysql/data目录，而且在初始化数据库之前，/usr/mysql/data/mysql目录中是空的，没有任何表文件。如下图：<br />
<img height="455" alt="02.PNG" src="http://www.blogjava.net/images/blogjava_net/youxia/LinuxAndJava5/02.PNG" width="679" border="0" /><br />
<br />
　　设置完成之后，就可以使用./bin/mysqld_safe来启动数据库服务器了，要注意到，无论是初始化数据库还是启动数据库服务器，我们都指定了--user=mysql参数，也就是让他们以mysql用户运行，这主要是从安全方面考虑的。启动服务器后，使用./bin/mysqladmin来设置root帐号的密码，最后使用./bin/mysql链接服务器，就可以使用各种数据库操作了。如下图：<br />
<img height="457" alt="03.PNG" src="http://www.blogjava.net/images/blogjava_net/youxia/LinuxAndJava5/03.PNG" width="680" border="0" />
<img src ="http://www.blogjava.net/liaojiyong/aggbug/143871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-09-10 07:57 <a href="http://www.blogjava.net/liaojiyong/archive/2007/09/10/143871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2007年8月2日</title><link>http://www.blogjava.net/liaojiyong/archive/2007/08/02/133979.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 02 Aug 2007 05:56:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/08/02/133979.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/133979.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/08/02/133979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/133979.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/133979.html</trackback:ping><description><![CDATA[<p>要学好东西不是一件简单的事，认认真真工作也很好，日子过得踏实</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/133979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-08-02 13:56 <a href="http://www.blogjava.net/liaojiyong/archive/2007/08/02/133979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2007年7月24日</title><link>http://www.blogjava.net/liaojiyong/archive/2007/07/24/132087.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Tue, 24 Jul 2007 08:48:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/07/24/132087.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/132087.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/07/24/132087.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/132087.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/132087.html</trackback:ping><description><![CDATA[<p>工作，工作，现在的工作还很舒服，工作没有那多忙，只是要学习的东西也很多<br>现在做java了，<br>现在EMC公司的工程师到我们公司来为我们开发产品，好...</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/132087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-07-24 16:48 <a href="http://www.blogjava.net/liaojiyong/archive/2007/07/24/132087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>房子</title><link>http://www.blogjava.net/liaojiyong/archive/2007/06/18/124960.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 18 Jun 2007 08:26:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/06/18/124960.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/124960.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/06/18/124960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/124960.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/124960.html</trackback:ping><description><![CDATA[<a href="http://sz.goufang.com/zf/default.html">http://sz.goufang.com/zf/default.html</a><br><a href="http://rent.sz.soufun.com/">http://rent.sz.soufun.com/</a>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/124960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-06-18 16:26 <a href="http://www.blogjava.net/liaojiyong/archive/2007/06/18/124960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2007年6月18日</title><link>http://www.blogjava.net/liaojiyong/archive/2007/06/18/124938.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 18 Jun 2007 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/06/18/124938.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/124938.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/06/18/124938.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/124938.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/124938.html</trackback:ping><description><![CDATA[<p>时间过得真快，我都离职一个星期了，今天开始找工作了，休息了一个星期精神状态也很好了。<br>是时候找工作了，要不然没钱吃饭了...</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/124938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-06-18 14:24 <a href="http://www.blogjava.net/liaojiyong/archive/2007/06/18/124938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2007年6月8日</title><link>http://www.blogjava.net/liaojiyong/archive/2007/06/08/122886.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 08 Jun 2007 09:06:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/06/08/122886.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/122886.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/06/08/122886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/122886.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/122886.html</trackback:ping><description><![CDATA[<p>今天在万迅公司的最后一天，走了，兄弟们，保重<br></p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/122886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-06-08 17:06 <a href="http://www.blogjava.net/liaojiyong/archive/2007/06/08/122886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2007年6月7日</title><link>http://www.blogjava.net/liaojiyong/archive/2007/06/07/122681.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 07 Jun 2007 09:52:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/06/07/122681.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/122681.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/06/07/122681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/122681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/122681.html</trackback:ping><description><![CDATA[<p>提交离职申请转眼就一个月了，明天就离开公司了，虽然早就下定决心，不过心情还似有些复......................</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/122681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-06-07 17:52 <a href="http://www.blogjava.net/liaojiyong/archive/2007/06/07/122681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>能为你的程序锦上添花的几种程序结构（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/06/05/122123.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Tue, 05 Jun 2007 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/06/05/122123.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/122123.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/06/05/122123.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/122123.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/122123.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一."用到再说"结构.如果有一个类有一个集合成员,可以在为此成员添加元素时再把具体集合建立起来,以免浪费空间和时间.例:&nbsp;1&nbsp;public&nbsp;class&nbsp;Company{&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;List&nbsp;members=null;&nbsp;3&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/liaojiyong/archive/2007/06/05/122123.html'>阅读全文</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/122123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-06-05 13:26 <a href="http://www.blogjava.net/liaojiyong/archive/2007/06/05/122123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hashtable和HashMap类的区别</title><link>http://www.blogjava.net/liaojiyong/archive/2007/06/05/122081.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Tue, 05 Jun 2007 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/06/05/122081.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/122081.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/06/05/122081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/122081.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/122081.html</trackback:ping><description><![CDATA[<p>最重要的不同是Hashtable的方法是同步的，而HashMap的方法不是。这就意味着，虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个Hashtable，但你必须同样地为一个HashMap提供外同步。<br>一个方便的方法就是利用Collections类的静态的synchronizedMap()方法，它创建一个线程安全的Map对象，并把它作为一个封装的对象来返回。这个对象的方法可以让你同步访问潜在的HashMap。这么做的结果就是当你不需要同步时，你不能切断Hashtable中的同步（比如在一个单线程的应用程序中），而且同步增加了很多处理费用。<br>第二点不同是，只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的key，但任意数量的条目可以是空的value。这就是说，如果在表中没有发现搜索键，或者如果发现了搜索键，但它是一个空的值，那么get()将返回null。如果有必要，用containKey()方法来区别这两种情况。<br><br>一些资料建议，当需要同步时，用Hashtable，反之用HashMap。但是，因为在需要时，HashMap可以被同步，HashMap的功能比Hashtable的功能更多，而且它不是基于一个陈旧的类的，所以有人认为，在各种情况下，HashMap都优先于Hashtable。<br><br>关于Properties<br>有时侯，你可能想用一个hashtable来映射key的字符串到value的字符串。DOS、Windows和Unix中的环境字符串就有一些例子，如key的字符串PATH被映射到value的字符串C:\WINDOWS;C:\WINDOWS\SYSTEM。Hashtables是表示这些的一个简单的方法，但Java提供了另外一种方法。<br><br>Java.util.Properties类是Hashtable的一个子类，设计用于String&nbsp;keys和values。Properties对象的用法同Hashtable的用法相象，但是类增加了两个节省时间的方法，你应该知道。<br><br>Store()方法把一个Properties对象的内容以一种可读的形式保存到一个文件中。Load()方法正好相反，用来读取文件，并设定Properties对象来包含keys和values。<br><br>注意，因为Properties扩展了Hashtable，你可以用超类的put()方法来添加不是String对象的keys和values。这是不可取的。另外，如果你将store()用于一个不包含String对象的Properties对象，store()将失败。作为put()和get()的替代，你应该用setProperty()和getProperty()，它们用String参数。<br><br><br></p>
<p>下面再转一篇关于两个类的区别，比较简单的过一下</p>
<div><font color=#333333><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">HashTable</strong>的应用非常广泛，HashMap是新框架中用来代替<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">HashTable</strong>的类，也就是说建议使用HashMap，不要使用<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">HashTable</strong>。</font></div>
<div>&nbsp;<font color=#333333>这里简单分析他们的区别。&nbsp;<br>1.<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">HashTable</strong>的方法是<font color=#0080ff>同步</font>的，HashMap<font color=#0080ff>未经同步</font>，所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。（最主要的区别）<br><br>2.<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">HashTable</strong><font color=#0080ff>不允许null值</font>(key和value都不可以),<font color=#0080ff>HashMap允许null值(key和value都可以，只容许有一个null值的key，可以有多个null值的value</font>)。<br><br>3.<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">HashTable</strong>有一个contains(Object&nbsp;value)，功能和containsValue(Object&nbsp;value)功能一样。<br><br>4.<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">HashTable</strong>使用Enumeration，HashMap使用Iterator。<br><br>以上只是表面的不同，它们的实现也有很大的不同。<br><br>5.<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">HashTable</strong>中hash数组默认大小是11，增加的方式是&nbsp;old*2+1。HashMap中hash数组的默认大小是16，而且一定是2的指数。<br><br>6.哈希值的使用不同，<strong style="COLOR: black">HashTable</strong>直接使用对象的hashCode，代码是这样的：<br>int&nbsp;hash&nbsp;=&nbsp;key.hashCode();<br>int&nbsp;index&nbsp;=&nbsp;(hash&nbsp;&amp;&nbsp;0x7FFFFFFF)&nbsp;%&nbsp;tab.length;<br>而HashMap重新计算hash值，而且用<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">与</strong>代替求模：<br>int&nbsp;hash&nbsp;=&nbsp;hash(k);<br>int&nbsp;i&nbsp;=&nbsp;indexFor(hash,&nbsp;table.length);<br></font></div>
<div>
<table width=680 border=0>
    <tbody>
        <tr>
            <td width=403><font color=#333333 size=2>static&nbsp;int&nbsp;hash(Object&nbsp;x)&nbsp;{<br>　　&nbsp;int&nbsp;h&nbsp;=&nbsp;x.hashCode();<br><br>　　&nbsp;h&nbsp;+=&nbsp;~(h&nbsp;&lt;&lt;&nbsp;9);<br>　　&nbsp;h&nbsp;^=&nbsp;(h&nbsp;&gt;&gt;&gt;&nbsp;14);<br>　　&nbsp;h&nbsp;+=&nbsp;(h&nbsp;&lt;&lt;&nbsp;4);<br>　　&nbsp;h&nbsp;^=&nbsp;(h&nbsp;&gt;&gt;&gt;&nbsp;10);<br>　　&nbsp;return&nbsp;h;<br>}<br>static&nbsp;int&nbsp;indexFor(int&nbsp;h,&nbsp;int&nbsp;length)&nbsp;{<br>　　&nbsp;return&nbsp;h&nbsp;&amp;&nbsp;(length-1);<br>}<br>以上只是一些比较突出的区别，当然他们的实现上还是有很多不同的，比如<br>HashMap对null的操作。</font></td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/122081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-06-05 10:57 <a href="http://www.blogjava.net/liaojiyong/archive/2007/06/05/122081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>华为测试流程（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/28/120496.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 28 May 2007 08:02:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/28/120496.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/120496.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/28/120496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/120496.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/120496.html</trackback:ping><description><![CDATA[<p>不知不觉做华为外包项目已一年多了，曾在华为常驻过，也曾负责过项目的测试，感觉对华为外包项目的测试流程较熟悉，故写些心得来与大家分享。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果竞标成功，项目就开始要启动了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 华为方会提供一份CRS(客户需求)和SOW（工作任务书），华为方派人过来进行需求培训，这时该项目的测试组长也要参与到项目需求的培训和评审，也就是测试工作应该从需求开始介入。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 项目经理编写《项目计划》，开发人员产出《SRS》，这时测试组长就要根据SOW开始编写《测试计划》，其中包括人员，软件硬件资源，测试点，集成顺序，进度安排和风险识别等内容。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 《测试计划》编写完成后需要进行评审，参与人员有项目经理，测试经理和华为方人员，测试组长需要根据评审意见修改《测试计划》，并上传到VSS上，由配置管理员管理。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 待开发人员把《SRS》归纳好并打了基线，测试组长开始组织测试成员编写《测试方案》，测试方案要求根据《SRS》上的每个需求点设计出包括需求点简介，测试思路和详细测试方法三部分的方案。《测试方案》编写完成后也需要进行评审，评审人员包括项目经理，开发人员，测试经理，测试组长，测试成员和华为方；如果华为方不在公司，就需要测试组长把《测试方案》发送给华为进行评审，并返回评审结果。测试组长组织测试成员修改测试方案，直到华为方评审通过后才进入下个阶段――编写测试用例。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 测试用例是根据《测试方案》来编写的，通过《测试方案》阶段，测试人员对整个系统需求有了详细的理解。这时开始编写用例才能保证用例的可执行和对需求的覆盖。测试用例需要包括测试项，用例级别，预置条件，操作步骤和预期结果。其中操作步骤和预期结果需要编写详细和明确。测试用例应该覆盖测试方案，而测试方案又覆盖了测试需求点，这样才能保证客户需求不遗漏。同样，测试用例也需要通过开发人员，测试人员和华为方的评审，测试组长也需要组织测试人员对测试用例进行修改，直到华为方评审通过。</p>
<p>　　在我们编写测试用例的阶段，开发人员基本完成代码的编写，同时完成单元测试。华为的外包项目一般是一次性集成，所以软件转测试部后直接进行系统测试。测试部对刚转过来的测试版本进行预测试，如果软件未实现CheckList清单上的10％，测试部会把该版本打回。否则，软件转测试部进行系统测试。根据《测试计划》进度安排，测试组长进行多轮次的测试，每轮测试完成后测试组长需要编写测试报告，其中包括用例执行通过情况，缺陷分布情况，缺陷产生原因，测试中的风险等等，这时测试人员就修改增加测试用例。待到开发修改完bug并转来新的测试版本，测试部开始进行第二轮的系统测试，首先回归完问题单，再继续进行测试，编写第二轮的测试报告，如此循环下去，直到系统测试结束。在系统测试期间，测试人员还需要编写验收手册，验收用例和资料测试用例等。</p>
<p>　　完成系统测试后，软件就开始转到华为进行验收测试，其中大概测试半个月，一般会要求测试部派人到华为方进行协助测试，并发回问题单给公司开发人员修改。</p>
<p>　　如果验收发现的缺陷率在SOW规定的范围内，那么验收成功，华为方付钱给公司，项目结束。如果超过规定的缺陷率，那么公司可能要罚钱了，整个项目组的成员（包括开发和测试）都可能要罚了。这种情况也会有，如果按照流程做事，概率不会很大。</p>
<p>　　测试流程的规范是很重要的，但是如果要成为优秀的测试人员只知道流程还是不够的，需要学习的东西还很多，包括熟悉相关测试业务，计算机专业知识（linux，oracle，tcp/ip等），开发的架构和语言，性能测试和系统瓶颈分析、调优等。还有性格（细心，耐心）和人际沟通能力也是很重要的决定条件。任重而道远，我刚起步，希望大家一起在测试的路上互励互勉。</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/120496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-28 16:02 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/28/120496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2007年5月28日</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/28/120412.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 28 May 2007 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/28/120412.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/120412.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/28/120412.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/120412.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/120412.html</trackback:ping><description><![CDATA[<p>这段时间好累哟，不是因为工作，而是每晚睡不好觉，不知道是不是上火了，最近老是做梦，乱七八糟的什么都有，好像是上火了吧，搞不清楚，反正哎...有点累</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/120412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-28 10:42 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/28/120412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>window.dialogArguments</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119767.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 24 May 2007 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119767.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/119767.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119767.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/119767.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/119767.html</trackback:ping><description><![CDATA[<span id=Codehighlighter1_58_1146_Open_Text></span>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">HTML</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">HEAD</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">TITLE</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">myDialog.htm</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">TITLE</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">script&nbsp;</span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">="text/javascript"</span><span style="COLOR: #ff0000">&nbsp;src</span><span style="COLOR: #0000ff">="showModeLessDialogJS.js"</span><span style="COLOR: #0000ff">&gt;&lt;/</span><span style="COLOR: #800000">script</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">HEAD</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">BODY</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">LABEL&nbsp;</span><span style="COLOR: #ff0000">FOR</span><span style="COLOR: #0000ff">="oEnterName"</span><span style="COLOR: #ff0000">&nbsp;ACCESSKEY</span><span style="COLOR: #0000ff">="f"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enter&nbsp;your<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">SPAN&nbsp;</span><span style="COLOR: #ff0000">STYLE</span><span style="COLOR: #0000ff">="text-decoration:underline"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">F</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">SPAN</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">irst&nbsp;Name<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">LABEL</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">INPUT&nbsp;</span><span style="COLOR: #ff0000">ID</span><span style="COLOR: #0000ff">=oEnterName</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">BR</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">BR</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">INPUT&nbsp;</span><span style="COLOR: #ff0000">VALUE</span><span style="COLOR: #0000ff">="Apply"</span><span style="COLOR: #ff0000">&nbsp;TYPE</span><span style="COLOR: #0000ff">=button&nbsp;</span><span style="COLOR: #ff0000">onclick</span><span style="COLOR: #0000ff">="fnGetInfo();"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">INPUT&nbsp;</span><span style="COLOR: #ff0000">VALUE</span><span style="COLOR: #0000ff">="Ok"</span><span style="COLOR: #ff0000">&nbsp;TYPE</span><span style="COLOR: #0000ff">=button&nbsp;</span><span style="COLOR: #ff0000">onclick</span><span style="COLOR: #0000ff">="fnGetInfo();window.close();"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">INPUT&nbsp;</span><span style="COLOR: #ff0000">VALUE</span><span style="COLOR: #0000ff">="Cancel"</span><span style="COLOR: #ff0000">&nbsp;TYPE</span><span style="COLOR: #0000ff">=button&nbsp;</span><span style="COLOR: #ff0000">onclick</span><span style="COLOR: #0000ff">="fnCancel();window.close();"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">BODY</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">HTML</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">HTML</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">HEAD</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">TITLE</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">showModelessDialogEX.htm</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">TITLE</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">script&nbsp;</span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">="text/javascript"</span><span style="COLOR: #ff0000">&nbsp;src</span><span style="COLOR: #0000ff">="showModeLessDialogJS.js"</span><span style="COLOR: #0000ff">&gt;&lt;/</span><span style="COLOR: #800000">script</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">HEAD</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">BODY</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">P</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enter&nbsp;your&nbsp;first&nbsp;name:<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">SPAN&nbsp;</span><span style="COLOR: #ff0000">ID</span><span style="COLOR: #0000ff">="oName"</span><span style="COLOR: #ff0000">&nbsp;STYLE</span><span style="COLOR: #0000ff">="color:red;font-size:24"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Joan</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">SPAN</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">P</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">INPUT&nbsp;</span><span style="COLOR: #ff0000">TYPE</span><span style="COLOR: #0000ff">="button"</span><span style="COLOR: #ff0000">&nbsp;VALUE</span><span style="COLOR: #0000ff">="Display&nbsp;Modeless&nbsp;Dialog"</span><span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onclick</span><span style="COLOR: #0000ff">="fnCallDialog()"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">BODY</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">HTML</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000"><br><img id=Codehighlighter1_22_110_Open_Image onclick="this.style.display='none'; Codehighlighter1_22_110_Open_Text.style.display='none'; Codehighlighter1_22_110_Closed_Image.style.display='inline'; Codehighlighter1_22_110_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_22_110_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_22_110_Closed_Text.style.display='none'; Codehighlighter1_22_110_Open_Image.style.display='inline'; Codehighlighter1_22_110_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;fnGetInfo()&nbsp;</span><span id=Codehighlighter1_22_110_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_22_110_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;sData&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;dialogArguments;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;sData.sUserName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;oEnterName.value;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;sData.fnUpdate();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_132_210_Open_Image onclick="this.style.display='none'; Codehighlighter1_132_210_Open_Text.style.display='none'; Codehighlighter1_132_210_Closed_Image.style.display='inline'; Codehighlighter1_132_210_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_132_210_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_132_210_Closed_Text.style.display='none'; Codehighlighter1_132_210_Open_Image.style.display='inline'; Codehighlighter1_132_210_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;fnCancel()&nbsp;</span><span id=Codehighlighter1_132_210_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_132_210_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;sData&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;dialogArguments;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;sData.sUserName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Joan</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;sData.fnUpdate();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;sUserName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_256_363_Open_Image onclick="this.style.display='none'; Codehighlighter1_256_363_Open_Text.style.display='none'; Codehighlighter1_256_363_Closed_Image.style.display='inline'; Codehighlighter1_256_363_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_256_363_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_256_363_Closed_Text.style.display='none'; Codehighlighter1_256_363_Open_Image.style.display='inline'; Codehighlighter1_256_363_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;fnCallDialog()&nbsp;</span><span id=Codehighlighter1_256_363_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_256_363_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;window.showModelessDialog(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">myDialog.htm</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;window,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">status:false;dialogWidth:300px;dialogHeight:300px</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_385_417_Open_Image onclick="this.style.display='none'; Codehighlighter1_385_417_Open_Text.style.display='none'; Codehighlighter1_385_417_Closed_Image.style.display='inline'; Codehighlighter1_385_417_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_385_417_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_385_417_Closed_Text.style.display='none'; Codehighlighter1_385_417_Open_Image.style.display='inline'; Codehighlighter1_385_417_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;fnUpdate()&nbsp;</span><span id=Codehighlighter1_385_417_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_385_417_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;oName.innerText&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;sUserName;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><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></div>
<br><br>dialogArguments只能在mode和modeless窗口中才能使用，可以传递传递任意类型的值，<br>上例就是传得失window. 在以前的项目中，页面之间传递参数经常使用的是url后接参数的形式，<br>现在终于发现dialogArguments不愧为更好的方法。<br>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/119767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-24 16:58 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/24/119767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java虚拟机运行机制(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119762.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 24 May 2007 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119762.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/119762.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/119762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/119762.html</trackback:ping><description><![CDATA[<font face=Verdana>JVM(Java虚拟机)一种用于计算设备的规范，可用不同的方式（软件或硬件）加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。&nbsp;</font>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上，就能保证经过编译的任何Java代码能够在该系统上运行。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。</p>
<p><strong>一、Java虚拟机(JVM)概述</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.为什么要使用Java虚拟机</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.谁需要了解Java虚拟机</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java虚拟机是Java语言底层实现的基础,对Java语言感兴趣的人都应对Java虚拟机有个大概的了解。这有助于理解Java语言的一些性质,也有助于使用Java语言。对于要在特定平台上实现Java虚拟机的软件人员,Java语言的编译器作者以及要用硬件芯片实现Java虚拟机的人来说,则必须深刻理解Java虚拟机的规范。另外,如果你想扩展Java语言,或是把其它语言编译成Java语言的字节码,你也需要深入地了解Java虚拟机。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.Java虚拟机支持的数据类型</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java虚拟机支持Java语言的基本数据类型如下:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte://1字节有符号整数的补码&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short://2字节有符号整数的补码&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int://4字节有符号整数的补码&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long://8字节有符号整数的补码&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float://4字节IEEE754单精度浮点数&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double://8字节IEEE754双精度浮点数&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char://2字节无符号Unicode字符</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;几乎所有的Java类型检查都是在编译时完成的。上面列出的原始数据类型的数据在Java执行时不需要用硬件标记。操作这些原始数据类型数据的字节码(指令)本身就已经指出了操作数的数据类型,例如iadd、ladd、fadd和dadd指令都是把两个数相加,其操作数类型别是int、long、float和double。虚拟机没有给boolean(布尔)类型设置单独的指令。boolean型的数据是由integer指令,包括integer返回来处理的。boolean型的数组则是用byte数组来处理的。虚拟机使用IEEE754格式的浮点数。不支持IEEE格式的较旧的计算机,在运行Java数值计算程序时,可能会非常慢。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虚拟机支持的其它数据类型包括:&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;object//对一个Javaobject(对象)的4字节引用&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnAddress//4字节,用于jsr/ret/jsr-w/ret-w指令&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注:Java数组被当作object处理。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虚拟机的规范对于object内部的结构没有任何特殊的要求。在Sun公司的实现中,对object的引用是一个句柄,其中包含一对指针:一个指针指向该object的方法表,另一个指向该object的数据。用Java虚拟机的字节码表示的程序应该遵守类型规定。Java虚拟机的实现应拒绝执行违反了类型规定的字节码程序。Java虚拟机由于字节码定义的限制似乎只能运行于32位地址空间的机器上。但是可以创建一个Java虚拟机,它自动地把字节码转换成64位的形式。从Java虚拟机支持的数据类型可以看出,Java对数据类型的内部格式进行了严格规定,这样使得各种Java虚拟机的实现对数据的解释是相同的,从而保证了Java的与平台无关性和可&nbsp;<br>移植性。</p>
<p><br><strong>二、Java虚拟机JVM规格描述</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JVM的设计目标是提供一个基于抽象规格描述的计算机模型，为解释程序开发人员提很好的灵活性，同时也确保Java代码可在符合该规范的任何系统上运行。JVM对其实现的某些方面给出了具体的定义，特别是对Java可执行代码，即字节码(Bytecode)的格式给出了明确的规格。这一规格包括操作码和操作数的语法和数值、标识符的数值表示方式、以及Java类文件中的Java对象、常量缓冲池在JVM的存储映象。这些定义为JVM解释器开发人员提供了所需的信息和开发环境。Java的设计者希望给开发人员以随心所欲使用Java的自由。&nbsp;　　　　JVM定义了控制Java代码解释执行和具体实现的五种规格，它们是：&nbsp;　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*JVM指令系统&nbsp;　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*JVM寄存器&nbsp;　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*JVM栈结构&nbsp;　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*JVM碎片回收堆&nbsp;　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*JVM存储区&nbsp;</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.1JVM指令系统&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JVM指令系统同其他计算机的指令系统极其相似。Java指令也是由&nbsp;操作码和操作数两部分组成。操作码为8位二进制数，操作数进紧随在操作码的后面，其长度根据需要而不同。操作码用于指定一条指令操作的性质（在这里我们采用汇编符号的形式进行说明），如iload表示从存储器中装入一个整数，anewarray表示为一个新数组分配空间，iand表示两个整数的"与"，ret用于流程控制，表示从对某一方法的调用中返回。当长度大于8位时，操作数被分为两个以上字节存放。JVM采用了"big&nbsp;endian"的编码方式来处理这种情况，即高位bits存放在低字节中。这同&nbsp;Motorola及其他的RISC&nbsp;CPU采用的编码方式是一致的，而与Intel采用的"little&nbsp;endian&nbsp;"的编码方式即低位bits存放在低位字节的方法不同。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java指令系统是以Java语言的实现为目的设计的，其中包含了用于调用方法和监视多先程系统的指令。Java的8位操作码的长度使得JVM最多有256种指令，目前已使用了160多种操作码。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.2JVM指令系统&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所有的CPU均包含用于保存系统状态和处理器所需信息的寄存器组。如果虚拟机定义较多的寄存器，便可以从中得到更多的信息而不必对栈或内存进行访问，这有利于提高运行速度。然而，如果虚拟机中的寄存器比实际CPU的寄存器多，在实现虚拟机时就会占用处理器大量的时间来用常规存储器模拟寄存器，这反而会降低虚拟机的效率。针对这种情况，JVM只设置了4个最为常用的寄存器。它们是：&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc程序计数器&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;optop操作数栈顶指针&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame当前执行环境指针&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vars指向当前执行环境中第一个局部变量的指针&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所有寄存器均为32位。pc用于记录程序的执行。optop,frame和vars用于记录指向Java栈区的指针。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.3JVM栈结构&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作为基于栈结构的计算机，Java栈是JVM存储信息的主要方法。当JVM得到一个Java字节码应用程序后，便为该代码中一个类的每一个方法创建一个栈框架，以保存该方法的状态信息。每个栈框架包括以下三类信息：&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;局部变量&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;执行环境&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;操作数栈</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;局部变量用于存储一个类的方法中所用到的局部变量。vars寄存器指向该变量表中的第一个局部变量。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;执行环境用于保存解释器对Java字节码进行解释过程中所需的信息。它们是：上次调用的方法、局部变量指针和操作数栈的栈顶和栈底指针。执行环境是一个执行一个方法的控制中心。例如：如果解释器要执行iadd(整数加法)，首先要从frame寄存器中找到当前执行环境，而后便从执行环境中找到操作数栈，从栈顶弹出两个整数进行加法运算，最后将结果压入栈顶。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;操作数栈用于存储运算所需操作数及运算的结果。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.4JVM碎片回收堆&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java类的实例所需的存储空间是在堆上分配的。解释器具体承担为类实例分配空间的工作。解释器在为一个实例分配完存储空间后，便开始记录对该实例所占用的内存区域的使用。一旦对象使用完毕，便将其回收到堆中。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Java语言中，除了new语句外没有其他方法为一对象申请和释放内存。对内存进行释放和回收的工作是由Java运行系统承担的。这允许Java运行系统的设计者自己决定碎片回收的方法。在SUN公司开发的Java解释器和Hot&nbsp;Java环境中，碎片回收用后台线程的方式来执行。这不但为运行系统提供了良好的性能，而且使程序设计人员摆脱了自己控制内存使用的风险。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.5JVM存储区&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JVM有两类存储区：常量缓冲池和方法区。常量缓冲池用于存储类名称、方法和字段名称以及串常量。方法区则用于存储Java方法的字节码。对于这两种存储区域具体实现方式在JVM规格中没有明确规定。这使得Java应用程序的存储布局必须在运行过程中确定，依赖于具体平台的实现方式。<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JVM是为Java字节码定义的一种独立于具体平台的规格描述，是Java平台独立性的基础。目前的JVM还存在一些限制和不足，有待于进一步的完善，但无论如何，JVM的思想是成功的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对比分析：如果把Java原程序想象成我们的C++原程序，Java原程序编译后生成的字节码就相当于C++原程序编译后的80x86的机器码（二进制程序文件），JVM虚拟机相当于80x86计算机系统,Java解释器相当于80x86CPU。在80x86CPU上运行的是机器码，在Java解释器上运行的是Java字节码。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java解释器相当于运行Java字节码的&#8220;CPU&#8221;,但该&#8220;CPU&#8221;不是通过硬件实现的，而是用软件实现的。Java解释器实际上就是特定的平台下的一个应用程序。只要实现了特定平台下的解释器程序，Java字节码就能通过解释器程序在该平台下运行，这是Java跨平台的根本。当前，并不是在所有的平台下都有相应Java解释器程序，这也是Java并不能在所有的平台下都能运行的原因，它只能在已实现了Java解释器程序的平台下运行。</p>
<p><br><strong>三、Java虚拟机JVM的体系结构</strong>&nbsp;</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;刚才已经提到，JVM可以由不同的厂商来实现。由于厂商的不同必然导致JVM在实现上的一些不同，然而JVM还是可以实现跨平台的特性，这就要归功于设计JVM时的体系结构了。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们知道，一个JVM实例的行为不光是它自己的事，还涉及到它的子系统、存储区域、数据类型和指令这些部分，它们描述了JVM的一个抽象的内部体系结构，其目的不光规定实现JVM时它内部的体系结构，更重要的是提供了一种方式，用于严格定义实现时的外部行为。每个JVM都有两种机制，一个是装载具有合适名称的类(类或是接口)，叫做类装载子系统；另外的一个负责执行包含在已装载的类或接口中的指令，叫做运行引擎。每个JVM又包括方法区、堆、Java栈、程序计数器和本地方法栈这五个部分，这几个部分和类装载机制与运行引擎机制一起组成的体系结构图为：&nbsp;</p>
<p align=center><img src="http://www.itisedu.com/manage/Upload/image/200642610323548.jpg" border=0><br>图3JVM的体系结构&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JVM的每个实例都有一个它自己的方法域和一个堆，运行于JVM内的所有的线程都共享这些区域；当虚拟机装载类文件的时候，它解析其中的二进制数据所包含的类信息，并把它们放到方法域中；当程序运行的时候，JVM把程序初始化的所有对象置于堆上；而每个线程创建的时候，都会拥有自己的程序计数器和Java栈，其中程序计数器中的值指向下一条即将被执行的指令，线程的Java栈则存储为该线程调用Java方法的状态；本地方法调用的状态被存储在本地方法栈，该方法栈依赖于具体的实现。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面分别对这几个部分进行说明。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;执行引擎处于JVM的核心位置，在Java虚拟机规范中，它的行为是由指令集所决定的。尽管对于每条指令，规范很详细地说明了当JVM执行字节码遇到指令时，它的实现应该做什么，但对于怎么做却言之甚少。Java虚拟机支持大约248个字节码。每个字节码执行一种基本的CPU运算,例如,把一个整数加到寄存器,子程序转移等。Java指令集相当于Java程序的汇编语言。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java指令集中的指令包含一个单字节的操作符,用于指定要执行的操作,还有0个或多个操作数,提供操作所需的参数或数据。许多指令没有操作数,仅由一个单字节的操作符构成。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虚拟机的内层循环的执行过程如下:&nbsp;</p>
<p>&nbsp;</p>
<p>do{&nbsp;</p>
<p>取一个操作符字节;&nbsp;</p>
<p>根据操作符的值执行一个动作;&nbsp;</p>
<p>}while(程序未结束)&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于指令系统的简单性,使得虚拟机执行的过程十分简单,从而有利于提高执行的效率。指令中操作数的数量和大小是由操作符决定的。如果操作数比一个字节大,那么它存储的顺序是高位字节优先。例如,一个16位的参数存放时占用两个字节,其值为:&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第一个字节*256+第二个字节字节码。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指令流一般只是字节对齐的。指令tableswitch和lookup是例外,在这两条指令内部要求强制的4字节边界对齐。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于本地方法接口，实现JVM并不要求一定要有它的支持，甚至可以完全没有。Sun公司实现Java本地接口(JNI)是出于可移植性的考虑，当然我们也可以设计出其它的本地接口来代替Sun公司的JNI。但是这些设计与实现是比较复杂的事情，需要确保垃圾回收器不会将那些正在被本地方法调用的对象释放掉。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java的堆是一个运行时数据区,类的实例(对象)从中分配空间，它的管理是由垃圾回收来负责的:不给程序员显式释放对象的能力。Java不规定具体使用的垃圾回收算法,可以根据系统的需求使用各种各样的算法。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java方法区与传统语言中的编译后代码或是Unix进程中的正文段类似。它保存方法代码(编译后的java代码)和符号表。在当前的Java实现中,方法代码不包括在垃圾回收堆中,但计划在将来的版本中实现。每个类文件包含了一个Java类或一个Java界面的编译后的代码。可以说类文件是Java语言的执行代码文件。为了保证类文件的平台无关性,Java虚拟机规范中对类文件的格式也作了详细的说明。其具体细节请参考Sun公司的Java虚拟机规范。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java虚拟机的寄存器用于保存机器的运行状态,与微处理器中的某些专用寄存器类似。Java虚拟机的寄存器有四种:&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc:&nbsp;Java程序计数器；&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;optop:&nbsp;指向操作数栈顶端的指针；&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame:&nbsp;指向当前执行方法的执行环境的指针；。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vars:&nbsp;指向当前执行方法的局部变量区第一个变量的指针。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在上述体系结构图中，我们所说的是第一种，即程序计数器，每个线程一旦被创建就拥有了自己的程序计数器。当线程执行Java方法的时候，它包含该线程正在被执行的指令的地址。但是若线程执行的是一个本地的方法，那么程序计数器的值就不会被定义。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java虚拟机的栈有三个区域:局部变量区、运行环境区、操作数区。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;局部变量区&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每个Java方法使用一个固定大小的局部变量集。它们按照与vars寄存器的字偏移量来寻址。局部变量都是32位的。长整数和双精度浮点数占据了两个局部变量的空间,却按照第一个局部变量的索引来寻址。(例如,一个具有索引n的局部变量,如果是一个双精度浮点数,那么它实际占据了索引n和n+1所代表的存储空间)虚拟机规范并不要求在局部变量中的64位的值是64位对齐的。虚拟机提供了把局部变量中的值装载到操作数栈的指令,也提供了把操作数栈中的值写入局部变量的指令。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;运行环境区&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在运行环境中包含的信息用于动态链接,正常的方法返回以及异常捕捉。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;动态链接&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;运行环境包括对指向当前类和当前方法的解释器符号表的指针,用于支持方法代码的动态链接。方法的class文件代码在引用要调用的方法和要访问的变量时使用符号。动态链接把符号形式的方法调用翻译成实际方法调用,装载必要的类以解释还没有定义的符号,并把变量访问翻译成与这些变量运行时的存储结构相应的偏移地址。动态链接方法和变量使得方法中使用的其它类的变化不会影响到本程序的代码。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;正常的方法返回&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果当前方法正常地结束了,在执行了一条具有正确类型的返回指令时,调用的方法会得到一个返回值。执行环境在正常返回的情况下用于恢复调用者的寄存器,并把调用者的程序计数器增加一个恰当的数值,以跳过已执行过的方法调用指令,然后在调用者的执行环境中继续执行下去。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;异常捕捉&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;异常情况在Java中被称作Error(错误)或Exception(异常),是Throwable类的子类,在程序中的原因是:①动态链接错,如无法找到所需的class文件。②运行时错,如对一个空指针的引用。程序使用了throw语句。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当异常发生时,Java虚拟机采取如下措施:&nbsp;</p>
<p>&#167;&nbsp;检查与当前方法相联系的catch子句表。每个catch子句包含其有效指令范围,能够处理的异常类型,以及处理异常的代码块地址。&nbsp;</p>
<p>&#167;&nbsp;与异常相匹配的catch子句应该符合下面的条件:造成异常的指令在其指令范围之内,发生的异常类型是其能处理的异常类型的子类型。如果找到了匹配的catch子句,那么系统转移到指定的异常处理块处执行;如果没有找到异常处理块,重复寻找匹配的catch子句的过程,直到当前方法的所有嵌套的catch子句都被检查过。&nbsp;</p>
<p>&#167;&nbsp;由于虚拟机从第一个匹配的catch子句处继续执行,所以catch子句表中的顺序是很重要的。因为Java代码是结构化的,因此总可以把某个方法的所有的异常处理器都按序排列到一个表中,对任意可能的程序计数器的值,都可以用线性的顺序找到合适的异常处理块,以处理在该程序计数器值下发生的异常情况。&nbsp;</p>
<p>&#167;&nbsp;如果找不到匹配的catch子句,那么当前方法得到一个"未截获异常"的结果并返回到当前方法的调用者,好像异常刚刚在其调用者中发生一样。如果在调用者中仍然没有找到相应的异常处理块,那么这种错误将被传播下去。如果错误被传播到最顶层,那么系统将调用一个缺省的异常处理块。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;操作数栈区&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;机器指令只从操作数栈中取操作数,对它们进行操作,并把结果返回到栈中。选择栈结构的原因是:在只有少量寄存器或非通用寄存器的机器(如Intel486)上,也能够高效地模拟虚拟机的行为。操作数栈是32位的。它用于给方法传递参数,并从方法接收结果,也用于支持操作的参数,并保存操作的结果。例如,iadd指令将两个整数相加。相加的两个整数应该是操作数栈顶的两个字。这两个字是由先前的指令压进堆栈的。这两个整数将从堆栈弹出、相加,并把结果压回到操作数栈中。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每个原始数据类型都有专门的指令对它们进行必须的操作。每个操作数在栈中需要一个存储位置,除了long和double型,它们需要两个位置。操作数只能被适用于其类型的操作符所操作。例如,压入两个int类型的数,如果把它们当作是一个long类型的数则是非法的。在Sun的虚拟机实现中,这个限制由字节码验证器强制实行。但是,有少数操作(操作符dupe和swap),用于对运行时数据区进行操作时是不考虑类型的。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本地方法栈，当一个线程调用本地方法时，它就不再受到虚拟机关于结构和安全限制方面的约束，它既可以访问虚拟机的运行期数据区，也可以使用本地处理器以及任何类型的栈。例如，本地栈是一个C语言的栈，那么当C程序调用C函数时，函数的参数以某种顺序被压入栈，结果则返回给调用函数。在实现Java虚拟机时，本地方法接口使用的是C语言的模型栈，那么它的本地方法栈的调度与使用则完全与C语言的栈相同。&nbsp;</p>
<p><strong>四、Java虚拟机JVM的运行过程</strong>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面对虚拟机的各个部分进行了比较详细的说明，下面通过一个具体的例子来分析它的运行过程。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虚拟机通过调用某个指定类的方法main启动，传递给main一个字符串数组参数，使指定的类被装载，同时链接该类所使用的其它的类型，并且初始化它们。例如对于程序：&nbsp;</p>
<p>class&nbsp;HelloApp&nbsp;</p>
<p>{&nbsp;</p>
<p>public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;</p>
<p>{&nbsp;</p>
<p>System.out.println("Hello&nbsp;World!");&nbsp;</p>
<p>for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;args.length;&nbsp;i++&nbsp;)&nbsp;</p>
<p>{&nbsp;</p>
<p>System.out.println(args);&nbsp;</p>
<p>}&nbsp;</p>
<p>}&nbsp;</p>
<p>}&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译后在命令行模式下键入：&nbsp;java&nbsp;HelloApp&nbsp;run&nbsp;virtual&nbsp;machine&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将通过调用HelloApp的方法main来启动java虚拟机，传递给main一个包含三个字符串"run"、"virtual"、"machine"的数组。现在我们略述虚拟机在执行HelloApp时可能采取的步骤。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;开始试图执行类HelloApp的main方法，发现该类并没有被装载，也就是说虚拟机当前不包含该类的二进制代表，于是虚拟机使用ClassLoader试图寻找这样的二进制代表。如果这个进程失败，则抛出一个异常。类被装载后同时在main方法被调用之前，必须对类HelloApp与其它类型进行链接然后初始化。链接包含三个阶段：检验，准备和解析。检验检查被装载的主类的符号和语义，准备则创建类或接口的静态域以及把这些域初始化为标准的默认值，解析负责检查主类对其它类或接口的符号引用，在这一步它是可选的。类的初始化是对类中声明的静态初始化函数和静态域的初始化构造方法的执行。一个类在初始化之前它的父类必须被初始化。整个过程如下：&nbsp;</p>
<p align=center><br><img src="http://www.itisedu.com/manage/Upload/image/200642610233917.jpg" border=0><br>图4：JAVA虚拟机的运行过程&nbsp;</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/119762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-24 16:46 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/24/119762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深圳求职网</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119751.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 24 May 2007 08:22:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119751.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/119751.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119751.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/119751.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/119751.html</trackback:ping><description><![CDATA[<a href="http://www.51job.com/">http://www.51job.com/</a><br><a href="http://www.zhaopin.com/">http://www.zhaopin.com</a><br><a href="http://www.szhr.com.cn/">http://www.szhr.com.cn/</a><br><a href="http://www.job88.com/zh-cn/">http://www.job88.com/zh-cn/<br></a><a href="http://www.cjol.com/">http://www.cjol.com</a><br>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/119751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-24 16:22 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/24/119751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK6的新特性(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119684.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 24 May 2007 03:47:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119684.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/119684.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/119684.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/119684.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: SystemTray类在JDK6中 ,AWT新增加了两个类:Desktop和SystemTray,前者可以用来打开系统默认浏览器浏览指定的URL,打开系统默认邮件客户端给指定的邮箱发邮件,用默认应用程序打开或编辑文件(比如,用记事本打开以txt为后缀名的文件),用系统默认的打印机打印文档;后者可以用来在系统托盘区创建一个托盘程序.下面代码演示了Desktop和SystemTray的用法./****...&nbsp;&nbsp;<a href='http://www.blogjava.net/liaojiyong/archive/2007/05/24/119684.html'>阅读全文</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/119684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-24 11:47 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/24/119684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2007年5月24日</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119593.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 24 May 2007 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119593.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/119593.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119593.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/119593.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/119593.html</trackback:ping><description><![CDATA[<p>颓废了好些天了，天天晚上都打拖拉机，现在得重整旗鼓，好好的看看书，学习一下，为找一个新的，有前途的，高收入的工作做准备...</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/119593.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-24 10:38 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/24/119593.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SCJP考题2（详尽答案） (转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119578.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 24 May 2007 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119578.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/119578.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/119578.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/119578.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: test 1##########***&nbsp;&nbsp;&nbsp;&nbsp; ================1.1 Which of the following are valid constructors of the class java.lang.AssertionError?A. AssertionError()B. AssertionError(String detailMe...&nbsp;&nbsp;<a href='http://www.blogjava.net/liaojiyong/archive/2007/05/24/119578.html'>阅读全文</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/119578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-24 10:21 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/24/119578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SCJP考题1（详尽答案）(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119576.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 24 May 2007 02:20:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119576.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/119576.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119576.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/119576.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/119576.html</trackback:ping><description><![CDATA[说明：本文可能由Matrix原创，也可能由Matrix的会员整理，或者由<br>Matrix的Crawler在全球知名Java或者其他技术相关站点抓取并永久<br>保留镜像，Matrix会保留所有原来的出处URL，并在显著地方作出说明，<br>如果你发觉出处URL有误，请联系Matrix改正.<br>
<div id=divarticlecontent>好资源共享，这份考题有详尽答案，部分题目还有本人心得。这是试题1。<br>1. What will happen when you attempt to compile and run the following code?<br>(Assume that the code is compiled and run with assertions enabled.)<br>public class AssertTest{<br>public void methodA(int i){<br>assert i &gt;= 0 : methodB();<br>System.out.println(i);<br>}<br>public void methodB(){&nbsp;&nbsp;//无返回值<br>System.out.println("The value must not be negative");<br>}<br>public static void main(String args[]){<br>AssertTest test = new AssertTest();<br>test.methodA(-10); <br>}<br>}<br>A.it will print -10<br>B.it will result in AssertionError showing the message-&#8220;the value must not be negative&#8221;.<br>C.the code will not compile.<br>D.None of these.<br>C is correct. An assert statement can take any one of these two forms -<br>assert Expression1; <br>assert Expression1 : Expression2;<br>Note that, in the second form; the second part of the statement must be an expression- Expression2. In this code, the methodB() returns void, which is not an expression and hence it results in a compile time error. The code will compile if methodB() returns any value such as int, String etc. <br>Also, in both forms of the assert statement, Expression1 must have type boolean or a compile-time error occurs.<br>2. What will happen when you attempt to compile and run the following code?<br>public class Static{<br>static{<br>int x = 5;&nbsp;&nbsp;//在static内有效<br>}<br>static int x,y;&nbsp;&nbsp; //初始化为0<br>public static void main(String args[]){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x--;&nbsp;&nbsp; //-1<br>myMethod();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(x + y + ++x);<br>}<br>public static void myMethod(){<br>y = x++ + ++x;&nbsp;&nbsp;//y=-1+1&nbsp;&nbsp;x=1<br>}<br>}<br>A.compiletime error<br>B.prints: 1<br>C.prints: 2<br>D.prints: 3<br>E.prints: 7<br>F.prints: 8<br>D is the correct choice. The above code will not give any compilation error. Note that "Static" is a valid class name. Thus choice A is incorrect.<br>In the above code, on execution, first the static variables (x and y) will be initialized to 0. Then static block will be called and finally main() method will be called. The execution of static block will have no effect on the output as it declares a new variable (int x).<br>The first statement inside main (x--) will result in x to be -1. After that myMethod() will be executed. The statement "y = x++ + ++x;" will be evaluated to y = -1 + 1 and x will become 1. In case the statement be "y =++x + ++x", it would be evaluated to y = 0 + 1 and x would become 1. Finally when System.out is executed "x + y + ++x" will be evaluated to "1 + 0 + 2" which result in 3 as the output. Thus choice D is correct.<br><br>3. Given the following code, what will be the output?<br>class Value{<br>public int i = 15;<br>}<br>public class Test{<br>public static void main(String argv[]){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Test t = new Test();<br>t.first();<br>&nbsp;&nbsp; }<br>public void first(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 5;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Value v = new Value();<br>v.i = 25;<br>second(v, i);<br>&nbsp;&nbsp; System.out.println(v.i);<br>}<br>public void second(Value v, int i){<br>i = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.i = 20;<br>Value val = new Value();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v = val;<br>&nbsp;&nbsp; System.out.println(v.i + " " + i);<br>}<br>}<br>A.15 0 20<br>B.15 0 15<br>C.20 0 20<br>D.0 15 20<br>A is correct. When we pass references in Java what actually gets passed is the value of that reference (i.e. memory address of the object being referenced and not the actual object referenced by that reference) and it gets passed as value (i.e a copy of the reference is made). Now when we make changes to the object referenced by that reference it reflects on that object even outside of the method being called but any changes made to the reference itself is not reflected on that reference outside of the method which is called. In the example above when the reference v is passed from method first() to second() the value of v is passed. When we assign the value val to v it is valid only inside the method second() and thus inside the method second() what gets printed is 15 (initial value of i in the object referenced by val), then a blank space and then 0 (value of local variable i). After this when we return to the method first() v actually refers to the same object to which it was referring before the method second() was called, but one thing should be noted here that the value of i in that object (referred by v inside the method first()) was changed to 20 in the method second() and this change does reflect even outside the method second(), hence 20 gets printed in the method first(). Thus overall output of the code in consideration is<br>15 0<br>20<br><br>4. What will happen when you attempt to compile and run the following code?<br>class MyParent {<br>int x, y;<br>MyParent(int x, int y){<br>this.x = x;<br>this.y = y;<br>}<br>public int addMe(int x, int y){<br>return this.x + x + y + this.y;<br>}<br>public int addMe(MyParent myPar){<br>return addMe(myPar.x, myPar.y);<br>}<br>}<br><br>class MyChild extends MyParent{<br>int z;<br>MyChild (int x, int y, int z){<br>super(x,y);<br>this.z = z;<br>}<br>public int addMe(int x, int y, int z){<br>return this.x + x + this.y + y + this.z + z;<br>}<br>public int addMe(MyChild myChi){<br>return addMe(myChi.x, myChi.y, myChi.z);<br>}<br>public int addMe(int x, int y){<br>return this.x + x + this.y + y;<br>}<br>}<br>public class MySomeOne{<br>public static void main(String args[]){<br>MyChild myChi = new MyChild(10, 20, 30);<br>MyParent myPar = new MyParent(10, 20);<br>int x = myChi.addMe(10, 20, 30);<br>int y = myChi.addMe(myChi);<br>int z = myPar.addMe(myPar);<br>System.out.println(x + y + z);<br>}<br>}<br>A.300<br>B.240<br>C.120<br>D.180<br>E.compile error<br>F.none of the above<br>A is the correct choice. In the above code, MyChild class overrides the addMe(int x, int y) method of the MyParent class. And in both the MyChild and MyParent class, addMe() method is overloaded. There is no compilation error anywhere in the above code. <br>On execution, first, the object of MyChild class will be constructed. Please note that there is a super() call from the constructor of MyChild class, which will call the constructor of MyParent class. This will cause the value of z variable of MyChild class to be 30 and x, y variables of MyParent class will become 10 and 20 respectively. The next statement will again call the constructor of MyParent class with same x and y values. This is followed by execution of addMe() method of MyChild class with x as 10, y as 20 and z as 30. Also x and y are inherited by MyChild class from the MyParent class. Thus in the addMe() method of the MyChild class, the value of this.x will be 10, this.y will be 20 and this.z will be 30. The return value of this method will be "10 + 10 + 20 + 20 + 30 + 30", which is equal to 120. Thus x will become 120. <br>This is followed by the invocation of the other addMe() method which takes object reference of the MyChild class. From this method, the method which was called earlier is invoked. This call is exactly the same as the earlier one. Thus the value of y will also be 120 like x. <br>Now the addMe() method of MyParent class is invoked. This method invokes another addMe() method of the same class. Its equivalent to the invocation of addMe(int x, int y) method with x as 10 and y as 20. Also the value of instance variables x and y of My Parent class is 10 and 20 respectively. The value of z will be evaluated to "10 + 10 + 20 + 20", which is equal to 60. Thus the value of x, y and z after all the invocations will be 120, 120 and 60 respectively. As a result of this finally, "120 + 120 + 60" which is equal to 300 will be printed. Thus A is the correct choice.<br><br>5. The class AssertionError has "is -a" relationship with these classes (choose two)<br>A.RuntimeException<br>B.Error<br>C.VirtualMachineError<br>D.IllegalAccessException<br>E.Throwable<br>B and E are correct. The class AssertionError is an Error, which denotes an &#8220;incorrect condition&#8221; as opposed to an &#8220;unusual condition&#8221; (Exception).&nbsp;&nbsp;Since, the class Error descends from Throwable, AssertionError also has &#8220;is-a&#8221; relationship with Throwable. Here is the hierarchy &#8211;java.lang.Object<br>|<br>+-java.lang.Throwable<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +-java.lang.Error&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exception<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +-java.lang.AssertionError&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +RuntimeException IOException<br>Want to know more?<br>You can find more information about this as an answer to the question - &#8220;Why is AssertionError a subclass of Error rather than RuntimeException?&#8221; at - http://java.sun.com/j2se/1.4/docs/guide/lang/assert.html #design-faq-error<br><br>6. What will be the result of executing the following code?<br>1. boolean a = true;<br>2. boolean b = false;<br>3. boolean c = true;<br>4. if (a == true)<br>5.&nbsp;&nbsp; if (b == true)<br>6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (c == true) System.out.println("Some things are true in this world");<br>7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else System.out.println("Nothing is true in this world!");<br>8.&nbsp;&nbsp; else if (a &amp;&amp; (b = c))&nbsp;&nbsp; //这里是赋值，不是比较<br>System.out.println("It's too confusing to tell what is true and what is false");<br>9.&nbsp;&nbsp; else&nbsp;&nbsp;System.out.println("Hey this won't compile");<br>A.The code won&#8217;t compile.<br>B.&#8220;some things are true in this world&#8221; will be printed<br>C.&#8220;hey this won&#8217;t compile&#8221; will be printed<br>D.None of these<br>D is correct. This is a very good question to test the concepts of execution flow in case of if conditions. The rule for attaching else statements with if conditions is the same as attaching close brackets with open brackets. A close bracket attaches with the closest open bracket, which is not already closed. Similarly an else statement attaches with the closest if statement, which doesn't have an else statement already, attached to it. So the else statement at line 7 attaches to the if statement at line 6. The else statement at line 8 attaches to the if statement at line 5. The else statement at line 9 attaches to the if statement at line 8. <br>Now let's look at the execution. At line 4 since a is equal to true the execution falls to line 5. At line 5 since b is not true the execution goes to the corresponding else statement at line 8. Now it evaluates the condition inside the if statement. Please note here that an assignment statement also has a value equal to the value being assigned, hence (b = c) evaluates to true and subsequently a &amp;&amp; (b = c) evaluates to true and "It's too confusing to tell what is true and what is false" will be printed. Hence the correct answer is choice D.<br><br>7. What will happen when you attempt to compile and run the following code?<br>interface MyInterface{}<br>public class MyInstanceTest implements MyInterface{<br>static String s;<br>public static void main(String args[]){<br>MyInstanceTest t = new MyInstanceTest();<br>if(t instanceof MyInterface){<br>System.out.println("I am true interface");<br>}else {<br>System.out.println("I am false interface");<br>}<br>if(s instanceof String){<br>System.out.println("I am true String");<br>}else {<br>System.out.println("I am false String");<br>}<br>}<br>}<br>A.compile time error<br>B.runtime error<br>C.prints: &#8220;I am true interface&#8221; followed by &#8220;I am true String&#8221;<br>D.prints: &#8220;I am false interface&#8221; followed by &#8220;I am false String&#8221;<br>E.prints: &#8220;I am true interface&#8221; followed by &#8220;I am false String&#8221;<br>F.prints: &#8220;I am false interface&#8221; followed by &#8220;I am true String&#8221;<br>E is the correct choice. The "instanceof" operator tests the class of an object at runtime. It returns true if the class of the left-hand argument is the same as, or is some subclass of, the class specified by the right-hand operand. The right-hand operand may equally well be an interface. In such a case, the test determines if the object at left-hand argument implements the specified interface.<br>In the above case there will not be any compiletime or runtime error. The result of "t instance of MyInterface" will be true as "t" is the object of MyInstanceTest class which implements the MyInstance interface. But the result of "s instanceof String" will be false as "s" refers to null. Thus the output of the above program will be : "I am true interface" followed by " I am false String". Thus choice E is correct and others are incorrect.<br><br>8. What results from attempting to compile and run the following code?<br>public class Ternary{<br>public static void main(String args[]){<br>int a = 5;<br>System.out.println("Value is - " + ((a &lt; 5) ? 9.0 : 9));<br>}<br>}<br>A.print:Value is -9<br>B.print:Value is -5<br>C.Compilation error<br>D.None of these<br>D is correct. The code compiles successfully. In this code the optional value for the ternary operator, 9.0(a double) and 9(an int) are of different types. The result of a ternary operator must be determined at the compile time, and here the type chosen using the rules of promotion for binary operands, is double. Since the result is a double, the output value is printed in a floating point format. The choice of which value to be printed is made on the basis of the result of the comparison "a &lt; 5" which results in false, hence the variable "a" takes the second of the two possible values, which is 9, but because the result type is promoted to double, the output value is actually written as 9.0, rather than the more obvious 9, hence D is correct.<br><br>9. In the following pieces of code, A and D will compile without any error. True/False?<br>A: StringBuffer sb1 = "abcd"; <br>B: Boolean b = new Boolean("abcd"); <br>C: byte b = 255; <br>D: int x = 0x1234; <br>E: float fl = 1.2;<br>True<br>False<br>The code segments B and D will compile without any error. A is not a valid way to construct a StringBuffer, you need to creat a StringBuffer object using "new". B is a valid construction of a Boolean (any string other than "true" or "false" to the Boolean constructor will result in a Boolean with a value of "false"). C will fail to compile because the valid range for a byte is -128 to +127 (ie, 8 bits,signed). D is correct, 0x1234 is the hexadecimal representation in java. E fails to compile because the compiler interprets 1.2 as a double being assigned to a float (down-casting), which is not valid. You either need an explicit cast (as in "(float)1.2") or "1.2f", to indicate a float.<br><br>10. Considering the following code, Which variables may be referenced correctly at line 12?<br>1.public class Outer<br>2.{<br>3.public int a = 1;<br>4.private int b = 2;<br>5.public void method(final int c)<br>6.{<br>7.int d = 3;<br>8.class Inner<br>9.{<br>10.private void iMethod(int e)<br>11. {<br>12. <br>13.}<br>14.}<br>15.}<br>16.}<br>a b c d e<br>A, B, C and E are correct. Since Inner is not a static inner class, it has a reference to an enclosing object, and all the variables of that object are accessible. Therefore A and B are correct, even if b is private. Variables in the enclosing method are only accessible when they are marked as final hence c is accessible but not d. E is obviously correct as it is a parameter to the method containing line 12 itself.<br><br>11. What will be the result of executing the following code?<br>public static void main(String args[]){<br>&nbsp;&nbsp; char digit = 'a';<br>&nbsp;&nbsp; for (int i = 0; i &lt; 10; i++){<br>&nbsp;&nbsp;&nbsp;&nbsp; switch (digit){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'x' :{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j = 0;<br>&nbsp;&nbsp; System.out.println(j);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default :{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j = 100;<br>&nbsp;&nbsp; System.out.println(j);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;int i = j;<br>&nbsp;&nbsp;System.out.println(i);<br>}<br>A.100 will be printed 11 times.<br>B.100 will be printed 10 times and then there will be a runtime exception<br>C.The code will not compile because the variable i cannot be declared twice within the mani() method.<br>D.The code will not compile because the variable j cannot be declared twice within the switch statement.<br>E.None of these.<br>E is correct. The code will not compile. There is no problem with the declaration of another variable i as both the variables are in disjoint blocks (first one is inside the for loop and its scope ends with the for loop, whereas the second is outside the for loop) and, therefore, different scopes and hence valid. The problem is with the variable j. The two declarations of the variable j are perfectly valid as they are in disjoint blocks and, therefore, different scopes. The error is that both the declarations of j are not available outside the case or default statement, whereas we are trying to assign it to the variable i. Therefore the compiler objects and reports variable j not found.<br>12. Which of the following collection classes from java.util package are Thread safe?<br>A.Vector<br>B.ArrayList&nbsp;&nbsp;//与Vector类似，只是不同步<br>C.HashMap<br>D.Hashtable<br>A and D are correct. Vector and Hashtable are two collection classes that are inherently thread safe or synchronized; whereas, the classes ArrayList and HashMap are unsynchronized and must be "wrapped" via Collections.SynchronizedList or Collections.synchronizedMap if synchronization is desired.<br><br>13. What will happen when you attempt to compile and run the following code?<br>class MyThread extends Thread{<br>public void run(){<br>System.out.println("MyThread: run()");<br>}<br>public void start(){<br>System.out.println("MyThread: start()");<br>}<br>}<br>class MyRunnable implements Runnable{<br>public void run(){<br>System.out.println("MyRunnable: run()");<br>}<br>public void start(){<br>System.out.println("MyRunnable: start()");<br>}<br>}<br>public class MyTest {<br>public static void main(String args[]){<br>MyThread myThread&nbsp;&nbsp;=&nbsp;&nbsp;new MyThread();<br>MyRunnable myRunnable = new MyRunnable();<br>Thread thread&nbsp;&nbsp;=&nbsp;&nbsp;new Thread(myRunnable);<br>myThread.start();<br>thread.start();<br>}<br>}<br>A.prints: MyThread: start() followed by MyRunnable: run()<br>B.prints: MyThread: run() followed by MyRunnable: start()<br>C.prints: MyThread: start() followed by MyRunnable: start()<br>D.prints: MyThread: run() followed by MyRunnable: run()<br>E.compile time error<br>F.None of the above<br>A is the correct choice. In the above code there is not any compilation error. Thus choice E is incorrect. Inside main() method, objects of MyThread and MyRunnable class are created followed by creation of&nbsp;&nbsp;Thread with object of MyRunnable class. <br>Note that MyThread class extends Thread class and overrides the start() method of the Thread class. Thus on execution of "myThread.start()" statement, the start() method of the MyThread class will be executed and as a result "MyThread:start()" will be printed. Had the start() method not there in MyThread class, the start() method of the Thread class would be called which in turn would call the run() method of the MyThread class.<br>On execution of "thread.start();", the start() method of the Thread class would be called which in turn will call the run() method of the class which is passed to Thread constructor (i.e. MyRunnable class). Thus "MyRunnable:run()" will be printed out. Thus choice A is correct.<br><br>14. What will be the result of executing the following code?<br>// Filename; SuperclassX.java<br>package packageX;<br>public class SuperclassX{<br>protected void superclassMethodX(){}<br>int superclassVarX;<br>}<br><br>// Filename SubclassY.java<br>1.package packageX.packageY;<br>2.<br>3.public class SubclassY extends SuperclassX<br>4.{<br>5.SuperclassX objX = new SubclassY();<br>6.SubclassY objY = new SubclassY();<br>7.void subclassMethodY()<br>8.{<br>9.objY.superclassMethodX();<br>10.int i;<br>11.i = objY.superclassVarX;<br>12.}<br>13.}<br>A.Compile error at line 5.<br>B.Compile error at line 9.<br>C.Runtime exception at line 11.<br>D.None of these<br>D is correct. When no access modifier is specified for a member, it is only accessible by another class in the package where its class is defined. Even if its class is visible in another package, the member is not accessible there. In the question above the variable superclassVarX has no access modifier specified and hence it cannot be accessed in the packageY even though the class SuperclassX is visible and the protected method superclassMethodX() can be accessed. Thus the compiler will raise an error at line 11.<br><br>15. Consider the class hierarchy shown below:<br>&nbsp;&nbsp;&nbsp;&nbsp; FourWheeler <br>(implements DrivingUtilities)<br>/ / \ \<br>&nbsp;&nbsp; /&nbsp;&nbsp;/&nbsp;&nbsp; \&nbsp;&nbsp;\<br>/&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp;&nbsp; \&nbsp;&nbsp; \<br>/&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \&nbsp;&nbsp;&nbsp;&nbsp; \<br>Car&nbsp;&nbsp;Truck&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bus&nbsp;&nbsp;Crane<br>Consider the following code below:<br>1.DrivingUtilities du;<br>2.FourWheeler fw;<br>3.Truck myTruck = new Truck();<br>4.du = (DrivingUtilities)myTruck;<br>5.fw = new Crane();<br>6.fw = du;<br>Which of the statements below are true?<br>A.Line 4 will not compile because an interface cannot refer to an object.<br>B.The code will compile and run.<br>C.The code will not compile without an explicit cast at line 6, because going down the hierarchy without casting is not allowed.<br>D.The code at line 4 will compile even without the explicit cast.<br>E.The code will compile if we put an explicit cast at line 6 but will throw an exception at runtime.<br>C and D are correct. A and B are obviously wrong because there is nothing wrong in an interface referring to an object. C is correct because an explicit cast is needed to go down the hierarchy. D is correct because no explicit cast is needed at line 4, because we are going up the hierarchy. E is incorrect because if we put an explicit cast at line 6, the code will compile and run perfectly fine, no exception will be thrown because the runtime class of du (that is Truck) can be converted to type FourWheeler without any problem.<br><br>16. What results from the following code?<br>1.class MyClass<br>2.{<br>3.void myMethod(int i) {System.out.println("int version");}<br>4.void myMethod(String s) {System.out.println("String version");}<br>5.public static void main(String args[])<br>6.{<br>7.MyClass obj = new MyClass();<br>8.char ch = 'c';<br>9.obj.myMethod(ch);<br>10.}<br>11.}<br>A.Line 4 will not compile as void method can&#8217;t e overridden.<br>B.An exception at line 9.<br>C.Line 9 will not compile as there is no version of myMethod which takes a char as argument.<br>D.The code compiles and produces output: int version<br>E.The code compiles and produces output: String version<br>D is correct. A is incorrect as void methods can be overridden without any problem. B is incorrect as char ch declaration is valid. C is incorrect as char type in java is internally stored as integer and there is a method which takes int as an input. D is correct, on line 9 char ch is widened to an int and passed to int version of the myMethod(). E is incorrect as int version of myMethod() is called.<br><br>17. What is the result when you compile and run the following code? <br>public class ThrowsDemo {&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; static void throwMethod() {&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Inside throwMethod.");&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IllegalAccessException("demo");&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]) {&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throwMethod();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (IllegalAccessException e) {&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Caught " + e);&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br>}<br>A.compile error<br>B.runtime error<br>C.compile successfully, nothing is printed.<br>D.inside throwMethod followed by caught: java.lang.IllegalAccessException: demo<br>A is correct. Exception :java.lang.IllegalAccessExcption must be caught or placed in the throws clause of the throwMethod(), i.e. the declaration of throwMethod() be changed to "static void throwMethod() throws IllegalAccessExcption". Thus compilation error will occur.<br><br>18. What will be printed when you execute the following code?<br>class X {<br>Y b = new Y();<br>&nbsp;&nbsp; X() { <br>System.out.print("X"); <br>}<br>}<br>class Y {<br>&nbsp;&nbsp;&nbsp;&nbsp;Y() { <br>System.out.print("Y"); <br>}<br>}<br><br>public class Z extends X {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Y y = new Y();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Z() { <br>System.out.print("Z"); <br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new Z();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>}<br>A.Z<br>B.YZ<br>C.XYZ<br>D.YXYZ<br>D is correct. A difficult but a fundamental question, please observe carefully. Before any object is constructed the object of the parent class is constructed(as there is a default call to the parent's constructor from the constructor of the child class via the super() statement). Also note that when an object is constructed the variables are initialized first and then the constructor is executed. So when new Z() is executed , the object of class X will be constructed, which means Y b = new Y() will be executed and "Y" will be printed as a result. After that constructor of X will be called which implies "X" will be printed. Now the object of Z will be constructed and thus Y y = new Y() will be executed and Y will be printed and finally the constructor Z() will be called and thus "Z" will be printed. Thus YXYZ will be printed.<br><br>19. What will happen when you attempt to compile and run the following code snippet?<br>Boolean b = new Boolean("TRUE");&nbsp;&nbsp; //不区分大小写<br>if(b.booleanValue()){<br>System.out.println("Yes : " + b);<br>}else{<br>System.out.println("No : " + b);<br>}<br>A.The code will not compile.<br>B.It will print &#8211; Yes: true<br>C.It will print &#8211; Yes: TRUE<br>D.It will print &#8211; No: false<br>E.It will print &#8211; No: FALSE<br>B is the correct choice. The wrapper class Boolean has the following constructor -public Boolean(String s) It allocates a Boolean object representing the value true if the string argument is not null and is equal, ignoring case, to the string "true". Otherwise, allocate a Boolean object representing the value false.E.g.<br>new Boolean("TRUE") produces a Boolean object that represents true.<br>new Boolean("anything") produces a Boolean object that represents false.<br>The internal toString() representation of this object produces the boolean value string in lower case, hence it prints "Yes : true" instead of "Yes : TRUE".<br><br>20. What is the result when you compile and run the following code? <br>public class Test{<br>public void method(){<br>for(int i = 0; i &lt; 3; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(i);<br>}<br>}<br>A. 0122<br>B. 0123<br>C. compile error<br>D. none of these<br>C is correct. The code on compilation will give compile time error because the scope of variable i is only within "for" loop.<br><br>21. What will happen when you attempt to compile and run the following code?<br>int Output = 10;<br>boolean b1 = false;<br>if((b1 == true) &amp;&amp; ((Output += 10) == 20)){<br>&nbsp;&nbsp; System.out.println("We are equal " + Output);<br>}else{<br>&nbsp;&nbsp; System.out.println("Not equal! " + Output);<br>}<br>A.compile error<br>B.compile and output of &#8220;we are equal 10&#8221;<br>C.compile and output of &#8220;not equal!20&#8221;<br>D.compile and output of &#8220;not equal!10&#8221;&nbsp;&nbsp; <br>D is correct, according to short logic operator rule<br><br>22. What will be the result of executing the following code?<br>Given that Test1 is a class.<br>1. Test1[] t1 = new Test1[10];<br>2. Test1[][] t2 = new Test1[5][];<br>3. if (t1[0] == null)<br>4. {<br>5.t2[0] = new Test1[10] ;<br>6.t2[1] = new Test1[10];<br>7.t2[2] = new Test1[10];<br>8.t2[3] = new Test1[10];<br>9.t2[4] = new Test1[10];<br>10. }<br>11. System.out.println(t1[0]);<br>12. System.out.println(t2[1][0]);<br>A. The code will not compile because the array t2 is not initialized in an unconditional statement before use.<br>B. The code will compile but a runtime exception will be thrown at line 12.<br>C. The code will compile but a runtime exception will be thrown at line 11.<br>D. None of these <br>D is correct. Though we cannot use local variables without initializing them (compilation error), there is an exception to it. In case of arrays initialization is supposed to be complete when we specify the leftmost dimension of the array. The problem occurs at runtime if we try to access an element of the array which has not been initialized (specification of size). In the question above the array t2 is initialized before use, therefore there will be no problem at runtime also and the lines 11 and 12 will both print null.<br><br>23. What will happen when you attempt to compile and run the following code?<br>class Base{<br>int i = 99;<br>public void amethod(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Base.amethod()");<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;Base(){<br>&nbsp;&nbsp;&nbsp;&nbsp; amethod();<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>}<br>public class Derived extends Base{<br>int i = -1;<br>public static void main(String argv[]){<br>&nbsp;&nbsp;&nbsp;&nbsp; Base b = new Derived();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(b.i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.amethod();<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; public void amethod(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Derived.amethod()");<br>&nbsp;&nbsp; }<br>}<br>A. Derived.amethod()<br>-1<br>Derived.amethod()<br>B. Derived.amethod()<br>&nbsp;&nbsp;99<br>&nbsp;&nbsp;Derived.amethod()<br>C. 99<br>D. 99<br>&nbsp;&nbsp;Derived.amethod()<br>E. compile time error.<br>B is correct. The reason is that this code creates an instance of the Derived class but assigns it to a reference of a the Base class. In this situation a reference to any of the fields such as i will refer to the value in the Base class, but a call to a method will refer to the method in the class type rather than its reference handle. But note that if the amethod() was not present in the base class then compilation error would be reported as at compile time, when compiler sees the statement like b.amethod(), it checks if the method is present in the base class or not. Only at the run time it decides to call the method from the derived class.<br><br>24. What will be the output on compiling/running the following code?<br>public class MyThread implements Runnable { <br>&nbsp;&nbsp;String myString = "Yes "; <br>&nbsp;&nbsp;public void run() { <br>&nbsp;&nbsp;&nbsp;&nbsp;this.myString = "No "; <br>&nbsp;&nbsp;} <br>&nbsp;&nbsp;public static void main(String[] args)&nbsp;&nbsp;{ <br>&nbsp;&nbsp;&nbsp;&nbsp;MyThread t = new MyThread(); <br>&nbsp;&nbsp;&nbsp;&nbsp;new Thread(t).start(); <br>&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0; i &lt; 10; i++) <br>&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(t.myString); <br>&nbsp;&nbsp;} <br>}<br>A. compile error<br>B. prints: yes yes yes yes yes yes and so on<br>C. prints: no no no no no no no no and so on<br>D. prints: yes no yes no ye no ye no and so on<br>E. the output cannot be determinated<br>E is correct. Please note that there will not be any compilation error when the above code is compiled. Also note that calling start() method on a Thread doesn't start the Thread. It only makes a Thread ready to be called. Depending on the operation system and other running threads, the thread on which start is called will get executed. In the above case it is not guaranteed that the thread will be executed(i.e. run() method will be called), always before "for" loop is executed. Thus the output cannot be determined.<br><br>25. Multiple objects of MyClass (given below) are used in a program that uses multiple Threads to create new integer count. What will happen when other threads use the following code? <br>class MyClass{<br>static private int myCount = 0;<br>int yourNumber;<br>private static synchronized int nextCount(){<br>return ++myCount;&nbsp;&nbsp; //myCount为static<br>}<br>public void getYourNumber(){<br>yourNumber = nextCount();<br>}<br>}<br>A. the code ill give compilation error<br>B. the code ill give runtime error<br>C. each thread will get a unique number<br>D. the uniqueness of the number different Threads can&#8217;t be guaranteed.<br>C is correct. The use of synchronized ensures that the number generated will not be duplicated, no matter how many Threads are trying to create the number. Thus D is incorrect. A and B are incorrect as the above code will not give any compiletime or runtime error.<br><br>26. Which of the following lines will print false?<br>1.public class MyClass<br>2.{<br>3.static String s1 = "I am unique!";<br>4.public static void main(String args[])<br>5.{<br>6.String s2 = "I am unique!";<br>7.String s3 = new String(s1);<br>8.System.out.println(s1 == s2);<br>9.System.out.println(s1.equals(s2));<br>10.System.out.println(s3 == s1);<br>11.System.out.println(s3.equals(s1));<br>12.System.out.println(TestClass.s4 == s1);<br>13.}<br>14.}<br>15.<br>16.class TestClass<br>17.{<br>18.static String s4 = "I am unique!";<br>19.}<br><br>A. line 10 and 12<br>B. line 12 only<br>C. line 8 and 10<br>D. none of these<br>D is correct. Only line 10 will print false. Strings are immutable objects. That is, a string is read only once the string has been created and initialized, and Java optimizes handling of string literals; only one anonymous string object is shared by all string literals with the same contents. Hence in the above code the strings s1, s2 and s4 refer to the same anonymous string object, initialized with the character string: "I am unique!". Thus s1 == s2 and TestClass.s4 will both return true and obviously s1.equals(s2) will return true. But creating string objects using the constructor String(String s) creates a new string, hence s3 == s1 will return false even though s3.equals(s1) will return true because s1 and s3 are referring to two different string objects whose contents are same.<br><br>27. What is displayed when the following code is compiled and executed?<br>String s1 = new String("Test");<br>String s2 = new String("Test");<br>if (s1==s2) System.out.println("Same");<br>if (s1.equals(s2)) System.out.println("Equals");<br>A. same equal<br>B. equals<br>C. same<br>D. compile but nothing is displayed upon exception<br>E. the code fails to compile.<br>B is correct. Here s1 and s2 are two different object references, referring to&nbsp;&nbsp;different objects in memory. Please note that operator == checks for the memory address of two object references being compared and not their value. The "equals()" method of String class compares the values of two Strings. Thus s1==s2 will return "false" while s1.equals(s2) will return "true". Thus only "Equals" will be printed.<br><br>28. What is displayed when the following is executed?<br>class Parent{<br>private void method1(){<br>System.out.println("Parent's method1()");<br>}<br>public void method2(){<br>System.out.println("Parent's method2()");<br>method1();<br>}<br>}<br>class Child extends Parent{<br>public void method1(){<br>System.out.println("Child's method1()");<br>}<br>public static void main(String args[]){<br>Parent p = new Child();<br>p.method2();<br>}<br>}<br><br>A. compile time error<br>B. run time error<br>C. prints: parent&#8217;s method2()&nbsp;&nbsp;parent&#8217;s method1()<br>D. prints: parent&#8217;s method2()&nbsp;&nbsp;child&#8217;s method1()<br>C is correct. The code will compile without any error and also will not give any run time error. The variable p refers to the Child class object. The statement p.method2() on execution will first look for method2() in Child class. Since there is no method2() in child class, the method2() of Parent class will be invoked and thus "Parent's method2()" will be printed. Now from the method2() , there is a call to method1(). Please note that method1() of Parent class is private, because of which the same method (method1() of Parent class) will be invoked. Had this method(method1() of Parent class) been public/protected/friendly (default), Child's class method1() would be called. Thus C is correct answer.<br>Given class parent method1 be public, while class child method1 be pivate, there will be a compile error, for method1 in class child tries to give a weak overridden; given class parent method1 be private, and main() in class child used p.method1(), there will be another compile error for method1 in class parent is not accessible; given class parent method1 be public and class child method1 be public, the end will be &#8220;prints: parent&#8217;s method2()&nbsp;&nbsp;child&#8217;s method1()&#8221;; given method1 in class child be private, there will be a compile error which is &#8220;mehod1 in class child is not accessible&#8221;.<br><br>29. What will happen when you attempt to compile and run the following code snippet?<br>String str = "Java";<br>StringBuffer buffer = new StringBuffer(str);<br>if(str.equals(buffer)){<br>System.out.println("Both are equal");<br>}else{<br>System.out.println("Both are not equal");<br>}<br>A. it will print &#8211; both are not equal<br>B. it will print &#8211; both are equal<br>C. compile time error<br>D. Runtime error<br>A is the correct choice. The equals method overridden in String class returns true if and only if the argument is not null and is a String object that represents the same sequence of characters as this String object. Hence, though the contents of both str and buffer contain "Java", the str.equals(buffer) call results in false.<br>The equals method of Object class is of form -public boolean equals(Object anObject). Hence, comparing objects of different classes will never result in compile time or runtime error.<br><br>30. What will happen when you attempt to compile and run the following code?<br>public class MyThread extends Thread{<br>String myName;<br>MyThread(String name){<br>myName = name;<br>}<br>public void run(){<br>for(int i=0; i&lt;100;i++){<br>System.out.println(myName);<br>}<br>}<br>public static void main(String args[]){<br>try{<br>MyThread mt1 = new MyThread("mt1");<br>MyThread mt2 = new MyThread("mt2");<br>mt1.start();<br>// XXX<br>mt2.start();<br>}catch(InterruptedException ex){}<br>}<br>}<br>A. compile error<br>B. mt1.join();<br>C. mt1.sleep(100);<br>D. mt1.run()<br>E. nothing need <br>Choice A and B are correct. In its current condition, the above code will not compile as "InterruptedException" is never thrown in the try block. The compiler will give following exception: "Exception java.lang.InterruptedException is never thrown in the body of the corresponding try statement."<br>Note that calling start() method on a Thread doesn't start the Thread. It only makes a Thread ready to be called. Depending on the operating system and other running threads, the thread on which start is called will get executed. After making the above code to compile (by changing the InterruptedException to some other type like Exception), the output can't be predicted (the order in which mt1 and mt2 will be printed can't be guaranteed). In order to make the MyThread class prints "mt1" (100 times) followed by "mt2" (100 times), mt1.join() can be placed at //XXX position. The join() method waits for the Thread on which it is called to die. Thus on calling join() on mt1, it is assured that mt2 will not be executed before mt1 is completed. Also note that the join() method throws InterruptedException, which will cause the above program to compile successfully. Thus choice A and B are correct.<br></div>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/119576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-24 10:20 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/24/119576.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>