<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    2005年9月23日

    在這里工作也有半年了,有得有失. 近來心里十分的茅盾, 項(xiàng)目已經(jīng)黃色第5周了.我還是沒有去改變它. 我不知道是自己不行, 還是自己不想. 學(xué)了不多的自我激勵(lì)方法, 可是都不見效果. 也知道這個(gè)時(shí)候只有自己才能解救自己.

    posted @ 2006-11-21 13:25 rodney 閱讀(385) | 評(píng)論 (0)編輯 收藏
     
    以下內(nèi)容轉(zhuǎn)載于http://www.aspxboy.com/private/5294/default.aspx,感謝該作者的分享.
    1.???? 如何設(shè)置一個(gè)From的邊界

    2.???? 如何建立一個(gè)透明的From

    3.???? 如何設(shè)置窗體在屏幕中的位置

    4.???? 如何使最小化和最大化按鈕不可用

    5.???? 如何使一個(gè)窗體不見

    6.???? 如何設(shè)置使窗體成為非矩形的.

    7.???? 如何使一個(gè)窗體在屏幕的最頂端.

    8.???? 如何顯示一個(gè)Model和非Model的窗體

    9.???? 如何制作一個(gè)MDI的窗體

    10.? 如何將你的窗體不顯示在任務(wù)條上.

    11.? 如何制作一個(gè)帶啟動(dòng)屏幕的窗體.

    12.? 如何使你的窗體TrayIcon.

    13.? 如何修改控制窗體的尺寸和長(zhǎng)寬尺寸.

    14.? 如何建立一個(gè)Windows Explorer風(fēng)格的窗體.

    15.? 如何設(shè)置初始的啟動(dòng)窗體

    16.? 如何建立一個(gè)有背景圖像的窗體
    ==========================================================================================

    1.???? 如何設(shè)置一個(gè)From的邊界

    form總共有七種不同的邊界風(fēng)格讓你設(shè)置,你可以在設(shè)計(jì)時(shí)刻也可以運(yùn)行時(shí)通過代碼動(dòng)態(tài)的來設(shè)置它.這七種邊界風(fēng)格分別是:

    none (System.Windows.Forms.FormBorderStyle.None )

    fixed 3D (System.Windows.Forms.FormBorderStyle.Fixed3D)

    fixed Dialog (System.Windows.Forms.FormBorderStyle.FixedDialog)

    fixed Single(System.Windows.Forms.FormBorderStyle.FixedSingle)

    fixed Tool Window(System.Windows.Forms.FormBorderStyle.FixedToolWindow)

    sizable(system.windows.forms.formborderstyle.sizable)

    sizable? Tool Window

    (system.windows.forms.formborderstyle.sizabletoolwindow)

    在設(shè)計(jì)方式下在vs.net IDE的 Properties window中設(shè)置FormBorderStyle屬性就可以了.

    在運(yùn)行方式下你可以用代碼來完成:

    dlgbx1.formborderstyle = System.Windows.Forms.FormBorderStyle.FixedDialog
    這七種邊界類型VB6中就有,沒有什么大的變化,運(yùn)行方式下你需要對(duì)照不同的枚舉變量進(jìn)行設(shè)置.

    ?

    2.???? 如何建立一個(gè)透明的From

    你可以通過兩種方法在設(shè)計(jì)時(shí)刻和運(yùn)行時(shí)刻來做到這一點(diǎn).

    設(shè)計(jì)時(shí)刻,你可以在vs.net IDE的 Properties window, 設(shè)置Opacity 屬性達(dá)到這個(gè)效果.這個(gè)值從0.0到1.0 . 0表示完全透明,1.0表示完全不透明.

    運(yùn)行時(shí)刻你可以用下面的編碼設(shè)置窗體的opactiy屬性來做到.具體:

    frmtransparentform.opacity = 0.76; ( C# )

    看得出現(xiàn)在很簡(jiǎn)單了,你已經(jīng)不用再去了解什么alpha變量了.透明始終只是一種效果,不要濫用它.

    ?

    3.???? 如何設(shè)置窗體在屏幕中的位置

    你可以設(shè)置窗體的startposition屬性,vs.net一般給你一個(gè)保守的選項(xiàng)” WindowsDefaultLocation“ 這樣系統(tǒng)在Load窗體時(shí)將根據(jù)用戶當(dāng)前的計(jì)算機(jī)設(shè)置來確定一個(gè)值,你也可以在設(shè)計(jì)時(shí)將它改成另一個(gè)值”Center”.

    如果你一定要在設(shè)計(jì)方式下確定窗體在屏幕出現(xiàn)的位置你可以先設(shè)置startposition為manual,然后設(shè)置location的x和y的值.

    運(yùn)行時(shí)用代碼實(shí)現(xiàn)似乎更簡(jiǎn)潔一些:

    ? Form1.Location = new Point (100, 100) ( VB.NET )
    當(dāng)然你也可以分別修改的Location的X和Y值,對(duì)應(yīng)的是窗體的Left和Top屬性,比如:

    form1.left += 200 ( VB.NET )

    form1.top -= 100 ( VB.NET )

    另外一個(gè)屬性將也將影響窗體在屏幕的位置:desktoplocation 這個(gè)屬性主要是在你設(shè)置窗體的位置相對(duì)于任務(wù)欄時(shí)非常實(shí)用(當(dāng)你把任務(wù)條放在屏幕的頂或左邊時(shí),其實(shí)相應(yīng)改動(dòng)了desktop coordinates (0,0)),你可以這樣設(shè)置這個(gè)不出現(xiàn)在設(shè)計(jì)屬性窗口中的屬性,

    form1.desktoplocation = new Point (100,100)

    窗體在屏幕中的位置將主要取決于各自用戶具體的硬件和設(shè)置情況,所以保守的作法是用默認(rèn)的” WindowsDefaultLocation”或 ”Center”;專業(yè)的作法是自己先獲取系統(tǒng)的設(shè)置然后編碼動(dòng)態(tài)計(jì)算后進(jìn)行設(shè)置,不然很容易在屏幕上找不到你的窗體.

    ?

    4.???? 如何使最小化和最大化按鈕不可用

    在設(shè)置窗體的form.minimizebox和form.maximizebox 當(dāng)為True時(shí)表示顯示,False時(shí)表示不可.用編程方式見下:

    frmmaxmin.minnimizebox = False ( VB.NET)

    frmmaxmin.maxmnimizebox = True? ( VB.NET )

    ?

    5.???? 如何使一個(gè)窗體不見

    我想最直接的辦法是你調(diào)用 Hide()方法來做到這一點(diǎn).不過我想提供另一種方法,看了之后你會(huì)獲得一些其它的啟發(fā). ( VB.NET )

    ??? Private Const WS_EX_TOOLWINDOW As Int32 = &H80

    ??? Private Const WS_POPUP As Int32 = &H80000000

    ??? Private Const WS_VISIBLE As Int32 = &H10000000

    ??? Private Const WS_SYSMENU As Int32 = &H80000

    ??? Private Const WS_MAXIMIZEBOX As Int32 = &H10000

    ?

    ??? Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams

    ??????? Get

    ??????????? Dim cp As System.Windows.Forms.CreateParams

    ??????????? cp = MyBase.CreateParams

    ??????????? cp.ExStyle = WS_EX_TOOLWINDOW

    ??????????? cp.Style = WS_POPUP Or WS_VISIBLE Or WS_SYSMENU Or WS_MAXIMIZEBOX

    ??????????? cp.Height = 0

    ??????????? cp.Width = 0

    ??????????? Return cp

    ??????? End Get

    ??? End Property

    ??? 原來是把Height 和Width都設(shè)置成0 ,我想這種方式和Hide()調(diào)用的底層可能是不同的。

    ?

    6.???? 如何設(shè)置使窗體成為非矩形的.

    這個(gè)問題我想我提供的不是最專業(yè)的作法,至少它還不能達(dá)到我期望的那樣,也就是說它在某些事件中它還會(huì)變回矩形.但至少我可以告訴你:如果試圖調(diào)用原來的win32’s API SetWindowRng是不行的,我曾如此的嘗試過.現(xiàn)在你可能需要知道有關(guān)窗體的Region屬性

    ???? ' // ( VB.NET )?

    ??? Public Sub SetWindowRegion()

    ?

    ??????? Dim FormPath As System.Drawing.Drawing2D.GraphicsPath

    ??????? Dim Reg As Drawing.Region

    ??????? Dim lRet As Long

    ?

    ??????? FormPath = New Drawing2D.GraphicsPath()

    ??????? FormPath.AddEllipse(New Rectangle(0, 0, 250, 120))

    ?

    ??????? Me.Region = New Region(FormPath)

    ?

    ??? End Sub

    ?

    ??? Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    ??????? Me.Region = Nothing

    ??????? SetWindowRegion()

    ??? End Sub

    ?

    ??? Protected Overrides Sub OnResize(ByVal e As System.EventArgs)

    ????????? Me.Region = Nothing

    ????????? SetWindowRegion()

    ??? End Sub

    ?

    7.???? 如何使一個(gè)窗體在屏幕的最頂端.

    這是很實(shí)用的一個(gè)功能,現(xiàn)在你不用在調(diào)用其它api了,只用設(shè)置topmost 屬性為True就可以了.對(duì)于這個(gè)屬性在設(shè)計(jì)時(shí)刻和運(yùn)行時(shí)刻都是可以進(jìn)行修改的.代碼方式:

    ???????? myTopForm.TopMost = True ( VB.NET)
    ?

    8.???? 如何顯示一個(gè)Model和非Model的窗體

    model和modeless的窗體主要將取決于你的應(yīng)用,最多的是用在顯示對(duì)話框.當(dāng)你需要model的窗體時(shí)你調(diào)用myform. ShowDialog而非Model的調(diào)用MyForm.Show,對(duì)于ShowDialog有一個(gè)可選參數(shù)ower可以讓你為一個(gè)窗體建立父子關(guān)系.比如:

    ' Visual Basic
    Private Sub mnuAbout_Click(…args…)
    ?? Dim f As New FormOption
    ?? f.ShowDialog Me
    End Sub
    有一點(diǎn)需要注意的是對(duì)于ShowDialog來說,當(dāng)執(zhí)行到這一句,窗體顯示,但這之后的代碼將不會(huì)執(zhí)行,只到窗口關(guān)閉之后才繼續(xù)執(zhí)行,而對(duì)于Show來說是即時(shí)的,顯示窗體之后將立即執(zhí)行下面的代碼.
    9.???? 如何制作一個(gè)MDI的窗體

    1.???? 建立一個(gè)新的Windows Application項(xiàng)目

    2.???? 分別加入兩個(gè)窗體Form1 、Form2

    3.???? 設(shè)置Form1的IsMdiContainer屬性為True。使它成為MDI主窗體。

    4.???? 在Form2中加入一個(gè)RichTextBox控件,并設(shè)置Dock為:Fill

    5.???? 在Tools 窗體中拖一個(gè)MainMenu到窗體Form1,然后建立一個(gè)菜單File|Windows|Help三個(gè)菜單項(xiàng),F(xiàn)ile中包括New、Exit菜單項(xiàng);Windows中包括Cascade、Horizontal等。

    6.???? 設(shè)置Windows菜單項(xiàng)的MdiList屬性=True, 這樣每一個(gè)MDI子窗口將自動(dòng)加在Windows菜單項(xiàng)下面。

    7.???? 雙擊New菜單項(xiàng),然后加入以下代碼:

    ???? private void menuNew_Click(object sender, System.EventArgs e)

    ???? {

    ???????? Form2? NewMdiChild ;

    ???????? NewMdiChild = new Form2() ;

    ???????? NewMdiChild.MdiParent = this ;

    ???????? NewMdiChild.Show() ;

    ?

    ???? }

    8.???? 在Windows的Cascade等菜單項(xiàng)中加入以下代碼:

    ???? private void menuWindowCasca_Click(object sender, System.EventArgs e)

    ???? {

    ???????? this.LayoutMdi( MdiLayout.Cascade) ;

    ????????

    ???? }

    另外還有以下常用的:

    this.layoutmdi(mdilayout.tilehorizontal);

    this.layoutmdi(mdilayout.tilevertical);

    9.???? F5運(yùn)行。

    最終版的vs.net 不知是否會(huì)有一個(gè)通用的模板,不過用完全手工的方式產(chǎn)生一個(gè)MDI的窗口,顯得有些繁瑣,不如VS.NET的IDE方式下那么簡(jiǎn)潔。

    ?

    10.???? 如何將你的窗體不顯示在任務(wù)條上.

    當(dāng)窗體的邊界風(fēng)格是tools Window時(shí)它都不會(huì)出現(xiàn)在任務(wù)條上的.另外上面標(biāo)題5中介紹的方法不僅窗體看不見,也不會(huì)出現(xiàn)在任務(wù)條上.

    ??? 如果你現(xiàn)在在Dotnet的世界,這件事也變的簡(jiǎn)單,任何的Winform窗體現(xiàn)在都有ShowInTaskbar屬性,所以你只要簡(jiǎn)單的設(shè)置這個(gè)屬性就可以了。同樣你可以選擇在屬性窗口中將ShowInTaskbar由True改為False。或是用代碼的方式:

    ??? MyTaskBarFrm.ShowInTaskbar = false ; ( C# )

    ?

    11.???? 如何制作一個(gè)帶啟動(dòng)屏幕的窗體.

    需要你準(zhǔn)備兩個(gè)winform的窗體,一個(gè)叫它:splashscreen,把它做成一個(gè)漂亮的窗體。然后你需要一個(gè)主窗體叫它:form1吧,然后在這個(gè)窗體加入下面的代碼。

    ???? // ( C# )

    ???? protected override void OnLoad ( System.EventArgs e )

    ???? {

    ???????? //make load take a long time

    ???????? Thread.Sleep(2000);

    ?

    ???????? base.OnLoad(e);

    ?

    ???? }

    然后在main中加入這樣的代碼:

    ???? [STAThread]

    ???? static void Main()

    ???? {

    ???????? SplashScreen splashForm = new SplashScreen();

    ???????? splashForm.Show();

    ?

    ???????? Form1 mainForm = new Form1() ;

    ???????? mainForm.Load += new EventHandler(splashForm.MainScreen_Load);

    ???????? Application.Run(mainForm);

    ?

    ???? }

    不要忘了加上對(duì)threading的引用: using System.Threading;

    ?

    12.???? 如何使你的窗體TrayIcon.

    實(shí)現(xiàn)這個(gè)功能你可以運(yùn)用notifyicon控件來達(dá)到,從tools Windows中將NotifyIcon拖到你的窗體上然后在下面的事件加入如下代碼,F(xiàn)5。

    ????

    ?? ' // VB.NET

    ??? Private mIconA As Icon = New Icon("Icon1.ico")

    ??? Private mIconB As Icon = New Icon("Icon2.ico")

    ??? Private mIconDisplayed As Boolean

    ???

    ??? Public Sub New()

    ??????? MyBase.New

    ?

    ??????? Form1 = Me

    ?

    ??????? 'This call is required by the Win Form Designer.

    ??????? InitializeComponent

    ?

    ??????? 'TODO: Add any initialization after the InitializeComponent() call

    ???????

    ??????? 'this form isn't used directly so hide it immediately

    ??????? Me.Hide()

    ???????

    ??????? 'setup the tray icon

    ??????? Initializenotifyicon()

    ??? End Sub

    ???

    ??? Private Sub Initializenotifyicon()

    ??????? 'setup the default icon

    ??????? notifyicon = New System.Windows.Forms.NotifyIcon()

    ??????? NotifyIcon.Icon = mIconA

    ??????? NotifyIcon.Text = "Right Click for the menu"

    ??????? NotifyIcon.Visible = True

    ??????? mIconDisplayed = True

    ?

    ??????? 'Insert all MenuItem objects into an array and add them to

    ??????? 'the context menu simultaneously

    ??????? Dim mnuItms(3) As MenuItem

    ??????? mnuItms(0) = New MenuItem("Show Form...", New EventHandler(AddressOf Me.ShowFormSelect))

    ??????? mnuItms(0).DefaultItem = True

    ??????? mnuItms(1) = New MenuItem("Toggle Image", New EventHandler(AddressOf Me.ToggleImageSelect))

    ??????? mnuItms(2) = New MenuItem("-")

    ??????? mnuItms(3) = New MenuItem("Exit", New EventHandler(AddressOf Me.ExitSelect))

    ??????? Dim notifyiconMnu As ContextMenu = New ContextMenu(mnuItms)

    ??????? notifyicon.ContextMenu = notifyiconMnu

    ??? End Sub

    ?

    ??? Public Sub ShowFormSelect(ByVal sender As Object, ByVal e As System.EventArgs)

    ??????? 'Display the settings dialog

    ??????? Dim SettingsForm As New SettingsForm()

    ??????? SettingsForm.ShowDialog()

    ?

    ??? End Sub

    ?

    ??? Public Sub ToggleImageSelect(ByVal sender As Object, ByVal e As System.EventArgs)

    ??????? 'called when the user selects the 'Toggle Image' context menu

    ?

    ??????? 'determine which icon is currently visible and switch it

    ??????? If mIconDisplayed Then

    ??????????? 'called when the user selects the 'Show Form' context menu

    ??????????? NotifyIcon.Icon = mIconB

    ??????????? NotifyIcon.Text = "Sad"

    ??????????? mIconDisplayed = False

    ??????? Else

    ??????????? NotifyIcon.Icon = mIconA

    ??????????? NotifyIcon.Text = "Happy"

    ??????????? mIconDisplayed = True

    ??????? End If

    ?

    ??? End Sub

    ?

    ??? Public Sub ExitSelect(ByVal sender As Object, ByVal e As System.EventArgs)

    ??????? 'called when the user selects the 'Exit' context menu

    ?

    ??????? 'hide the tray icon

    ??????? NotifyIcon.Visible = False

    ?

    ??????? 'close up

    ??????? Me.Close()

    ??? End Sub

    ?

    ??? 'Form overrides dispose to clean up the component list.

    ??? Public Overloads Overrides Sub Dispose()

    ??????? MyBase.Dispose()

    ??????? components.Dispose()

    ??? End Sub

    ??? 圖標(biāo)文件你自己準(zhǔn)備了,如果成功你可以看到有關(guān)NotifyIcond的各種功能了。

    ?

    13.???? 如何修改控制窗體的尺寸和長(zhǎng)寬尺寸.

    主要是修改winform的size, Width 和Height屬性。同樣它們都是可以在設(shè)計(jì)和運(yùn)行時(shí)刻進(jìn)行修改和設(shè)置。

    form1.size = New System.Drawing.Size(100, 100) ( VB.NET )

    form1.width += 100? (VB.NET )

    form1.height -= 20? (VB.NET )

    ?

    14.???? 如何建立一個(gè)Windows Explorer風(fēng)格的窗體.

    1.建立一個(gè)新的windows Application

    2.從toolbox窗口拖一個(gè)treeview控件、、一個(gè)splitterk控件、一個(gè)listview控件,分別在屬性窗口中設(shè)置treeview的dock屬性為::left;設(shè)置listview控件的dock屬性為:fill

    3: F5 運(yùn)行

    ?

    15.???? 如何設(shè)置初始的啟動(dòng)窗體

    無論是c#還是visual Basic的Winform項(xiàng)目中你都可以在Solution Explorer窗口中右鍵你的Project,然后選擇屬性,從你Project的屬性頁(yè)中選擇你啟動(dòng)的窗體或是Main()方法。

    有些不同的是在目前的vs.net Beta2中C#項(xiàng)目會(huì)自動(dòng)產(chǎn)生Main() 方法,Visual Basic.Net 的項(xiàng)目中你必須自己添加Main()代碼,C#中你可以將Form1改成任何你可以啟動(dòng)的窗體名:

    ???? // ( C# )

    ??????? static void Main()

    ??????? {

    ??????????? Application.Run(new Form1());

    ??????? }

    ?

    16.???? 如何建立一個(gè)有背景圖像的窗體

    現(xiàn)在的winform中所有的窗體都有一個(gè)backgroundimage屬性,只用對(duì)它賦值就可以了。普通窗體可以在運(yùn)行模式也可以在運(yùn)行模式完成這個(gè)設(shè)置。比如在initializecomponent()或窗體的構(gòu)造函數(shù)中加入這樣的代碼:

    this.backgroundimage = new Bitmap("C:\\DotNetApp\\WinForm\\Tile.bmp" ) ;

    ??? 對(duì)于MDI的主窗體要麻煩一些,在VS.NET的IDE窗體中,當(dāng)你設(shè)置完IsMdiContainer屬性為True后,你需要查看一下InitializeComponent()中是否有這樣的代碼 ( C# ):

    ??????????? this.mdiClient1.Dock = System.Windows.Forms.DockStyle.Fill;

    ??????????? this.mdiClient1.Name = "mdiClient1";

    或是在窗口的屬性窗口組合框中看到mdiclient1 System.Windows.Forms.mdiClient.這就是主MDI窗口,不過我沒有在dotnet的文檔中找到任何有關(guān)System.Windows.Forms.mdiClient的說明。然后你可以在InitializeComponent()或窗體的構(gòu)造函數(shù)中加入這樣的代碼( C# ):

    this.mdiclient1.backgroundimage? = new Bitmap("C:\\DotNetApp\\WinForm\\Tile.bmp" ) ;

    ??? 網(wǎng)上有一個(gè)ImageView的例子,里面演示了給MDI主窗體中背景上加入一行Logo文字的方法,這樣使你的MDI窗體看起來很商業(yè)化,具體的你可以這樣做:

    1.?? 先在VS.NET 自動(dòng)產(chǎn)生代碼的InitializeComponent中看是否有這樣的語句( C# ):

    this.controls.addrange(new System.Windows.Forms.Control[] {this.mdiClient1});

    ??? 又是這個(gè)mdiClient (haha)

    2.?? 建立以下兩個(gè)函數(shù)用于顯示這個(gè)Logo字符:

    // ( C# )

    ??????? protected? void Mdi_OnPaint (? Object s,? System.Windows.Forms.PaintEventArgs e )

    ??????? {

    ??????????? Control c = (Control)s;

    ???????????

    ?

    ??????????? Rectangle r1 = c.ClientRectangle;

    ??????????? r1.Width -= 4;

    ??????????? r1.Height -= 4;

    ?

    ??????????? Rectangle r2 = r1;

    ??????????? r2.Width -= 1;

    ??????????? r2.Height -= 1;

    ?

    ??????????? Font f = new Font("Tahoma", 8);

    ?

    ??????????? String str = "MyWinform.NET ?2001 MyWinform Application V1.0";

    ?

    ??????????? StringFormat sf = new StringFormat();

    ??????????? sf.Alignment = StringAlignment.Far;

    ??????????? sf.LineAlignment = StringAlignment.Far;

    ?

    ??????????? e.Graphics.DrawString(str, f, new SolidBrush(SystemColors.ControlDarkDark), r1, sf);

    ??????????? e.Graphics.DrawString(str, f, new SolidBrush(SystemColors.ControlLight), r2, sf);

    ?

    ??????? }

    ?

    ??????? protected? void Mdi_OnResize ( Object s ,? System.EventArgs e )

    ??????? {

    ???????????

    ??????????? Control c = (Control)s;

    ??????????? c.Invalidate();

    ??????? }

    3.?? 在InitializeComponent()或窗體的構(gòu)造函數(shù)中加入這樣的代碼:

    ( C# )

    ??? this.Controls[0].Paint += new PaintEventHandler( Mdi_OnPaint ) ;

    ??? this.Controls[0].Resize += new EventHandler( Mdi_OnResize ) ;

    ??????? 注意將它加在InitializeComponent()后面或是在InitializeComponent函數(shù)中this.Controls.AddRange函數(shù)之后。

    posted @ 2006-05-10 10:01 rodney 閱讀(578) | 評(píng)論 (0)編輯 收藏
     

    昨天下班是計(jì)算機(jī)已經(jīng)關(guān)機(jī)了。可今天早上一開到啟動(dòng)Windows時(shí)系統(tǒng)一片藍(lán)屏。我用安全模式也進(jìn)入不了。后來把硬盤拆下來,安裝到同事的機(jī)子上進(jìn)行硬盤檢查。如果分區(qū),壞道等。結(jié)果沒有什么問題,但為了資料的安全,我把有用的資料都copy到他機(jī)子上。把硬盤重新安裝回我的機(jī)子上。結(jié)果怎么樣。。。
    神了一點(diǎn)問題也沒有。真是虛驚一場(chǎng)呀。

    posted @ 2006-04-25 09:33 rodney 閱讀(716) | 評(píng)論 (0)編輯 收藏
     

    我用記事本打開一個(gè)以前的分頁(yè)程序。把其中的一部份代碼copy到我的現(xiàn)在的程序中,可是編譯器提示illegal character \12288錯(cuò)誤。我按它提示的錯(cuò)誤找到發(fā)生錯(cuò)誤的行。我用別的變量名試了一下是可以的。難道是這個(gè)變量名輸入時(shí)用了中文的輸入法。我check一下,可是還是沒有解決。我又重新聲明了一個(gè)與這個(gè)變量名一樣的變量,把原來的注釋起來。后來發(fā)現(xiàn)可以了,我再把現(xiàn)在的注釋掉,用原來的變量,還是不行。我把它刪除掉重新寫了一遍包括空格也刪除。OK,就可以了。我想可能還是有中文的輸入字符或是空格。

    以面的問題可真是不是問題的問題,如果遇到同樣的問題的朋友看看是否也是犯了同樣的錯(cuò)。

    最后發(fā)現(xiàn)是一個(gè)中文的空格,我在刪除該變量時(shí)發(fā)現(xiàn)有一個(gè)空格的距離較大。

    posted @ 2006-04-21 09:37 rodney 閱讀(1032) | 評(píng)論 (0)編輯 收藏
     

    因我的機(jī)子內(nèi)存才512M要運(yùn)行JBuilder2006,還要運(yùn)行oracle9i時(shí)速度很慢,所以我先把oracle的幾個(gè)服務(wù)關(guān)了。后來我要使用oracle是一直連接不上,提示“沒有TNS監(jiān)聽”。我一查看服務(wù),果然那個(gè)oracleOraHome90TNSListener沒有啟動(dòng),我一接點(diǎn)擊啟動(dòng),可還是提示那句沒有TNS監(jiān)聽。這是為什么呢?lt;br />第一種可能是否把計(jì)算機(jī)名改了。如果是就按下面的步驟做?lt;br />把安裝目錄下的listener.ora打開察看。如:d:\oracle\ora90\network\admin\listener.ora.
    打開該配置文件后發(fā)現(xiàn)如下一段配置信息:
    LISTENER?=
    ??(DESCRIPTION_LIST?=
    ????(DESCRIPTION?=
    ??????(ADDRESS_LIST?=
    ????????(ADDRESS?=?(PROTOCOL?=?IPC)(KEY?=?EXTPROC0))
    ??????)
    ??????(ADDRESS_LIST?=
    ????????(ADDRESS?=?(PROTOCOL?=?TCP)(HOST?=?local)(PORT?=?1521))
    ??????)
    ????)
    ??)
    看到這一行HOST=local這個(gè)是計(jì)算機(jī)名字,這個(gè)名字要與現(xiàn)在的計(jì)算機(jī)名對(duì)應(yīng)。如果不知道自己的計(jì)算機(jī)名是什么可以到“我的電腦”的屬性中有一個(gè)“網(wǎng)絡(luò)標(biāo)識(shí)”的tab?你在完整的計(jì)算機(jī)名稱后面看到的就是你的計(jì)算機(jī)名了?lt;br />以下內(nèi)容轉(zhuǎn)載http://www3.ccw.com.cn/club/essence/200202/8252.htm版權(quán)歸原作?
    近來,瀏覽BBS時(shí),常看到“急急急!如何啟動(dòng)OMS?”的字眼,就針對(duì)以上這類問題,我有些經(jīng)驗(yàn)想和大家共同分享?lt;br />能否正常啟動(dòng)OEM或OMS關(guān)鍵有以下兩點(diǎn):
    ????第一.Oracle的系統(tǒng)服務(wù)是否開啟;
    ????第二.登錄時(shí)用的用戶名和口令是否正確?lt;br />
    ????那么先針對(duì)第一點(diǎn)談?wù)凮racle的系統(tǒng)服務(wù)。在完全安裝的情況下,Oracle的系統(tǒng)服務(wù)共?1項(xiàng):
    ????1.Oracle OLAP 9.0.1.0.1
    ????2.Oracle OLAP Agent
    ????3.OracleOraHome90Agent
    ????4.OracleOraHome90ClientCache
    ????5.OracleOraHome90HTTPServer
    ????6.OracleOraHome90ManagementServer(0.5M)
    ????7.OracleOraHome90PagingServer
    ????8.OracleOraHome90SNMPPeerEncapsulator
    ????9.OracleOraHome90SNMPPeerMasterAgent
    ????10.OracleOraHome90TNSListener(5.2M)
    ????11.OracleServiceORACLE(70M)
    ????????(注:OraHome90是可以在安裝時(shí)改變的Oracle的主目錄名稱,是安裝時(shí)的默認(rèn)?

    ????其中最重要的服務(wù)有3個(gè),分別是OracleOraHome90ManagementServer、OracleOraHome90TNSListener?lt;br />OracleServiceORACLE。下面就來看一下有哪些啟動(dòng)錯(cuò)誤與它們有關(guān)?lt;br />
    ????1.Oracle系統(tǒng)提示:Ora-12541:TNS:沒有監(jiān)聽器;
    ????2.操作系統(tǒng)提示:在本地計(jì)算機(jī)無法啟動(dòng)OMS服務(wù)
    ?????????????????????錯(cuò)誤?053:服務(wù)并未及時(shí)響應(yīng)來控制請(qǐng)求附帶?lt;br />????以上兩種錯(cuò)誤提示大都是由OracleOraHome90TNSListener監(jiān)聽服務(wù)引起的?lt;br />解決方法:控制面?>管理工具->服務(wù)->右鍵單擊“OracleOraHome90TNSListener”,再單擊“啟動(dòng)”?lt;br />
    ????3.Oracle系統(tǒng)提示:Ora-12500:TNS:監(jiān)聽程序無法啟動(dòng)專用服務(wù)器進(jìn)程;
    ????該錯(cuò)誤是由OracleServiceORACLE專用服務(wù)器進(jìn)程引起的?lt;br />解決方法:控制面?>管理工具->服務(wù)->右鍵單擊“OracleServiceORACLE”,再單擊“啟動(dòng)”?lt;br />
    ????4.Oracle系統(tǒng)提示:VTK-1000:無法連接到Management Server?lt;br />???????????????????????請(qǐng)驗(yàn)證您已輸入Oracle Management Server的正確主機(jī)名和狀態(tài)?lt;br />????該錯(cuò)誤引起的原因有兩種,一是OracleOraHome90ManagementServer還沒啟動(dòng);二是沒有輸入主機(jī)名?lt;br />解決方法:控制面?>管理工具->服務(wù)->右鍵單擊“OracleOraHome90ManagementServer”,再單擊“啟動(dòng)?
    或是輸入您這臺(tái)計(jì)算機(jī)的完整名稱?lt;br />小結(jié):這三個(gè)服務(wù)的啟動(dòng)或關(guān)閉還有先后的順序。一般來講,啟動(dòng)時(shí)必須先啟動(dòng)OracleOraHome90TNSListener啟動(dòng)OracleOraHome90ManagementServer或OracleServiceORACLE,在啟動(dòng)OracleOraHome90ManagementServer時(shí),同時(shí)也啟動(dòng)了OracleServiceORACLE。而關(guān)閉時(shí)必須先關(guān)閉OracleOraHome90ManagementServer再關(guān)閉OracleOraHome90TNSListener或OracleServiceORACLE,關(guān)閉OracleOraHome90ManagementServer時(shí),若有提示輸入用戶名和口令,請(qǐng)輸入sysman的用戶名和口令,以確保成功的執(zhí)行。有些其他提示如:資源已被占用,I/O重復(fù),端口已被使用等等之類的話,那最好與系統(tǒng)管理員聯(lián)系,再尋求解決辦法?lt;br />

    ?

    posted @ 2006-04-20 08:52 rodney 閱讀(1037) | 評(píng)論 (1)編輯 收藏
     

    type Status report

    message /zz3in1/SrvTest

    description The requested resource (/zz3in1/SrvTest) is not available.
    這是為什呢?
    用過了../../SrvTest 這個(gè)是不行的。././SrvTest這樣可以。還有./SrvTest也可以。

    posted @ 2006-04-17 17:01 rodney 閱讀(363) | 評(píng)論 (0)編輯 收藏
     
    用document.getElementById("01").innerHTML/innerText都可以。如:<tr><td id="01">Hello</td></tr>要把Hello取出來就可以用document.getElementById("01").innerHTML/innerText。
    但是用innerHTML與用innerText有什么區(qū)別嗎?用innerHTML會(huì)把這個(gè)標(biāo)記中的所有HTML標(biāo)記與值取出來。innerText只會(huì)取最后的值。
    posted @ 2006-04-14 12:49 rodney 閱讀(501) | 評(píng)論 (0)編輯 收藏
     
    如果你在安裝oracle8i時(shí),系統(tǒng)會(huì)自己給你安裝一個(gè)JDK1.1的或1.2的。然后你安裝JDK1.5后,在系統(tǒng)環(huán)境中設(shè)置了JAVA_HOME是JDK1.5的,path中也設(shè)置了javaroot\JDK1.5\bin可是你怎么樣也不能用JDK1.5中的命令。C:\Documents and Settings\Administrator>java
    Registry key 'Software\JavaSoft\Java Runtime Environment\CurrentVersion'
    has value '1.1', but '1.2' is required.
    改注冊(cè)表HKEY_LOCAL_MACHINE???中的SOFTWARE--JavaSoft--Java Runtime Environment--CurrentVersion的值改成了1.5
    系統(tǒng)會(huì)提示你:C:\Documents and Settings\Administrator>java
    Registry key 'Software\JavaSoft\Java Runtime Environment\CurrentVersion'
    has value '1.5', but '1.2' is required.這是為什么呢?因你的系統(tǒng)中安裝了舊的版本JDK,而且有程序程序有使用到它。這時(shí)你只要在當(dāng)前的用戶系統(tǒng)環(huán)境下設(shè)置一個(gè)JAVA_HOME(可以不要)并且在系統(tǒng)環(huán)境的path的最前面加上javaroot\jdk1.5\bin。這樣就OK了。你可以把DOS窗口關(guān)閉再開啟。WINDOWS2K不要重啟計(jì)算機(jī)。WINDOWS98的要重啟。
    posted @ 2006-04-11 09:10 rodney 閱讀(879) | 評(píng)論 (0)編輯 收藏
     

    以下信息是轉(zhuǎn)載http://www.aaunion.net/cn/blog/more.asp?name=magicmao&id=687
    document
    文擋對(duì)象 - JavaScript腳本語言描述

    ---------------------------------------------------------------------

    :頁(yè)面上元素name屬性和JavaScript引用的名稱必須一致包括大小寫

    ?? 否則會(huì)提示你一個(gè)錯(cuò)誤信息 "引用的元素為空或者不是對(duì)象"

    ---------------------------------------------------------------------

    ?

    對(duì)象屬性

    document.title???????????? // 設(shè)置文檔標(biāo)題等價(jià)于HTML<title>標(biāo)簽

    document.bgColor?????????? // 設(shè)置頁(yè)面背景色

    document.fgColor?????????? // 設(shè)置前景色(文本顏色)

    document.linkColor???????? // 未點(diǎn)擊過的鏈接顏色

    document.alinkColor?????? ?// 激活鏈接(焦點(diǎn)在此鏈接上)的顏色

    document.vlinkColor??????? // 已點(diǎn)擊過的鏈接顏色

    document.URL?????????????? // 設(shè)置URL屬性從而在同一窗口打開另一網(wǎng)頁(yè)

    document.fileCreatedDate?? // 文件建立日期,只讀屬性

    document.fileModifiedDate? // 文件修改日期,只讀屬性

    document.fileSize????????? // 文件大小,只讀屬性

    document.cookie??????????? // 設(shè)置和讀出cookie

    document.charset?????????? // 設(shè)置字符集 簡(jiǎn)體中文:gb2312

    ---------------------------------------------------------------------

    對(duì)象方法

    document.write()????????????????? // 動(dòng)態(tài)向頁(yè)面寫入內(nèi)容

    document.createElement(Tag)?????? // 創(chuàng)建一個(gè)html標(biāo)簽對(duì)象

    document.getElementById(ID)?????? // 獲得指定ID值的對(duì)象

    document.getElementsByName(Name)? // 獲得指定Name值的對(duì)象

    ---------------------------------------------------------------------

    ?

    images 集合(頁(yè)面中的圖象)

    ?

    a) 通過集合引用

    document.images???????????? // 對(duì)應(yīng)頁(yè)面上的<img>標(biāo)簽

    document.images.length????? // 對(duì)應(yīng)頁(yè)面上<img>標(biāo)簽的個(gè)數(shù)

    document.images[0]???????? ?// 1個(gè)<img>標(biāo)簽

    document.images[i]???????? ?// i-1個(gè)<img>標(biāo)簽

    ?

    b) 通過nane屬性直接引用

    <img name="oImage">

    document.images.oImage????? //document.images.name 屬性

    ?

    c) 引用圖片的src屬性

    document.images.oImage.src? //document.images.name 屬性.src

    ?

    d) 創(chuàng)建一個(gè)圖象

    var oImage

    oImage = new Image()

    document.images.oImage.src="/1.jpg"

    // 同時(shí)在頁(yè)面上建立一個(gè)<img>標(biāo)簽與之對(duì)應(yīng)就可以顯示

    ?

    <html>

    <img name=oImage>

    <script language="javascript">

    ?? var oImage

    ?? oImage = new Image()

    ?? document.images.oImage.src="/1.jpg"

    </script>

    </html>

    ?

    ----------------------------------------------------------------------

    ?

    forms 集合(頁(yè)面中的表單)

    ?

    a) 通過集合引用

    document.forms???????????????? // 對(duì)應(yīng)頁(yè)面上的<form>標(biāo)簽

    document.forms.length????????? // 對(duì)應(yīng)頁(yè)面上<form>標(biāo)簽的個(gè)數(shù)

    document.forms[0]????????????? // 1個(gè)<form>標(biāo)簽

    document.forms[i]????????????? // i-1個(gè)<form>標(biāo)簽

    document.forms[i].length????? ?// i-1個(gè)<form>中的控件數(shù)

    document.forms[i].elements[j]? // i-1個(gè)<form>中第j-1個(gè)控件

    ?

    b) 通過標(biāo)簽name屬性直接引用

    <form name="Myform"><input name="myctrl"></form>

    document.Myform.myctrl??????? ?//document. 表單名.控件名

    ?

    -----------------------------------------------------------------------

    <html>

    <!--Text 控件相關(guān)Script-->

    <form name="Myform">

    <input type="text" name="oText">

    <input type="password" name="oPswd">

    <form>

    <script language="javascript">

    // 獲取文本密碼框的值

    document.write(document.Myform.oText.value)

    document.write(document.Myform.oPswd.value)

    </script>

    </html>

    -----------------------------------------------------------------------

    <html>

    <!--Select 控件相關(guān)Script-->

    <form name="Myform">

    <select name="oSelect">

    <option value="1">1</option>

    <option value="2">2</option>

    <option value="3">3</option>

    </select>

    </form>

    ?

    <script language="javascript">

    ?? // 遍歷select控件的option項(xiàng)

    ?? var length

    ?? length=document.Myform.oSelect.length

    ?? for(i=0;i<length;i++)

    ?? document.write(document.Myform.oSelect[i].value)

    </script>

    ?

    <script language="javascript">

    ?? // 遍歷option項(xiàng)并且判斷某個(gè)option是否被選中

    ?? for(i=0;i<document.Myform.oSelect.length;i++){

    ?? if(document.Myform.oSelect[i].selected!=true)

    ? ? document.write(document.Myform.oSelect[i].value)

    ?? else

    ?? document.write("<font color=red>"+document.Myform.oSelect[i].value+"</font>")??

    ?? }

    </script>

    ?

    <script language="javascript">

    ?? // 根據(jù)SelectedIndex打印出選中的option

    ?? //(0 document.Myform.oSelect.length-1)

    ?? i=document.Myform.oSelect.selectedIndex

    ?? document.write(document.Myform.oSelect[i].value)

    </script>

    ?

    <script language="javascript">

    ?? // 動(dòng)態(tài)增加select控件的option項(xiàng)

    ?? var oOption = document.createElement("OPTION");

    ?? oOption.text="4";

    ?? oOption.value="4";

    ?? document.Myform.oSelect.add(oOption);

    </script>

    <html>

    -----------------------------------------------------------------------

    <Div id="oDiv">Text</Div>

    document.all.oDiv????????????????????? ?// 引用圖層oDiv

    document.all.oDiv.style????????????????

    document.all.oDiv.style.display=""????? // 圖層設(shè)置為可視

    document.all.oDiv.style.display="none"? // 圖層設(shè)置為隱藏

    /*document.all 表示document中所有對(duì)象的集合

    只有ie支持此屬性,因此也用來判斷瀏覽器的種類*/

    -----------------------------------------------------------------------

    posted @ 2006-04-10 14:07 rodney 閱讀(7498) | 評(píng)論 (1)編輯 收藏
     
    我寫了一個(gè)測(cè)試oracle8.1的連接程序。用thin的方式連接。URL:jdbc:oracle:thin:@127.0.0.1:1521:orc;這個(gè)URL是正確的。我在thin與@中間少寫一個(gè)冒號(hào)。這是一個(gè)很低級(jí)的錯(cuò)誤,以后要小心呀。
    posted @ 2006-04-05 12:02 rodney 閱讀(378) | 評(píng)論 (0)編輯 收藏
     
    如果下面的連接有出現(xiàn)class沒有找到的異常,有可能是沒有加裁到驅(qū)動(dòng)程序,還有一種是驅(qū)動(dòng)不對(duì)。
    1、Oracle8/8i/9i數(shù)據(jù)庫(kù)(thin模式)
    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
    String url="jdbc:oracle:thin:@localhost:1521:rcl"; //orcl為數(shù)據(jù)庫(kù)的SID
    String user="test";
    String password="test";
    Connection conn= DriverManager.getConnection(url,user,password);

    2、DB2數(shù)據(jù)庫(kù)

    Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
    String url="jdbc:db2://localhost:5000/sample"; //sample為你的數(shù)據(jù)庫(kù)名
    String user="admin";
    String password="";
    Connection conn= DriverManager.getConnection(url,user,password);

    3、Sql Server7.0/2000數(shù)據(jù)庫(kù)

    Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
    String url="jdbc:microsoft:sqlserver://lin56:1433;DatabaseName=pubs";
    //mydb為數(shù)據(jù)庫(kù)
    String user="sa";
    String password="";
    Connection conn= DriverManager.getConnection(url,user,password);

    4、Sybase數(shù)據(jù)庫(kù)

    Class.forName("com.sybase.jdbc.SybDriver").newInstance();
    String url =" jdbcybase:Tds:localhost:5007/myDB";//myDB為你的數(shù)據(jù)庫(kù)名
    Properties sysProps = System.getProperties();
    SysProps.put("user","userid");
    SysProps.put("password","user_password");
    Connection conn= DriverManager.getConnection(url, SysProps);
    5、Informix數(shù)據(jù)庫(kù)


    Class.forName("com.informix.jdbc.IfxDriver").newInstance();
    String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;
    user=testuser;password=testpassword"; //myDB為數(shù)據(jù)庫(kù)名
    Connection conn= DriverManager.getConnection(url);

    6、MySQL數(shù)據(jù)庫(kù)

    Class.forName("org.gjt.mm.mysql.Driver").newInstance();
    String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
    //myDB為數(shù)據(jù)庫(kù)名
    Connection conn= DriverManager.getConnection(url);

    7、PostgreSQL數(shù)據(jù)庫(kù)

    Class.forName("org.postgresql.Driver").newInstance();
    String url ="jdbcostgresql://localhost/myDB" //myDB為數(shù)據(jù)庫(kù)名
    String user="myuser";
    String password="mypassword";
    Connection conn= DriverManager.getConnection(url,user,password);

    8、access數(shù)據(jù)庫(kù)直連用ODBC的
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;
    String url="jdbcdbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");
    Connection conn = DriverManager.getConnection(url,"","");
    Statement stmtNew=conn.createStatement() ;

    二、JDBC連接MySql方式
      下面是使用JDBC連接MySql的一個(gè)小的教程

    1、查找驅(qū)動(dòng)程序
      MySQL目前提供的java驅(qū)動(dòng)程序?yàn)镃onnection/J,可以從MySQL官方網(wǎng)站下載,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驅(qū)動(dòng)程序?yàn)榧僯ava驅(qū)動(dòng)程序,不需做其他配置。

    2、動(dòng)態(tài)指定classpath
      如果需要執(zhí)行時(shí)動(dòng)態(tài)指定classpath,就在執(zhí)行時(shí)采用-cp方式。否則將上面的.jar文件加入到classpath環(huán)境變量中。

    3、加載驅(qū)動(dòng)程序

    try{
     Class.forName(com.mysql.jdbc.Driver);
     System.out.println(Success loading Mysql Driver!);
    }catch(Exception e)
    {
     System.out.println(Error loading Mysql Driver!);
     e.printStackTrace();
    }
    


    4、設(shè)置連接的url
    jdbc:mysql://localhost/databasename[?pa=va][&pa=va]

    三、以下列出了在使用JDBC來連接Oracle數(shù)據(jù)庫(kù)時(shí)可以使用的一些技巧
    1、在客戶端軟件開發(fā)中使用Thin驅(qū)動(dòng)程序
      在開發(fā)Java軟件方面,Oracle的數(shù)據(jù)庫(kù)提供了四種類型的驅(qū)動(dòng)程序,二種用于應(yīng)用軟件、applets、servlets等客戶端軟件,另外二種用于數(shù)據(jù)庫(kù)中的Java存儲(chǔ)過程等服務(wù)器端軟件。在客戶機(jī)端軟件的開發(fā)中,我們可以選擇OCI驅(qū)動(dòng)程序或Thin驅(qū)動(dòng)程序。OCI驅(qū)動(dòng)程序利用Java本地化接口(JNI),通過Oracle客戶端軟件與數(shù)據(jù)庫(kù)進(jìn)行通訊。Thin驅(qū)動(dòng)程序是純Java驅(qū)動(dòng)程序,它直接與數(shù)據(jù)庫(kù)進(jìn)行通訊。為了獲得最高的性能,Oracle建議在客戶端軟件的開發(fā)中使用OCI驅(qū)動(dòng)程序,這似乎是正確的。但我建議使用Thin驅(qū)動(dòng)程序,因?yàn)橥ㄟ^多次測(cè)試發(fā)現(xiàn),在通常情況下, Thin驅(qū)動(dòng)程序的性能都超過了OCI驅(qū)動(dòng)程序。

    2、關(guān)閉自動(dòng)提交功能,提高系統(tǒng)性能
       在第一次建立與數(shù)據(jù)庫(kù)的連接時(shí),在缺省情況下,連接是在自動(dòng)提交模式下的。為了獲得更好的性能,可以通過調(diào)用帶布爾值false參數(shù)的Connection類的setAutoCommit()方法關(guān)閉自動(dòng)提交功能,如下所示:

    conn.setAutoCommit(false);

      值得注意的是,一旦關(guān)閉了自動(dòng)提交功能,我們就需要通過調(diào)用Connection類的commit()和rollback()方法來人工的方式對(duì)事務(wù)進(jìn)行管理。

    3、在動(dòng)態(tài)SQL或有時(shí)間限制的命令中使用Statement對(duì)象
      在執(zhí)行SQL命令時(shí),我們有二種選擇:可以使用PreparedStatement對(duì)象,也可以使用Statement對(duì)象。無論多少次地使用同一個(gè) SQL命令,PreparedStatement都只對(duì)它解析和編譯一次。當(dāng)使用Statement對(duì)象時(shí),每次執(zhí)行一個(gè)SQL命令時(shí),都會(huì)對(duì)它進(jìn)行解析和編譯。這可能會(huì)使你認(rèn)為,使用PreparedStatement對(duì)象比使用Statement對(duì)象的速度更快。然而,我進(jìn)行的測(cè)試表明,在客戶端軟件中,情況并非如此。因此,在有時(shí)間限制的SQL操作中,除非成批地處理SQL命令,我們應(yīng)當(dāng)考慮使用Statement對(duì)象。

       此外,使用Statement對(duì)象也使得編寫動(dòng)態(tài)SQL命令更加簡(jiǎn)單,因?yàn)槲覀兛梢詫⒆址B接在一起,建立一個(gè)有效的SQL命令。因此,我認(rèn)為,Statement對(duì)象可以使動(dòng)態(tài)SQL命令的創(chuàng)建和執(zhí)行變得更加簡(jiǎn)單。

    4、利用helper函數(shù)對(duì)動(dòng)態(tài)SQL命令進(jìn)行格式化
      在創(chuàng)建使用Statement對(duì)象執(zhí)行的動(dòng)態(tài)SQL命令時(shí),我們需要處理一些格式化方面的問題。例如,如果我們想創(chuàng)建一個(gè)將名字O'Reilly插入表中的SQL命令,則必須使用二個(gè)相連的“''”號(hào)替換O'Reilly中的“'”號(hào)。完成這些工作的最好的方法是創(chuàng)建一個(gè)完成替換操作的helper方法,然后在連接字符串心服用公式表達(dá)一個(gè)SQL命令時(shí),使用創(chuàng)建的helper方法。與此類似的是,我們可以讓helper方法接受一個(gè)Date型的值,然后讓它輸出基于Oracle的to_date()函數(shù)的字符串表達(dá)式。

    5、利用PreparedStatement對(duì)象提高數(shù)據(jù)庫(kù)的總體效率
      在使用PreparedStatement對(duì)象執(zhí)行SQL命令時(shí),命令被數(shù)據(jù)庫(kù)進(jìn)行解析和編譯,然后被放到命令緩沖區(qū)。然后,每當(dāng)執(zhí)行同一個(gè) PreparedStatement對(duì)象時(shí),它就會(huì)被再解析一次,但不會(huì)被再次編譯。在緩沖區(qū)中可以發(fā)現(xiàn)預(yù)編譯的命令,并且可以重新使用。在有大量用戶的企業(yè)級(jí)應(yīng)用軟件中,經(jīng)常會(huì)重復(fù)執(zhí)行相同的SQL命令,使用PreparedStatement對(duì)象帶來的編譯次數(shù)的減少能夠提高數(shù)據(jù)庫(kù)的總體性能。如果不是在客戶端創(chuàng)建、預(yù)備、執(zhí)行PreparedStatement任務(wù)需要的時(shí)間長(zhǎng)于Statement任務(wù),我會(huì)建議在除動(dòng)態(tài)SQL命令之外的所有情況下使用PreparedStatement對(duì)象。

    6、在成批處理重復(fù)的插入或更新操作中使用PreparedStatement對(duì)象
      如果成批地處理插入和更新操作,就能夠顯著地減少它們所需要的時(shí)間。Oracle提供的Statement和 CallableStatement并不真正地支持批處理,只有PreparedStatement對(duì)象才真正地支持批處理。我們可以使用 addBatch()和executeBatch()方法選擇標(biāo)準(zhǔn)的JDBC批處理,或者通過利用PreparedStatement對(duì)象的 setExecuteBatch()方法和標(biāo)準(zhǔn)的executeUpdate()方法選擇速度更快的Oracle專有的方法。要使用Oracle專有的批處理機(jī)制,可以以如下所示的方式調(diào)用setExecuteBatch():

    PreparedStatement pstmt3D null;
    try {
     ((OraclePreparedStatement)pstmt).setExecuteBatch(30);
     ...
     pstmt.executeUpdate();
    }
        調(diào)用setExecuteBatch()時(shí)指定的值是一個(gè)上限,當(dāng)達(dá)到該值時(shí),就會(huì)自動(dòng)地引發(fā)SQL命令執(zhí)行,標(biāo)準(zhǔn)的executeUpdate()方法就會(huì)被作為批處理送到數(shù)據(jù)庫(kù)中。我們可以通過調(diào)用PreparedStatement類的sendBatch()方法隨時(shí)傳輸批處理任務(wù)。
     
    7、使用Oracle locator方法插入、更新大對(duì)象(LOB)
      Oracle的PreparedStatement類不完全支持BLOB和CLOB等大對(duì)象的處理,尤其是Thin驅(qū)動(dòng)程序不支持利用 PreparedStatement對(duì)象的setObject()和setBinaryStream()方法設(shè)置BLOB的值,也不支持利用 setCharacterStream()方法設(shè)置CLOB的值。只有l(wèi)ocator本身中的方法才能夠從數(shù)據(jù)庫(kù)中獲取LOB類型的值。可以使用 PreparedStatement對(duì)象插入或更新LOB,但需要使用locator才能獲取LOB的值。由于存在這二個(gè)問題,因此,我建議使用 locator的方法來插入、更新或獲取LOB的值。

    8、使用SQL92語法調(diào)用存儲(chǔ)過程
      在調(diào)用存儲(chǔ)過程時(shí),我們可以使用SQL92或Oracle PL/SQL,由于使用Oracle PL/SQL并沒有什么實(shí)際的好處,而且會(huì)給以后維護(hù)你的應(yīng)用程序的開發(fā)人員帶來麻煩,因此,我建議在調(diào)用存儲(chǔ)過程時(shí)使用SQL92。

    9、使用Object SQL將對(duì)象模式轉(zhuǎn)移到數(shù)據(jù)庫(kù)中
      既然可以將Oracle的數(shù)據(jù)庫(kù)作為一種面向?qū)ο蟮臄?shù)據(jù)庫(kù)來使用,就可以考慮將應(yīng)用程序中的面向?qū)ο竽J睫D(zhuǎn)到數(shù)據(jù)庫(kù)中。目前的方法是創(chuàng)建Java bean作為偽裝的數(shù)據(jù)庫(kù)對(duì)象,將它們的屬性映射到關(guān)系表中,然后在這些bean中添加方法。盡管這樣作在Java中沒有什么問題,但由于操作都是在數(shù)據(jù)庫(kù)之外進(jìn)行的,因此其他訪問數(shù)據(jù)庫(kù)的應(yīng)用軟件無法利用對(duì)象模式。如果利用Oracle的面向?qū)ο蟮募夹g(shù),可以通過創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)對(duì)象類型在數(shù)據(jù)庫(kù)中模仿其數(shù)據(jù)和操作,然后使用JPublisher等工具生成自己的Java bean類。如果使用這種方式,不但Java應(yīng)用程序可以使用應(yīng)用軟件的對(duì)象模式,其他需要共享你的應(yīng)用中的數(shù)據(jù)和操作的應(yīng)用軟件也可以使用應(yīng)用軟件中的對(duì)象模式。

    10、利用SQL完成數(shù)據(jù)庫(kù)內(nèi)的操作
      我要向大家介紹的最重要的經(jīng)驗(yàn)是充分利用SQL的面向集合的方法來解決數(shù)據(jù)庫(kù)處理需求,而不是使用Java等過程化的編程語言。

      如果編程人員要在一個(gè)表中查找許多行,結(jié)果中的每個(gè)行都會(huì)查找其他表中的數(shù)據(jù),最后,編程人員創(chuàng)建了獨(dú)立的UPDATE命令來成批地更新第一個(gè)表中的數(shù)據(jù)。與此類似的任務(wù)可以通過在set子句中使用多列子查詢而在一個(gè)UPDATE命令中完成。當(dāng)能夠在單一的SQL命令中完成任務(wù),何必要讓數(shù)據(jù)在網(wǎng)上流來流去的?我建議用戶認(rèn)真學(xué)習(xí)如何最大限度地發(fā)揮SQL的功能。

      ?

    ORACLE 數(shù)據(jù)庫(kù)備份技術(shù)
      ORACLE數(shù)據(jù)庫(kù)是一種大型關(guān)系型的數(shù)據(jù)庫(kù),可以存貯達(dá)到存貯TB的數(shù)據(jù),那么如何保證這些數(shù)據(jù)的安全尤其至關(guān)重要,我們從1991年開始使用 ORACLE數(shù)據(jù)庫(kù),通過這些年的使用,我們制定了一整套的ORACLE數(shù)據(jù)庫(kù)的備份制度。現(xiàn)在把我們的備份制度介紹給大家,供大家參考。

    1.根據(jù)實(shí)際需要決定數(shù)據(jù)庫(kù)的運(yùn)行方式
    ORACLE數(shù)據(jù)庫(kù)有兩種運(yùn)行方式:一是歸檔方式(ARCHIVELOG),歸檔方式的目的是當(dāng)數(shù)據(jù)庫(kù)發(fā)生故障時(shí)最大限度恢復(fù)所有已提交的事物;二是不歸檔方式(NOARCHIVELOG),恢復(fù)數(shù)據(jù)庫(kù)到最近的回收點(diǎn)。我們根據(jù)數(shù)據(jù)庫(kù)的高可用性和用戶可承受丟失的工作量的多少,把我們正式運(yùn)行的數(shù)據(jù)庫(kù)采用為歸檔方式;那些正在開發(fā)和調(diào)試的數(shù)據(jù)庫(kù)采用不歸檔方式。

    2如何改變數(shù)據(jù)庫(kù)的運(yùn)行方式
    2.1在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)設(shè)置數(shù)據(jù)庫(kù)的運(yùn)行的方式
      在創(chuàng)建數(shù)據(jù)庫(kù)時(shí),作為創(chuàng)建數(shù)據(jù)庫(kù)的一部分,就決定了數(shù)據(jù)庫(kù)初始的存檔方式。一般情況下為NOARCHIVELOG方式。當(dāng)數(shù)據(jù)庫(kù)創(chuàng)建好以后,根據(jù)我們的需要把需要運(yùn)行在歸檔方式的數(shù)據(jù)庫(kù)改成ARCHIVELOG方式。
      
    2.2改變不歸檔方式為為歸檔方式
      關(guān)閉數(shù)據(jù)庫(kù),備份已有的數(shù)據(jù)
      改變數(shù)據(jù)庫(kù)的運(yùn)行方式是對(duì)數(shù)據(jù)庫(kù)的重要改動(dòng),所以要對(duì)數(shù)據(jù)庫(kù)做備份,對(duì)可能出現(xiàn)的問題作出保護(hù)。
      啟動(dòng)Instance ,Mount數(shù)據(jù)庫(kù)但不打開數(shù)據(jù)庫(kù),來改變歸檔方式

      sqldba lmode=y(svrmgrl)
      sqldba>connect internal
      sqldba>startup mount
      sqldba>alter database archivelog;

      使能自動(dòng)存檔
      在初始化文件init*.ora(一般放ORACLE根目錄的下層目錄dbs下)加參數(shù):
      log_archive_start=true
      指定存檔的重做登錄文件名和存放的位置
      同樣是在初始化文件init*.ora中加入下面的參數(shù):
      log_archive_format=%S.arc
      log_archive_dest=/arch12/arch (arch12 是日志文件存放的目錄)
      關(guān)閉數(shù)據(jù)庫(kù),重新啟動(dòng)數(shù)據(jù)庫(kù),歸檔方式轉(zhuǎn)換完成。

    3回收制度
    3.1根據(jù)數(shù)據(jù)庫(kù)的運(yùn)行方式和可承受丟失的工作量來決定數(shù)據(jù)庫(kù)的回收制度對(duì)于不歸檔方式,我們用的是ORACLE數(shù)據(jù)庫(kù)的邏輯備份Export ,回收的制度是:一個(gè)月作一次全備份(x01.dmp),一周作一次累積備份(c*.dmp),一天一次增量備份(I*.dmp),具體的是星期一到星期五作增量備份,星期六做累積備份或全備份,每次做完備份后自動(dòng)傳到其它的機(jī)器上存儲(chǔ)。這些備份都是自動(dòng)執(zhí)行的,后面給出程序文本。

      對(duì)于歸檔方式,我們用的是ORCALE的物理備份:當(dāng)數(shù)據(jù)庫(kù)創(chuàng)建好以后,做一次物理上的全備份,平時(shí)在不關(guān)閉數(shù)據(jù)庫(kù)的前提下,一個(gè)星期對(duì)經(jīng)常改變的數(shù)據(jù)文件做聯(lián)機(jī)的數(shù)據(jù)庫(kù)數(shù)據(jù)文件的物理備份;當(dāng)數(shù)據(jù)庫(kù)的結(jié)構(gòu)發(fā)生改變,如:增加表空間,加數(shù)據(jù)文件等,如允許關(guān)機(jī),正常關(guān)閉數(shù)據(jù)庫(kù),重新做數(shù)據(jù)庫(kù)全備份,否則,備份控制文件,備份數(shù)據(jù)文件照常。聯(lián)機(jī)的日志文件我們是寫在陣列上的,不用鏡象和備份。

    3.2回收的方法
    3.2.1不歸檔方式
       我們拿曙光AIX操作系統(tǒng)為例,來講解以下如何做自動(dòng)備份:
    ---- a.首先建UNIX用戶 demo/demo
    ---- b.拷貝oracle用戶下的 .profile 到 demo 用戶下,以保證 demo 用戶可以用 Export命令
    ---- c.用root用戶登錄,編輯 /var/adm/cron/cron.allow 加入用戶名demo,這樣demo用戶就有權(quán)自動(dòng)執(zhí)行數(shù)據(jù)庫(kù)備份的shell程序;
    ---- d.創(chuàng)建數(shù)據(jù)庫(kù)備份程序,放到本用戶的下層目錄bin下,并且這些文件要有可執(zhí)行權(quán)文件zlbf1:(增量備份1,星期一執(zhí)行的程序)

    . /u11/demo/.profile 
    exp system/manager inctype=INCREMENTAL file=i01.dmp 
    ftp -n< < ! 
    open 10.10.10.40 
    user demo demo 
    binary 
    prompt 
    cd backup40 
    put i01.dmp 
    close 
    bye 
    ! 
    
    文件zlbf2:(增量備份2, 星期二執(zhí)行的程序) 
    
    . /u11/demo/.profile 
    exp system/manager inctype=INCREMENTAL file=i02.dmp 
    ftp -n< < ! 
    
    open 10.10.10.40 
    user demo demo 
    binary 
    prompt 
    cd backup40 
    put i02.dmp 
    close 
    bye 
    ! 
    
    文件zlbf3:(增量備份3, 星期三執(zhí)行的程序) 
    . /u11/demo/.profile 
    exp system/manager inctype=INCREMENTAL file=i03.dmp 
    ftp -n< < ! 
    open 10.10.10.40 
    user demo demo 
    binary 
    prompt 
    cd backup40 
    put i03.dmp 
    close 
    bye 
    ! 
    文件zlbf4:(增量備份4, 星期四執(zhí)行的程序) 
    . /u11/demo/.profile 
    exp system/manager inctype=INCREMENTAL file=i04.dmp 
    ftp -n< < ! 
    open 10.10.10.40 
    user demo demo 
    binary 
    prompt 
    cd backup40 
    put i04.dmp 
    close 
    bye 
    ! 
    文件zlbf5:(增量備份5, 星期五執(zhí)行的程序) 
    . /u11/demo/.profile 
    exp system/manager inctype=INCREMENTAL file=i05.dmp 
    ftp -n< < ! 
    open 10.10.10.40 
    user demo demo 
    binary 
    prompt 
    cd backup40 
    put i05.dmp 
    close 
    bye 
    ! 
    文件zlbf6:(增量備份6, 星期六執(zhí)行的程序) 
    . /u11/demo/.profile 
    js=`ls c*.dmp|wc -l` 
    if test  = 0 
    then 
    exp system/manager inctype=CUMULATIVE file=c01.dmp 
    ftp -n< < ! 
    open 10.10.10.40 
    user demo demo 
    binary 
    prompt 
    cd backup40 
    put c01.dmp 
    close 
    bye 
    ! 
    fi 
    if test  = 1 
    then 
    exp system/manger inctype=CUMULATIVE file=c02.dmp 
    ftp -n< < ! 
    open 10.10.10.40 
    user demo demo 
    binary 
    prompt 
    cd backup40 
    put c02.dmp 
    close 
    bye 
    ! 
    fi 
    if test  = 2 
    then 
    exp system/maneger inctype=CUMULATIVE file=c03.dmp 
    ftp -n< < ! 
    open 10.10.10.40 
    user demo demo 
    binary 
    prompt 
    cd backup40 
    put c03.dmp 
    close 
    bye 
    ! 
    fi 
    if test  = 3 
    then 
    exp system/manager inctype=COMPLETE file=x01.dmp 
    ftp -n< < ! 
    open 10.10.10.40 
    user demo demo 
    binary 
    prompt 
    cd backup40 
    put x01.dmp 
    close 
    bye 
    ! 
    rm c*.dmp 
    fi 
    
    ---- e.在demo 用戶下建一個(gè)文件,假如叫:cron.demo,文件內(nèi)容如下 
    59 22 * * 1 bin/zlbf1 
    59 22 * * 2 bin/zlbf2 
    59 22 * * 3 bin/zlbf3 
    59 22 * * 4 bin/zlbf4 
    59 22 * * 5 bin/zlbf5 
    59 22 * * 6 bin/zlbf6 
    

    ---- f.在demo用戶下執(zhí)行下面的命令:
    crontab cron.demo 執(zhí)行的結(jié)果放到
    /var/spool/cron/crontabs/demo文件里

    ---- g.重新啟動(dòng)cron 進(jìn)程,命令:kill -1 進(jìn)程號(hào)
    ---- h.執(zhí)行結(jié)果放在本用戶的郵件里
    ---- i.查看結(jié)果是否執(zhí)行,請(qǐng)看:/var/adm/cron/log文件

    3.2.2歸檔方式
    ---- a. 找到要回收的數(shù)據(jù)文件、聯(lián)機(jī)重做登錄文件、控制文件和參數(shù)文件
    ---- b. 正常關(guān)閉數(shù)據(jù)庫(kù),作一次全回收(用操作系統(tǒng)的TAR命令,可以寫成shell程序),然后打開數(shù)據(jù)庫(kù)供正常使用,shell程序如下:
    tar cvf /dev/rmt/ctape2 /u1/oracle/dbs/ctrl1ora7.ctl
    /u1/oracle/dbs/ctrl2ora7.ctl
    /u1/oracle/dbs/ctrl3ora7.ctl
    /u1/oracle/dbs/systora7.dbf
    /u1/oracle/dbs/rbsora7.dbf
    /u1/oracle/dbs/tempora7.dbf
    /u1/oracle/dbs/toolora7.dbf
    /u1/oracle/dbs/usrora7.dbf
    /ls1/ls1.dbf
    /u1/oracle/dbs/log1ora7.dbf
    /u1/oracle/dbs/log2ora7.dbf
    /u1/oracle/dbs/log3ora7.dbf
    ---- c. 經(jīng)常作聯(lián)機(jī)的表空間和數(shù)據(jù)文件的部分回收
    首先標(biāo)記聯(lián)機(jī)表空間回收的開始
    alter tablespace 表空間名 begin backup;
    用操作系統(tǒng)命令備份數(shù)據(jù)文件
    最后標(biāo)記聯(lián)機(jī)的表空間回收結(jié)束
    alter tablespace 表空間名 end backup
    ---- 多個(gè)表空間可以一起做標(biāo)記,備份做標(biāo)記的所有數(shù)據(jù)文件后,一起標(biāo)記結(jié)束。
    ---- d. 當(dāng)數(shù)據(jù)庫(kù)結(jié)構(gòu)發(fā)生改變后,要對(duì)它的控制文件做回收
    sqldba >alter database backup
    controlfile to ’文件名’ reuse;  ?

    數(shù)據(jù)庫(kù)設(shè)計(jì)中的14個(gè)技巧
    1. 原始單據(jù)與實(shí)體之間的關(guān)系
      可以是一對(duì)一、一對(duì)多、多對(duì)多的關(guān)系。在一般情況下,它們是一對(duì)一的關(guān)系:即一張?jiān)紗螕?jù)對(duì)應(yīng)且只對(duì)應(yīng)一個(gè)實(shí)體。在特殊情況下,它們可能是一對(duì)多或多對(duì)一的關(guān)系,即一張?jiān)紗巫C對(duì)應(yīng)多個(gè)實(shí)體,或多張?jiān)紗巫C對(duì)應(yīng)一個(gè)實(shí)體。這里的實(shí)體可以理解為基本表。明確這種對(duì)應(yīng)關(guān)系后,對(duì)我們?cè)O(shè)計(jì)錄入界面大有好處。
      〖例1〗:一份員工履歷資料,在人力資源信息系統(tǒng)中,就對(duì)應(yīng)三個(gè)基本表:?jiǎn)T工基本情況表、社會(huì)關(guān)系表、工作簡(jiǎn)歷表。這就是“一張?jiān)紗巫C對(duì)應(yīng)多個(gè)實(shí)體”的典型例子。

    2. 主鍵與外鍵
      一般而言,一個(gè)實(shí)體不能既無主鍵又無外鍵。在E—R 圖中, 處于葉子部位的實(shí)體, 可以定義主鍵,也可以不定義主鍵(因?yàn)樗鼰o子孫), 但必須要有外鍵(因?yàn)樗懈赣H)。
      主鍵與外鍵的設(shè)計(jì),在全局?jǐn)?shù)據(jù)庫(kù)的設(shè)計(jì)中,占有重要地位。當(dāng)全局?jǐn)?shù)據(jù)庫(kù)的設(shè)計(jì)完成以后,有個(gè)美國(guó)數(shù)據(jù)庫(kù)設(shè)計(jì)專家說:“鍵,到處都是鍵,除了鍵之外,什么也沒有”,這就是他的數(shù)據(jù)庫(kù)設(shè)計(jì)經(jīng)驗(yàn)之談,也反映了他對(duì)信息系統(tǒng)核心(數(shù)據(jù)模型)的高度抽象思想。因?yàn)椋褐麈I是實(shí)體的高度抽象,主鍵與外鍵的配對(duì),表示實(shí)體之間的連接。

    3. 基本表的性質(zhì)
      基本表與中間表、臨時(shí)表不同,因?yàn)樗哂腥缦滤膫€(gè)特性:
      (1) 原子性。基本表中的字段是不可再分解的。
      (2) 原始性。基本表中的記錄是原始數(shù)據(jù)(基礎(chǔ)數(shù)據(jù))的記錄。
      (3) 演繹性。由基本表與代碼表中的數(shù)據(jù),可以派生出所有的輸出數(shù)據(jù)。
      (4) 穩(wěn)定性。基本表的結(jié)構(gòu)是相對(duì)穩(wěn)定的,表中的記錄是要長(zhǎng)期保存的。
       理解基本表的性質(zhì)后,在設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí),就能將基本表與中間表、臨時(shí)表區(qū)分開來。

    4. 范式標(biāo)準(zhǔn)
      基本表及其字段之間的關(guān)系, 應(yīng)盡量滿足第三范式。但是,滿足第三范式的數(shù)據(jù)庫(kù)設(shè)計(jì),往往不是最好的設(shè)計(jì)。為了提高數(shù)據(jù)庫(kù)的運(yùn)行效率,常常需要降低范式標(biāo)準(zhǔn):適當(dāng)增加冗余,達(dá)到以空間換時(shí)間的目的。
      〖例2〗:有一張存放商品的基本表,如表1所示。“金額”這個(gè)字段的存在,表明該表的設(shè)計(jì)不滿足第三范式,因?yàn)椤敖痤~”可以由“單價(jià)”乘以“數(shù)量”得到,說明“金額”是冗余字段。但是,增加“金額”這個(gè)冗余字段,可以提高查詢統(tǒng)計(jì)的速度,這就是以空間換時(shí)間的作法。
      在Rose 2002中,規(guī)定列有兩種類型:數(shù)據(jù)列和計(jì)算列。“金額”這樣的列被稱為“計(jì)算列”,而“單價(jià)”和“數(shù)量”這樣的列被稱為“數(shù)據(jù)列”。
      表1 商品表的表結(jié)構(gòu)
      商品名稱商品型號(hào)單價(jià)數(shù)量金額
      電視機(jī) 29吋 2,500 40 100,000

    5. 通俗地理解三個(gè)范式
      通俗地理解三個(gè)范式,對(duì)于數(shù)據(jù)庫(kù)設(shè)計(jì)大有好處。在數(shù)據(jù)庫(kù)設(shè)計(jì)中,為了更好地應(yīng)用三個(gè)范式,就必須通俗地理解三個(gè)范式(通俗地理解是夠用的理解,并不是最科學(xué)最準(zhǔn)確的理解):
      第一范式:1NF是對(duì)屬性的原子性約束,要求屬性具有原子性,不可再分解;
      第二范式:2NF是對(duì)記錄的惟一性約束,要求記錄有惟一標(biāo)識(shí),即實(shí)體的惟一性;
      第三范式:3NF是對(duì)字段冗余性的約束,即任何字段不能由其他字段派生出來,它要求字段沒有冗余。
      沒有冗余的數(shù)據(jù)庫(kù)設(shè)計(jì)可以做到。但是,沒有冗余的數(shù)據(jù)庫(kù)未必是最好的數(shù)據(jù)庫(kù),有時(shí)為了提高運(yùn)行效率,就必須降低范式標(biāo)準(zhǔn),適當(dāng)保留冗余數(shù)據(jù)。具體做法是:在概念數(shù)據(jù)模型設(shè)計(jì)時(shí)遵守第三范式,降低范式標(biāo)準(zhǔn)的工作放到物理數(shù)據(jù)模型設(shè)計(jì)時(shí)考慮。降低范式就是增加字段,允許冗余。

    6. 要善于識(shí)別與正確處理多對(duì)多的關(guān)系
      若兩個(gè)實(shí)體之間存在多對(duì)多的關(guān)系,則應(yīng)消除這種關(guān)系。消除的辦法是,在兩者之間增加第三個(gè)實(shí)體。這樣,原來一個(gè)多對(duì)多的關(guān)系,現(xiàn)在變?yōu)閮蓚€(gè)一對(duì)多的關(guān)系。要將原來兩個(gè)實(shí)體的屬性合理地分配到三個(gè)實(shí)體中去。這里的第三個(gè)實(shí)體,實(shí)質(zhì)上是一個(gè)較復(fù)雜的關(guān)系,它對(duì)應(yīng)一張基本表。一般來講,數(shù)據(jù)庫(kù)設(shè)計(jì)工具不能識(shí)別多對(duì)多的關(guān)系,但能處理多對(duì)多的關(guān)系。
      〖例3〗:在“圖書館信息系統(tǒng)”中,“圖書”是一個(gè)實(shí)體,“讀者”也是一個(gè)實(shí)體。這兩個(gè)實(shí)體之間的關(guān)系,是一個(gè)典型的多對(duì)多關(guān)系:一本圖書在不同時(shí)間可以被多個(gè)讀者借閱,一個(gè)讀者又可以借多本圖書。為此,要在二者之間增加第三個(gè)實(shí)體,該實(shí)體取名為“借還書”,它的屬性為:借還時(shí)間、借還標(biāo)志(0表示借書,1表示還書),另外,它還應(yīng)該有兩個(gè)外鍵(“圖書”的主鍵,“讀者”的主鍵),使它能與“圖書”和 “讀者”連接。

    7. 主鍵PK的取值方法
      PK是供程序員使用的表間連接工具,可以是一無物理意義的數(shù)字串, 由程序自動(dòng)加1來實(shí)現(xiàn)。也可以是有物理意義的字段名或字段名的組合。不過前者比后者好。當(dāng)PK是字段名的組合時(shí),建議字段的個(gè)數(shù)不要太多,多了不但索引占用空間大,而且速度也慢。

    8. 正確認(rèn)識(shí)數(shù)據(jù)冗余
      主鍵與外鍵在多表中的重復(fù)出現(xiàn), 不屬于數(shù)據(jù)冗余,這個(gè)概念必須清楚,事實(shí)上有許多人還不清楚。非鍵字段的重復(fù)出現(xiàn), 才是數(shù)據(jù)冗余!而且是一種低級(jí)冗余,即重復(fù)性的冗余。高級(jí)冗余不是字段的重復(fù)出現(xiàn),而是字段的派生出現(xiàn)。
      〖例4〗:商品中的“單價(jià)、數(shù)量、金額”三個(gè)字段,“金額”就是由“單價(jià)”乘以“數(shù)量”派生出來的,它就是冗余,而且是一種高級(jí)冗余。冗余的目的是為了提高處理速度。只有低級(jí)冗余才會(huì)增加數(shù)據(jù)的不一致性,因?yàn)橥粩?shù)據(jù),可能從不同時(shí)間、地點(diǎn)、角色上多次錄入。因此,我們提倡高級(jí)冗余(派生性冗余),反對(duì)低級(jí)冗余(重復(fù)性冗余)。

    9. E--R圖沒有標(biāo)準(zhǔn)答案
      信息系統(tǒng)的E--R圖沒有標(biāo)準(zhǔn)答案,因?yàn)樗脑O(shè)計(jì)與畫法不是惟一的,只要它覆蓋了系統(tǒng)需求的業(yè)務(wù)范圍和功能內(nèi)容,就是可行的。反之要修改E--R圖。盡管它沒有惟一的標(biāo)準(zhǔn)答案,并不意味著可以隨意設(shè)計(jì)。好的E—R圖的標(biāo)準(zhǔn)是:結(jié)構(gòu)清晰、關(guān)聯(lián)簡(jiǎn)潔、實(shí)體個(gè)數(shù)適中、屬性分配合理、沒有低級(jí)冗余。

    10. 視圖技術(shù)在數(shù)據(jù)庫(kù)設(shè)計(jì)中很有用
      與基本表、代碼表、中間表不同,視圖是一種虛表,它依賴數(shù)據(jù)源的實(shí)表而存在。視圖是供程序員使用數(shù)據(jù)庫(kù)的一個(gè)窗口,是基表數(shù)據(jù)綜合的一種形式, 是數(shù)據(jù)處理的一種方法,是用戶數(shù)據(jù)保密的一種手段。為了進(jìn)行復(fù)雜處理、提高運(yùn)算速度和節(jié)省存儲(chǔ)空間, 視圖的定義深度一般不得超過三層。若三層視圖仍不夠用, 則應(yīng)在視圖上定義臨時(shí)表, 在臨時(shí)表上再定義視圖。這樣反復(fù)交迭定義, 視圖的深度就不受限制了。
      對(duì)于某些與國(guó)家政治、經(jīng)濟(jì)、技術(shù)、軍事和安全利益有關(guān)的信息系統(tǒng),視圖的作用更加重要。這些系統(tǒng)的基本表完成物理設(shè)計(jì)之后,立即在基本表上建立第一層視圖,這層視圖的個(gè)數(shù)和結(jié)構(gòu),與基本表的個(gè)數(shù)和結(jié)構(gòu)是完全相同。并且規(guī)定,所有的程序員,一律只準(zhǔn)在視圖上操作。只有數(shù)據(jù)庫(kù)管理員,帶著多個(gè)人員共同掌握的“安全鑰匙”,才能直接在基本表上操作。請(qǐng)讀者想想:這是為什么?

    11. 中間表、報(bào)表和臨時(shí)表
      中間表是存放統(tǒng)計(jì)數(shù)據(jù)的表,它是為數(shù)據(jù)倉(cāng)庫(kù)、輸出報(bào)表或查詢結(jié)果而設(shè)計(jì)的,有時(shí)它沒有主鍵與外鍵(數(shù)據(jù)倉(cāng)庫(kù)除外)。臨時(shí)表是程序員個(gè)人設(shè)計(jì)的,存放臨時(shí)記錄,為個(gè)人所用。基表和中間表由DBA維護(hù),臨時(shí)表由程序員自己用程序自動(dòng)維護(hù)。

    12. 完整性約束表現(xiàn)在三個(gè)方面
      域的完整性:用Check來實(shí)現(xiàn)約束,在數(shù)據(jù)庫(kù)設(shè)計(jì)工具中,對(duì)字段的取值范圍進(jìn)行定義時(shí),有一個(gè)Check按鈕,通過它定義字段的值城。
      參照完整性:用PK、FK、表級(jí)觸發(fā)器來實(shí)現(xiàn)。
      用戶定義完整性:它是一些業(yè)務(wù)規(guī)則,用存儲(chǔ)過程和觸發(fā)器來實(shí)現(xiàn)。

    13. 防止數(shù)據(jù)庫(kù)設(shè)計(jì)打補(bǔ)丁的方法是“三少原則”
      (1) 一個(gè)數(shù)據(jù)庫(kù)中表的個(gè)數(shù)越少越好。只有表的個(gè)數(shù)少了,才能說明系統(tǒng)的E--R圖少而精,去掉了重復(fù)的多余的實(shí)體,形成了對(duì)客觀世界的高度抽象,進(jìn)行了系統(tǒng)的數(shù)據(jù)集成,防止了打補(bǔ)丁式的設(shè)計(jì);
      (2) 一個(gè)表中組合主鍵的字段個(gè)數(shù)越少越好。因?yàn)橹麈I的作用,一是建主鍵索引,二是做為子表的外鍵,所以組合主鍵的字段個(gè)數(shù)少了,不僅節(jié)省了運(yùn)行時(shí)間,而且節(jié)省了索引存儲(chǔ)空間;
      (3) 一個(gè)表中的字段個(gè)數(shù)越少越好。只有字段的個(gè)數(shù)少了,才能說明在系統(tǒng)中不存在數(shù)據(jù)重復(fù),且很少有數(shù)據(jù)冗余,更重要的是督促讀者學(xué)會(huì)“列變行”,這樣就防止了將子表中的字段拉入到主表中去,在主表中留下許多空余的字段。所謂“列變行”,就是將主表中的一部分內(nèi)容拉出去,另外單獨(dú)建一個(gè)子表。這個(gè)方法很簡(jiǎn)單,有的人就是不習(xí)慣、不采納、不執(zhí)行。
      數(shù)據(jù)庫(kù)設(shè)計(jì)的實(shí)用原則是:在數(shù)據(jù)冗余和處理速度之間找到合適的平衡點(diǎn)。“三少”是一個(gè)整體概念,綜合觀點(diǎn),不能孤立某一個(gè)原則。該原則是相對(duì)的,不是絕對(duì)的。“三多”原則肯定是錯(cuò)誤的。試想:若覆蓋系統(tǒng)同樣的功能,一百個(gè)實(shí)體(共一千個(gè)屬性) 的E--R圖,肯定比二百個(gè)實(shí)體(共二千個(gè)屬性) 的E--R圖,要好得多。
      提倡“三少”原則,是叫讀者學(xué)會(huì)利用數(shù)據(jù)庫(kù)設(shè)計(jì)技術(shù)進(jìn)行系統(tǒng)的數(shù)據(jù)集成。數(shù)據(jù)集成的步驟是將文件系統(tǒng)集成為應(yīng)用數(shù)據(jù)庫(kù),將應(yīng)用數(shù)據(jù)庫(kù)集成為主題數(shù)據(jù)庫(kù),將主題數(shù)據(jù)庫(kù)集成為全局綜合數(shù)據(jù)庫(kù)。集成的程度越高,數(shù)據(jù)共享性就越強(qiáng),信息孤島現(xiàn)象就越少,整個(gè)企業(yè)信息系統(tǒng)的全局E—R圖中實(shí)體的個(gè)數(shù)、主鍵的個(gè)數(shù)、屬性的個(gè)數(shù)就會(huì)越少。
      提倡“三少”原則的目的,是防止讀者利用打補(bǔ)丁技術(shù),不斷地對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改,使企業(yè)數(shù)據(jù)庫(kù)變成了隨意設(shè)計(jì)數(shù)據(jù)庫(kù)表的“垃圾堆”,或數(shù)據(jù)庫(kù)表的“大雜院”,最后造成數(shù)據(jù)庫(kù)中的基本表、代碼表、中間表、臨時(shí)表雜亂無章,不計(jì)其數(shù),導(dǎo)致企事業(yè)單位的信息系統(tǒng)無法維護(hù)而癱瘓。
      “三多”原則任何人都可以做到,該原則是“打補(bǔ)丁方法”設(shè)計(jì)數(shù)據(jù)庫(kù)的歪理學(xué)說。“三少”原則是少而精的原則,它要求有較高的數(shù)據(jù)庫(kù)設(shè)計(jì)技巧與藝術(shù),不是任何人都能做到的,因?yàn)樵撛瓌t是杜絕用“打補(bǔ)丁方法”設(shè)計(jì)數(shù)據(jù)庫(kù)的理論依據(jù)。

    14. 提高數(shù)據(jù)庫(kù)運(yùn)行效率的辦法
      在給定的系統(tǒng)硬件和系統(tǒng)軟件條件下,提高數(shù)據(jù)庫(kù)系統(tǒng)的運(yùn)行效率的辦法是:
      (1) 在數(shù)據(jù)庫(kù)物理設(shè)計(jì)時(shí),降低范式,增加冗余, 少用觸發(fā)器, 多用存儲(chǔ)過程。
      (2) 當(dāng)計(jì)算非常復(fù)雜、而且記錄條數(shù)非常巨大時(shí)(例如一千萬條),復(fù)雜計(jì)算要先在數(shù)據(jù)庫(kù)外面,以文件系統(tǒng)方式用C++語言計(jì)算處理完成之后,最后才入庫(kù)追加到表中去。這是電信計(jì)費(fèi)系統(tǒng)設(shè)計(jì)的經(jīng)驗(yàn)。
      (3) 發(fā)現(xiàn)某個(gè)表的記錄太多,例如超過一千萬條,則要對(duì)該表進(jìn)行水平分割。水平分割的做法是,以該表主鍵PK的某個(gè)值為界線,將該表的記錄水平分割為兩個(gè)表。若發(fā)現(xiàn)某個(gè)表的字段太多,例如超過八十個(gè),則垂直分割該表,將原來的一個(gè)表分解為兩個(gè)表。
      (4) 對(duì)數(shù)據(jù)庫(kù)管理系統(tǒng)DBMS進(jìn)行系統(tǒng)優(yōu)化,即優(yōu)化各種系統(tǒng)參數(shù),如緩沖區(qū)個(gè)數(shù)。
      (5) 在使用面向數(shù)據(jù)的SQL語言進(jìn)行程序設(shè)計(jì)時(shí),盡量采取優(yōu)化算法。
       總之,要提高數(shù)據(jù)庫(kù)的運(yùn)行效率,必須從數(shù)據(jù)庫(kù)系統(tǒng)級(jí)優(yōu)化、數(shù)據(jù)庫(kù)設(shè)計(jì)級(jí)優(yōu)化、程序?qū)崿F(xiàn)級(jí)優(yōu)化,這三個(gè)層次上同時(shí)下功夫。
      上述十四個(gè)技巧,是許多人在大量的數(shù)據(jù)庫(kù)分析與設(shè)計(jì)實(shí)踐中,逐步總結(jié)出來的。對(duì)于這些經(jīng)驗(yàn)的運(yùn)用,讀者不能生幫硬套,死記硬背,而要消化理解,實(shí)事求是,靈活掌握。并逐步做到:在應(yīng)用中發(fā)展,在發(fā)展中應(yīng)用。
    特別聲明以上內(nèi)容是轉(zhuǎn)至http://dev2dev.bea.com.cn/bbsdoc/20060112181.html,如果您認(rèn)為該文檔的內(nèi)容侵犯了您的權(quán)益,請(qǐng)與整理者(excelarthur.com.cn)聯(lián)系,與Dev2Dev網(wǎng)站無關(guān)。

    posted @ 2006-04-04 14:36 rodney 閱讀(1367) | 評(píng)論 (0)編輯 收藏
     
    在安裝完了JBuilder9時(shí),打開JB9會(huì)彈出一個(gè)對(duì)話框講你要注冊(cè)。這時(shí)你沒有注冊(cè)號(hào)時(shí),有一個(gè)叫JB9_Ent_KeyGen.exe的文件,這時(shí)你只要將這個(gè)文件copy to 你安裝的目錄下。double click this file,這時(shí)你只要點(diǎn)擊"Generate",再點(diǎn)擊"Save"就OK了。例如:E:\JBuilder9\jdk1.4\bin下放入copy的文件。這個(gè)文件一定要放入jdk1.4\bin下面。
    posted @ 2006-04-03 17:27 rodney 閱讀(1508) | 評(píng)論 (0)編輯 收藏
     
    如果你做過很多java程序,你可能對(duì)java集合類很熟悉,例如Vector和ArrayList。你可以創(chuàng)建一個(gè)集合并向其中增加元素:
    1.     List lst = new ArrayList();
    2.     lst.add(new Integer(37));

    在這個(gè)特殊的范例中,一個(gè)整型值37用于構(gòu)造一個(gè)Integer封裝類對(duì)象,然后那個(gè)對(duì)象被加入到列表。

    這個(gè)簡(jiǎn)單的范例展示集合的一個(gè)基礎(chǔ)-他們用于操縱一列對(duì)象,其中的每個(gè)對(duì)象是一個(gè)類或者接口類型。因此,一個(gè)ArrayList可以包含Object,String,Float以及Runnable類型的對(duì)象。集合類不能用于原始數(shù)據(jù)類型的列表,例如整型數(shù)組。

    如果你在你的程序中使用原始類型的數(shù)組,你如何操縱它們呢?這個(gè)技巧就給你展示幾個(gè)你可以使用的技術(shù)。

    第一個(gè)技術(shù)是排序。java.util.Arrays類包含一套排序和查找數(shù)組的類方法,例如:
    1.     import java.util.Arrays;
    2.     public class ArrayDemo1 {
    3.         public static void main(String args[]) {
    4.             int vec[] = {37, 47, 23, -5, 19, 56};
    5.             Arrays.sort(vec);
    6.             for (int i = 0; i < vec.length; i++) {
    7.                 System.out.println(vec[i]);
    8.             }
    9.         }
    10.     }

    這個(gè)演示程序初始化一個(gè)整數(shù)數(shù)組然后調(diào)用Arrays.sort升序排序那個(gè)數(shù)組。

    類似的,你可以在排完序的數(shù)組上進(jìn)行二分法查找:
    1.     import java.util.Arrays;
    2.     public class ArrayDemo2 {
    3.         public static void main(String args[]) {
    4.             int vec[] = {-5, 19, 23, 37, 47, 56};
    5.             int slot = Arrays.binarySearch(vec, 35);
    6.             slot = -(slot + 1);
    7.             System.out.println("insertion point = " + slot);
    8.         }
    9.     }

    這個(gè)程序有個(gè)微妙的概念,如果二分法查找失敗它將返回:

        -(insertion point) - 1

    這個(gè)演示程序以參數(shù)35調(diào)用查找方法,而那個(gè)參數(shù)在數(shù)組中不存在,方法返回值-4,如果這個(gè)值加一再取其負(fù)數(shù)就得到3,這就是35應(yīng)該被插入到數(shù)組中的位置,換言之,值-5, 19和23在數(shù)組中占據(jù)的位置是0,1和2。因此值35應(yīng)該在索引3的位置,而37, 47以及56順延。搜索方法并不進(jìn)行實(shí)際的插入操作而只是指出應(yīng)該在何處插入。

    除了排序和查找,我們還可以對(duì)原始類型數(shù)組做什么?另一個(gè)有用的技術(shù)是將一個(gè)原始數(shù)組轉(zhuǎn)換為等價(jià)的對(duì)象類型數(shù)組。每個(gè)對(duì)應(yīng)元素使用它們的封裝器類,例如在封裝數(shù)組中,37成為Integer(37)。
    1.     import java.util.Arrays;
    2.     import java.lang.reflect.Array;
    3.     
    4.     public class ArrayDemo3 {
    5.     
    6.         // if input is a single-dimension primitive array,
    7.         // return a new array consisting of wrapped elements,
    8.         // else just return input argument
    9.     
    10.         public static Object toArray(Object vec) {
    11.     
    12.             // if null, return
    13.     
    14.             if (vec == null) {
    15.                 return vec;
    16.             }
    17.     
    18.             // if not an array or elements not primitive, return
    19.     
    20.             Class cls = vec.getClass();
    21.             if (!cls.isArray()) {
    22.                 return vec;
    23.             }
    24.             if (!cls.getComponentType().isPrimitive()) {
    25.                 return vec;
    26.             }
    27.     
    28.             // get array length and create Object output array
    29.     
    30.             int length = Array.getLength(vec);
    31.             Object newvec[] = new Object[length];
    32.     
    33.             // wrap and copy elements
    34.     
    35.             for (int i = 0; i < length; i++) {
    36.                 newvec[i] = Array.get(vec, i);
    37.             }
    38.     
    39.             return newvec;
    40.         }
    41.     
    42.         public static void main(String args[]) {
    43.     
    44.             // create a primitive array
    45.     
    46.             int vec[] = new int[]{1, 2, 3};
    47.     
    48.             // wrap it
    49.     
    50.             Object wrappedvec[] = (Object[])toArray(vec);
    51.     
    52.             // display result
    53.     
    54.             for (int i = 0; i < wrappedvec.length; i++) {
    55.                 System.out.println(wrappedvec[i]);
    56.             }
    57.         }
    58.     }

    方法"toArray"的參數(shù)是一個(gè)Object對(duì)象(數(shù)組可以被賦值給一個(gè)Object引用)。如果參數(shù)是null或者代表的不是原始類型數(shù)組那么這個(gè)方法簡(jiǎn)單的返回參數(shù)值。java.lang.Class工具類用于判斷參數(shù)是否是一個(gè)數(shù)組并獲取數(shù)組的底層元素的類型。

    一旦做完這些檢查,使用java.lang.reflect.Array工具類的反射工具方法就可以獲取原始數(shù)組的長(zhǎng)度并獲得數(shù)組的單個(gè)元素。Array.get獲得的每個(gè)元素被返回到封裝器類中,例如Integer或者Double。

    最終的范例基于前面的那個(gè)并向你展示如何在數(shù)組上使用集合特性。這假設(shè)你已經(jīng)有一個(gè)對(duì)象數(shù)組。
    1.     import java.util.Arrays;
    2.     import java.util.List;
    3.     public class ArrayDemo4 {
    4.         public static void main(String args[]) {
    5.             Object vec[] = {new Integer(37), new Integer(47)};
    6.             List lst = Arrays.asList(vec);
    7.             lst.set(1, new Integer(57));
    8.             for (int i = 0; i < vec.length; i++) {
    9.                 System.out.println(vec[i]);
    10.             }
    11.         }
    12.     }

    在這個(gè)程序中,vec是一個(gè)對(duì)象數(shù)組,包含Integer(37)和Integer(47),然后Arrays.asList被調(diào)用。它返回一個(gè)集合(List接口類型),使用數(shù)組作為集合的后臺(tái)存儲(chǔ)。換言之,ArrayList這樣的集合類型在它內(nèi)部有某種存儲(chǔ)類型去存儲(chǔ)集合元素。在這個(gè)例子中,使用的存儲(chǔ)類型是作為參數(shù)傳遞到Arrays.asList的數(shù)組。這意味著集合方法所做的改變會(huì)被反射到底層的數(shù)組。

    修改集合中的元素1導(dǎo)致底層的數(shù)組也改變,程序的輸出是:

        37
        57

    因此如果你有一個(gè)對(duì)象數(shù)組,你可以在它上面使用集合特性,數(shù)組自身作為底層存儲(chǔ)。

    我們也可以將集合轉(zhuǎn)換為一個(gè)對(duì)象數(shù)組,例如:

        Object vec[] = lst.toArray();

    package com.cucu.test;

    /**
    * @author http://www.linewell.com <a href=mailto:cg@linewell.com>cg@linewell.com</a>
    * @version 1.0
    */
    public class Sort {

    public void swap(int a[], int i, int j) {
    int tmp = a;
    a = a[j];
    a[j] = tmp;
    }

    public int partition(int a[], int low, int high) {
    int pivot, p_pos, i;
    p_pos = low;
    pivot = a[p_pos];
    for (i = low + 1; i <= high; i++) {
    if (a > pivot) {
    p_pos++;
    swap(a, p_pos, i);
    }
    }
    swap(a, low, p_pos);
    return p_pos;
    }

    public void quicksort(int a[], int low, int high) {
    int pivot;
    if (low < high) {
    pivot = partition(a, low, high);
    quicksort(a, low, pivot - 1);
    quicksort(a, pivot + 1, high);
    }

    }

    public static void main(String args[]) {
    int vec[] = new int[] { 37, 47, 23, -5, 19, 56 };
    int temp;
    //選擇排序法(Selection Sort)
    long begin = System.currentTimeMillis();
    for (int k = 0; k < 1000000; k++) {
    for (int i = 0; i < vec.length; i++) {
    for (int j = i; j < vec.length; j++) {
    if (vec[j] > vec) {
    temp = vec;
    vec = vec[j];
    vec[j] = temp;
    }
    }

    }
    }
    long end = System.currentTimeMillis();
    System.out.println("選擇法用時(shí)為:" + (end - begin));
    //打印排序好的結(jié)果
    for (int i = 0; i < vec.length; i++) {
    System.out.println(vec);
    }
    // 冒泡排序法(Bubble Sort)
    begin = System.currentTimeMillis();
    for (int k = 0; k < 1000000; k++) {
    for (int i = 0; i < vec.length; i++) {
    for (int j = i; j < vec.length - 1; j++) {
    if (vec[j + 1] > vec[j]) {
    temp = vec[j + 1];
    vec[j + 1] = vec[j];
    vec[j] = temp;
    }
    }

    }
    }
    end = System.currentTimeMillis();
    System.out.println("冒泡法用時(shí)為:" + (end - begin));
    //打印排序好的結(jié)果
    for (int i = 0; i < vec.length; i++) {
    System.out.println(vec);
    }

    //插入排序法(Insertion Sort)
    begin = System.currentTimeMillis();
    for (int k = 0; k < 1000000; k++) {
    for (int i = 1; i < vec.length; i++) {
    int j = i;
    while (vec[j - 1] < vec) {
    vec[j] = vec[j - 1];
    j--;
    if (j <= 0) {
    break;
    }
    }
    vec[j] = vec;
    }
    }
    end = System.currentTimeMillis();
    System.out.println("插入法用時(shí)為:" + (end - begin));
    //打印排序好的結(jié)果
    for (int i = 0; i < vec.length; i++) {
    System.out.println(vec);
    }

    //快速排序法(Quick Sort)

    Sort s = new Sort();
    begin = System.currentTimeMillis();
    for (int k = 0; k < 1000000; k++) {
    s.quicksort(vec, 0, 5);
    }
    end = System.currentTimeMillis();
    System.out.println("快速法用時(shí)為:" + (end - begin));
    //打印排序好的結(jié)果
    for (int i = 0; i < vec.length; i++) {
    System.out.println(vec);
    }
    }

    }
    以下是運(yùn)行結(jié)果:
    選擇法用時(shí)為:234
    56
    47
    37
    23
    19
    -5
    冒泡法用時(shí)為:172
    56
    47
    37
    23
    19
    -5
    插入法用時(shí)為:78
    56
    47
    37
    23
    19
    -5
    快速法用時(shí)為:297
    56
    47
    37
    23
    19
    -5*
    posted @ 2006-03-06 10:16 rodney 閱讀(376) | 評(píng)論 (0)編輯 收藏
     
    dwg,img,iso,sub怎么打開?這個(gè)問題在google去查詢一下有許多都可找到答案。我個(gè)人有過的的工具有:dwg用daemon,其它的用虛擬光驅(qū)就OK了。
    posted @ 2006-03-02 09:55 rodney 閱讀(765) | 評(píng)論 (0)編輯 收藏
     
    因一個(gè)QQ的網(wǎng)友發(fā)了一個(gè)鏈接給我,我一點(diǎn)擊,完了中他的套了。我的IE彈出了許多的廣告,在任務(wù)欄中有連接的小圖標(biāo)不見了。我在設(shè)置中打開網(wǎng)絡(luò)和拔號(hào)連接,可這里也沒有呀。只是圖標(biāo)不見了,連接還是可以用。不知道為什么,是哪里被改了。
    這可能是你的Network Connections服務(wù)被禁用了原因造成的,查看方法如下:在“運(yùn)行”窗口中輸入“services.msc”,然后在打開的“服務(wù)”窗口右側(cè)服務(wù)列表中找到名稱為“Network Connections”的服務(wù),看看其狀態(tài)是否為“已啟動(dòng)”。如果不是,那么就需要將其設(shè)置為“已啟動(dòng)”。
    posted @ 2006-03-01 10:03 rodney 閱讀(462) | 評(píng)論 (0)編輯 收藏
     

    這個(gè)異常是在測(cè)試EJB的時(shí)候,程序執(zhí)行到ctx.lookup("testEJB")時(shí)拋出的。由NamingException捕捉到。打印出棧軌跡是
    javax.naming.NameNotFoundException: Unable to resolve 'TestEJB'. Resolved ''; remaining name 'TestEJB'
     at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.java:1123)
     at weblogic.jndi.internal.BasicNamingNode.lookupHere(BasicNamingNode.java:250)
     at weblogic.jndi.internal.ServerNamingNode.lookupHere(ServerNamingNode.java:171)
     at weblogic.jndi.internal.BasicNamingNode.lookup(BasicNamingNode.java:204)
     at weblogic.jndi.internal.WLEventContextImpl.lookup(WLEventContextImpl.java:267)
     at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:362)
     at javax.naming.InitialContext.lookup(InitialContext.java:351)
     at testejb.servlet.SrvEJB.init(SrvEJB.java:26)
     at javax.servlet.GenericServlet.init(GenericServlet.java:256)
     at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:265)
     at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
     at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
     at weblogic.servlet.internal.StubSecurityHelper.createServlet(StubSecurityHelper.java:61)
     at weblogic.servlet.internal.StubLifecycleHelper.createOneInstance(StubLifecycleHelper.java:58)
     at weblogic.servlet.internal.StubLifecycleHelper.<init>(StubLifecycleHelper.java:48)
     at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:502)
     at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:224)
     at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:165)
     at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3022)
     at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
     at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
     at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:1925)
     at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:1848)
     at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1288)
     at weblogic.work.ExecuteThread.execute(ExecuteThread.java:207)
     at weblogic.work.ExecuteThread.run(ExecuteThread.java:179)
    我的ejb-jar.xml文件描述如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "

    <ejb-jar>
      <display-name>EJB</display-name>
      <enterprise-beans>
        <session>
          <ejb-name>TestEJB</ejb-name>
          <home>testejb.ejb.TestEJBHome</home>
          <remote>testejb.ejb.TestEJBRemote</remote>
          <ejb-class>testejb.ejb.TestEJBBean</ejb-class>
          <session-type>Stateless</session-type>
          <transaction-type>Container</transaction-type>
        </session>
      </enterprise-beans>
      <assembly-descriptor>
        <container-transaction>
          <method>
            <ejb-name>TestEJB</ejb-name>
            <method-name>*</method-name>
          </method>
          <trans-attribute>Required</trans-attribute>
        </container-transaction>
      </assembly-descriptor>
    </ejb-jar>

    weblogic-ejb-jar.xml文件描述如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE weblogic-ejb-jar PUBLIC "-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN" "

    <weblogic-ejb-jar>
      <weblogic-enterprise-bean>
        <ejb-name>TestEJB</ejb-name>
        <jndi-name>TestEJB</jndi-name>
      </weblogic-enterprise-bean>
    </weblogic-ejb-jar>
    這些配置我都寫了為什么還有名字沒有找到的異常呢?
    請(qǐng)大家?guī)兔纯础Vx謝! QQ:86322591。MSN:rodney_luo@163.com

     
    系統(tǒng)環(huán)境:
    OS: Windows Server 2000 SP4
    開發(fā)工具:JBuilder 2006。
    WEB服務(wù)器:Weblogic9.0
    數(shù)據(jù)庫(kù):DB2 V7.2
    使用Type2的JDBC連接方式。因?yàn)镈B2 V7.2只支持Type2與Type3的連接。
    我新建了一個(gè)TestDB類,在這個(gè)類中我可以連接到DB2中,并且取出數(shù)據(jù)。可是我把這個(gè)連接的方法寫到Servlet中就不能連接到該數(shù)據(jù)庫(kù)中了。拋出ClassNotFoundException的異常。  請(qǐng)大家?guī)兔矗以谙到y(tǒng)環(huán)境有設(shè)置Classpath的DB2驅(qū)動(dòng)程序包。并在WEB-INF\lib目錄下也有這個(gè)驅(qū)程驅(qū)動(dòng)程序包。它就是在Sevelt中要拋出ClassNotFoundException的異常。。。。。
    QQ:86322591
    MSN: rodney_luo@163.com
    Email: rodney_luo@163.com

    謝謝大家。
    posted @ 2006-02-17 13:17 rodney 閱讀(476) | 評(píng)論 (0)編輯 收藏
     
    我想各位網(wǎng)上的朋友常為了找不到自己合適的工具而煩吧。http://www.9iv.com/down/index.htm?eid=236712這里有你想要的一切工具軟件,開發(fā)工具,商務(wù)軟件。一切的軟件盡在http://www.9iv.com/down/index.htm?eid=236712中。
    posted @ 2006-02-15 09:46 rodney 閱讀(444) | 評(píng)論 (0)編輯 收藏
     
    1.查詢返回結(jié)果數(shù)量的設(shè)置
      缺省的情況下,一個(gè)全文本索引查詢的結(jié)果被限制為250個(gè)文檔,如果你想改變查詢返回
      QueryMaxResults=XXXX;
      XXXX代表一個(gè)小于5000的數(shù),如果XXXX超過5000,查詢將會(huì)變得很不穩(wěn)定,我建議最好將
      2.NOTES.INI中PREFERENCES變量的設(shè)置
      在NOTES.INI中的PREFERENCES變量的值一直是個(gè)迷,LOTUS公司一直沒有提供詳細(xì)的說明
    。直到現(xiàn)在,經(jīng)過國(guó)內(nèi)外LOTUS愛好者的研究,才弄清楚它的大體含義。其實(shí),PREFERENCES
    變量的值是一個(gè)有正負(fù)的32位WORD變量的十進(jìn)制表示法,其中每一位代表一個(gè)不同的優(yōu)先設(shè)置
      位位置 = 用戶優(yōu)先設(shè)置選擇
      0 = 不詳
      1 =掃描未讀文檔
      2 =不詳
      3 =大字體
      4 =不詳
      5 =將Internet URLs地址 (http//:)變?yōu)闊狳c(diǎn)
      6 =不詳
      7 = 只有打字機(jī)字體
      8 =單色顯示
      9 = Scandinavian 校驗(yàn)
      10 =不詳
      11 = 保存已發(fā)送郵件
      12 =發(fā)送郵件簽名
      13 =發(fā)送郵件加密
      14 = Metric(1)/Imperial(0)度量
      15 =最近校驗(yàn)的次數(shù)
      16 = 法國(guó)包裝
      17 =不詳
      18 = 每隔X分鐘檢查一次新郵件
      19 = 使能本地后臺(tái)索引
      20 = 加密保存的郵件
      21 =不詳
      22 =不詳
      23 =右鍵雙擊關(guān)閉窗口
      24 =位置提示
      25 =不詳
      26 = 在預(yù)覽框中打開文檔后將文檔標(biāo)記為已讀
      27 = 使能本地預(yù)定代理
      28 =保存發(fā)送郵件(總是提示,1=YES,0=NO)
      29 = 使新郵件提示可見
      30 =使新郵件提示可以聽見
      31 =有紋理的工作臺(tái)
      3.DOMINO最大限度獲得系統(tǒng)可用內(nèi)存的設(shè)置
      在NOTES.INI文件中加入以下變量:
      Platform_Statistics_Enabled=1
      強(qiáng)烈建議在NOTES.INI文件中加入上面一行,這樣會(huì)讓DOMINO可以最大限度的獲得系統(tǒng)的
    內(nèi)存,提高DOMINO服務(wù)器的性能。Domino 5.0.2 (或更高版本)的這個(gè)屬性支持NT和Solaris
      4.取消NOTES的缺省郵件程序地位
      大家可能都遇到過,如果NOTES被當(dāng)作缺省的郵件程序時(shí),當(dāng)你點(diǎn)擊MAILTO聯(lián)接的時(shí)候,
    就會(huì)啟動(dòng)NOTES,耗時(shí)費(fèi)勁,那么怎樣改變NOTES的缺省郵件程序地位呢?在NOTES.INI中加
      NotDefaultMailTo=1
      將取消NOTES的缺省郵件程序地位。
      5.用層疊地址本(cascaded address book)鑒別WEB用戶
      在Domino 4.6.1以前的版本中,都可以使用層疊地址本(cascaded address book)鑒別
    WEB用戶,但是到了Domino 4.6.2以后,不再支持用層疊地址本鑒別WEB用戶,取而代之的是
    用主NAB鑒別WEB用戶。為了鑒別WEB用戶,我們不得不使用主地址本,不過在NOTES.INI中加
    入以下行,你將會(huì)重新可以使用層疊地址本鑒別WEB用戶。
      NoMABForWebNames=1
      6.在工作站上隱藏設(shè)計(jì)菜單
      如果你不想讓工作站上的用戶創(chuàng)建個(gè)人視圖,可以用以下的方法隱藏設(shè)計(jì)菜單:
      NoDesignMenu=1或0
      1------隱藏設(shè)計(jì)菜單
      0------不隱藏設(shè)計(jì)菜單
      7.改變郵件到達(dá)的提示聲音
      大家可能已經(jīng)厭煩了LOTUS卻省的郵件到達(dá)提示聲音,不用急,改變一下notes.ini,你
    可以使用任何的聲音了。方法如下,在notes.ini中加入以下行:
      NewMailTune=[相對(duì)于NOTES DATA目錄的.wav文件的完整路徑].
      如:NewMailTune=c:winntmediamessage.wav
      現(xiàn)在你可以使用任何喜歡的聲音了。
      8.使用附加的地址本
      在NOTES.INI文件中加入以下行:
      Names=NAMES.NSF,NAMES1.NSF
      NOTES將會(huì)在NAMES.NSF和NAMES1.NSF兩個(gè)地址本中尋找用戶。

    9.設(shè)置新郵件檢查時(shí)間間隔
      在NOTES.INI文件中加入以下行:
      MinNewMailPoll= 時(shí)間(分鐘)
      工作站將會(huì)根據(jù)以上的設(shè)置,每隔一定時(shí)間檢查服務(wù)器上的新郵件。卻省的設(shè)置是15分鐘
      10.指定NOTES所用內(nèi)存大小
      通過在NOTES.INI中使用以下行:
      Memory_Quota = xx
      可以指定NOTES客戶端使用的PC的內(nèi)存大小,其中XX代表所用內(nèi)存的大小,注意XX值設(shè)得
    不要太小,否則會(huì)出現(xiàn)問題,NOTES R5比NOTES4.X需要的內(nèi)存多。
      11.記錄已經(jīng)索引的數(shù)據(jù)庫(kù)
      可以通過改變NOTES.INI設(shè)置,讓日志記錄已經(jīng)索引的數(shù)據(jù)庫(kù)。這個(gè)設(shè)置在數(shù)據(jù)庫(kù)更新所
    引的時(shí)候突然崩潰時(shí)非常有用。設(shè)置選項(xiàng)如下:
      要想記錄索引數(shù)據(jù)庫(kù)的視圖和文件夾:
      Log_Update=2
      要想只記錄索引過的數(shù)據(jù)庫(kù):
      Log_Update=1
      完全關(guān)閉更新日志
      Log_Update=0
      12.調(diào)試代理
      在NOTES.INI文件中加入以下行,你就可以調(diào)試代理了:
      DEBUG_AMGR = n ,n代表以下的數(shù)值
      r = 代理運(yùn)行
      l = 代理加載
      m = 代理內(nèi)存警告
      p = 代理性能狀態(tài)
      e = 事件
      s = 計(jì)劃安排
      c = 代理控制參數(shù)顯示
      v = 詳細(xì)
      * =使能以上所有選項(xiàng)
      13.指定運(yùn)行的NOTES程序
      當(dāng)你在同一臺(tái)機(jī)器上安裝NOTES客戶端和DOMINO服務(wù)器的時(shí)候,在NOTES.INI文件中有一
    項(xiàng)會(huì)隨之變化:
      KitType=
      1 ? 客戶端
      2 ? 服務(wù)器和客戶端
      14.加速視圖索引的速度
      在NOTES.INI文件中加入以下行,就能在一個(gè)視圖首次打開時(shí)加速索引的速度:
      GOFASTER=1
      加速視圖索引
      GOFASTER=0
      放慢視圖索引
      15.平行運(yùn)行WEB觸發(fā)代理
      DominoAsynchronizeAgents = 1
      在NOTES.INI文件中加入以上行之后,可以平行的運(yùn)行WEB觸發(fā)的代理。
      例如,如果有一個(gè)WEBQUERYOPEN代理,同時(shí)運(yùn)行這個(gè)代理的幾率很大,但是NOTES不支持
    同時(shí)運(yùn)行同一個(gè)代理,因此,如果三個(gè)用戶同時(shí)申請(qǐng)了運(yùn)行這個(gè)代理,那么只有一個(gè)用戶的申
    請(qǐng)被批準(zhǔn),其余的只有等待。用了以上的設(shè)置之后,三個(gè)用戶可以同時(shí)運(yùn)行這個(gè)代理。
      16.將服務(wù)器窗口的內(nèi)容寫入一個(gè)文件
      在NOTES.INI文件中寫入以下行,就可以將服務(wù)器端窗口的內(nèi)容寫入一個(gè)文件:   Debug_Outfile = < filename >
      在NOTES4.X中,文件名必須是DEBUG.TXT,每次服務(wù)器重新啟動(dòng)之后,就會(huì)產(chǎn)生一個(gè)文件
    DEBUG1.TXT,DEBUG2.TXT等等,依次類推,DEBUG.TXT代表最新的服務(wù)器端的內(nèi)容
    posted @ 2006-01-16 16:05 rodney 閱讀(1079) | 評(píng)論 (0)編輯 收藏
     
    初次接觸IBM 的WEbsphere產(chǎn)品系列。大家要注意的幾個(gè)地方是在配置與編程程序。一在編程時(shí)EJB的在調(diào)用時(shí)的lookup("java:comp/env/JNDIEJB")這個(gè)名字一定要與EJB的配置描述符一樣,有區(qū)分大小寫。同時(shí)最好與BEAN的名字也一樣。二。在用連接池編寫程序時(shí)的JNDI也一樣要加上lookup("java:comp/env/JNDIName")這里的JNDI名是在配置連接池指定的JNDI,也有區(qū)分大小寫。在配置WEB,EJB應(yīng)用程序時(shí)這兩個(gè)程序可以分開配置。但EJB的配置時(shí)會(huì)多幾步,要把Enteprice Bean這個(gè)復(fù)選框選上。
    posted @ 2005-12-28 09:26 rodney 閱讀(763) | 評(píng)論 (0)編輯 收藏
     
    java.rmi.RemoteException: Transaction Rolledback.; nested exception is: 
    	weblogic.transaction.internal.TimedOutException: Transaction timed out after 32 seconds 
    Name=[EJB testpool.EJBPoolBean.isLogin(java.lang.String,java.lang.String)],Xid=BEA1-0001D529A50E7F28EDB9(10061327),Status=Active,numRepliesOwedMe=0,numRepliesOwedOthers=0,seconds since begin=32,seconds left=30,activeThread=Thread[ExecuteThread: '13' for queue: 'weblogic.kernel.Default',5,Thread Group for Queue: 'weblogic.kernel.Default'],XAServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(ServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(state=started,assigned=none),xar=weblogic.jdbc.wrapper.JTSXAResourceImpl@1304e60),SCInfo[mydomain+myserver]=(state=active),properties=({weblogic.transaction.name=[EJB testpool.EJBPoolBean.isLogin(java.lang.String,java.lang.String)], weblogic.jdbc=t3://192.168.1.98:7001}),OwnerTransactionManager=ServerTM[ServerCoordinatorDescriptor=(CoordinatorURL=myserver+192.168.1.98:7001+mydomain+t3+, XAResources={},NonXAResources={})],CoordinatorURL=myserver+192.168.1.98:7001+mydomain+t3+)
    	at weblogic.rmi.internal.ServerRequest.sendReceive(ServerRequest.java:186)
    	at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteRef.java:284)
    	at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteRef.java:244)
    	at testpool.EJBPool_isb7ao_EOImpl_811_WLStub.isLogin(Unknown Source)
    	at testpool.SrvLogin.doPost(SrvLogin.java:62)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    	at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1053)
    	at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:387)
    	at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:305)
    	at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6310)
    	at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:317)
    	at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
    	at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3622)
    	at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2569)
    	at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)
    	at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)
    Caused by: weblogic.transaction.internal.TimedOutException: Transaction timed out after 32 seconds 
    Name=[EJB testpool.EJBPoolBean.isLogin(java.lang.String,java.lang.String)],Xid=BEA1-0001D529A50E7F28EDB9(10061327),Status=Active,numRepliesOwedMe=0,numRepliesOwedOthers=0,seconds since begin=32,seconds left=30,activeThread=Thread[ExecuteThread: '13' for queue: 'weblogic.kernel.Default',5,Thread Group for Queue: 'weblogic.kernel.Default'],XAServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(ServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(state=started,assigned=none),xar=weblogic.jdbc.wrapper.JTSXAResourceImpl@1304e60),SCInfo[mydomain+myserver]=(state=active),properties=({weblogic.transaction.name=[EJB testpool.EJBPoolBean.isLogin(java.lang.String,java.lang.String)], weblogic.jdbc=t3://192.168.1.98:7001}),OwnerTransactionManager=ServerTM[ServerCoordinatorDescriptor=(CoordinatorURL=myserver+192.168.1.98:7001+mydomain+t3+, XAResources={},NonXAResources={})],CoordinatorURL=myserver+192.168.1.98:7001+mydomain+t3+)
    	at weblogic.transaction.internal.ServerTransactionImpl.wakeUp(ServerTransactionImpl.java:1492)
    	at weblogic.transaction.internal.ServerTransactionManagerImpl.processTimedOutTransactions(ServerTransactionManagerImpl.java:1071)
    	at weblogic.transaction.internal.TransactionManagerImpl.wakeUp(TransactionManagerImpl.java:1805)
    	at weblogic.transaction.internal.ServerTransactionManagerImpl.wakeUp(ServerTransactionManagerImpl.java:988)
    	at weblogic.transaction.internal.WLSTimer.trigger(WLSTimer.java:31)
    	at weblogic.time.common.internal.ScheduledTrigger.run(ScheduledTrigger.java:243)
    	at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:317)
    	at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
    	at weblogic.time.common.internal.ScheduledTrigger.executeLocally(ScheduledTrigger.java:229)
    	at weblogic.time.common.internal.ScheduledTrigger.execute(ScheduledTrigger.java:223)
    	... 2 more
    在程序中運(yùn)行都沒有出錯(cuò)。這個(gè)TimedOutException:是執(zhí)行時(shí)間超時(shí)的原理。要在哪里設(shè)置這個(gè)值?
    問題的解決是在配置連接池的地方有一個(gè)高級(jí)設(shè)置:Click Hide展開后把連接持續(xù)時(shí)間設(shè)長(zhǎng)一此。就可以了。
    posted @ 2005-12-23 14:51 rodney 閱讀(2191) | 評(píng)論 (0)編輯 收藏
     

    java.sql.SQLException: 調(diào)用中無效的參數(shù)這個(gè)錯(cuò)誤是在結(jié)果集循環(huán)取出是拋出的。我不明白的是,用連接池才會(huì)拋出這個(gè)錯(cuò),用其它的連接就不會(huì)?在Weblogic中測(cè)試連接池也沒有問題。請(qǐng)問這是為什么?代碼在下面:
    public boolean isLogin(String uid, String pwd) {
        boolean isLogin = false;
        Connection conn = this.getConnection();
        if (conn != null) {
          String sql =
              "select username,pwd from wasuserinfor where userName=? and pwd=?";
          try {
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, uid);
            ps.setString(2, pwd);
            ResultSet rs = ps.getResultSet();
            while (rs.next()) {
              String userNaem = rs.getString("USERNAME");
              String password = rs.getString("PWD");
              isLogin = true;
            }
          }
          catch (SQLException ex) {
            ex.printStackTrace();
          }
          finally {
            if (conn != null) {
              try {
                conn.close();
              }
              catch (SQLException ex1) {
                ex1.printStackTrace();
              }
            }
          }
        }
        return isLogin;
      }

      private Connection getConnection() {
        Object obj = null;
        try {
          Context ctx = new InitialContext();
          DataSource ds = (DataSource) ctx.lookup("jdbc/oracle");
          return ds.getConnection();
        }
        catch (SQLException ex) {
          return null;
        }
        catch (NamingException ex) {
          return null;
        }
      }
    解決辦法是看了代碼:ResultSet rs = ps.getResultSet();
    之前一個(gè)要先執(zhí)行ps.executeQuery();這樣就不會(huì)有錯(cuò)了。

    posted @ 2005-12-23 14:31 rodney 閱讀(431) | 評(píng)論 (0)編輯 收藏
     
    現(xiàn)在大家都在學(xué)習(xí)JAVA,WEBLOGIC,IBM的WEBSPHERE 系列產(chǎn)品。如果上QQ方便的朋友可以加入18750476群,這是一個(gè)不錯(cuò)的學(xué)習(xí)交流群。特別是IBM的那一套WEBSPHERE在國(guó)內(nèi)的群很少這方面的交流學(xué)習(xí)。
    posted @ 2005-12-21 09:09 rodney 閱讀(342) | 評(píng)論 (0)編輯 收藏
     
    在java中要將一個(gè)字符串的中$符號(hào)去除。我是這樣寫的:
    String tmp = "-$125402.00";
    tmp.replaceAll("$","");
    可是執(zhí)行去來的結(jié)果并沒有把$去除。后來找資料才發(fā)現(xiàn)要這樣寫
    tmp.replaceAll("\\$","")才可以。
    posted @ 2005-11-29 11:10 rodney 閱讀(3180) | 評(píng)論 (0)編輯 收藏
     
    把java中的Vector,Hashtable,List等數(shù)類型轉(zhuǎn)換成javaScript的數(shù)組。在這里用到的是一個(gè)StringBuffer.具體的實(shí)現(xiàn)看下面的代碼:
    public String getArray(Vector v){
      if (v == null || v.size()==0){
       return "";
      }
      int i=0;
      Hashtable hash = null;
      StringBuffer sb = new StringBuffer("var arrmake = new Array(");
      try{
       for(i=0; i<v.size(); i++){
        hash = (Hashtable)v.elementAt(i);
        String tmp_make = hash.get("code").toString();    
        if(i=1){
         sb.append("'"+tmp_make+"'");     
        }else if(i>1){
         sb.append("'"+tmp_make+"',");
        }    
       }
       String test = sb.toString();
       if (i>1){
        test = test.substring(0,test.length()-1);
       }
       sb.append(test+");");
      }catch(Exception e){
       e.printStackTrace();
      }  
      return sb.toString();
     }
    要注意這里一定要用try{}catch(){}因?yàn)樵谵D(zhuǎn)換過程中可能會(huì)出錯(cuò),所以用try{}catch(){}把異常拋出。
    在javascript中怎么用這個(gè)數(shù)組呢?
    String arrMake = getArray(vecMake);
    <script language="javaScript">
     <%=arrMake%>
    </script>
    OK.
    posted @ 2005-11-22 11:11 rodney 閱讀(1349) | 評(píng)論 (0)編輯 收藏
     
    我寫了一個(gè)這樣的SQL語句 "select column1,column2 into vara, varb from tableName" ,可在PL/SQL執(zhí)行時(shí)出現(xiàn)缺失關(guān)鍵字的錯(cuò)誤。注意這里的關(guān)鍵字into。這個(gè)關(guān)鍵字是在寫function & produce時(shí)把相應(yīng)的字段值賦值變量。不可以單獨(dú)拿出來執(zhí)行。還要注意一點(diǎn)sql的解釋是從后面開始執(zhí)行的。
    posted @ 2005-11-11 14:33 rodney 閱讀(324) | 評(píng)論 (0)編輯 收藏
     
    java.lang.NumberFormatException: For input string: ""
    java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    java.lang.Integer.parseInt(Integer.java:489)
    以上的錯(cuò)誤是因?yàn)閷⒁粋€(gè)空值要強(qiáng)制轉(zhuǎn)換成int型。為什么會(huì)是一個(gè)空值呢?是因?yàn)樵贘SP中form的TEXT沒有輸入值傳到servlet中。servlet是用Integer.parseInt(request.getParameter("vehFrom"))來取JSP中的值 的。要解決這個(gè)問題很簡(jiǎn)單,可是初學(xué)者常會(huì)遇到這樣的問題。廢話少說還是說怎么解決了的吧。
    只要在servlet中將這個(gè)值做一個(gè)空值處理。
    if((jcf.retuPara(request,"vehFrom")).length()<=0){
          vehFromNo = 0;
         }else{
          vehFromNo = Integer.parseInt(jcf.retuPara(request,"vehFrom"));
         }
    要注意一點(diǎn)是JSP傳到servlet中如果沒有輸入值是NULL值。我這里用了一個(gè)自己寫的retuPara()方法是處理NULL的。把NULL處理成“”。
    好了,搞定。
    posted @ 2005-11-11 09:42 rodney 閱讀(1193) | 評(píng)論 (0)編輯 收藏
     
    &lt;P&gt;&lt;A href=&quot;http://www.8qu.net/register.asp?net=rodneyluo&quot;&gt;http://www.8qu.net/register.asp?net=rodneyluo&lt;/A&gt;&lt;BR&gt;我也是在論壇上看了別人的帖子才注冊(cè)的!我已經(jīng)實(shí)踐過了,換了20個(gè)Q幣,真的很好用,向大家推薦!!!! &lt;/P&gt; &lt;P&gt;以前你也可能看過這樣的廣告,這次你真的不要再錯(cuò)過了!! &lt;BR&gt;其實(shí)和很多人一樣,我對(duì)網(wǎng)絡(luò)賺錢由最初的抵觸(因?yàn)榇蠹叶颊f那是騙人的)到半信半疑(因?yàn)橛信笥颜f網(wǎng)賺&lt;/P&gt; &lt;P&gt;行的,但要看是什么樣的網(wǎng)賺)再到確信(因?yàn)榇藭r(shí)自己親身賺到了,其他的不知道,但通寶確實(shí)是真的)。 &lt;/P&gt; &lt;P&gt;下面介紹一下方法:只要到 &lt;A href=&quot;http://www.8qu.net/register.asp?net=rodneyluo&quot;&gt;http://www.8qu.net/register.asp?net=rodneyluo&lt;/A&gt;(那里有更加詳細(xì)的介紹)注&lt;/P&gt; &lt;P&gt;冊(cè)后,免費(fèi)下載一個(gè)軟件:“通寶 ”(tongbao.exe) 。下載后打開,點(diǎn)擊“登錄”--“開始泡分”,這樣就&lt;/P&gt; &lt;P&gt;開始賺Q幣了 ,掛機(jī)就可以賺Q幣了,跟掛QQ差不多。 &lt;BR&gt;每5分鐘自動(dòng)增加一積分 。 &lt;/P&gt; &lt;P&gt;別看到要寫銀行帳號(hào)就嚇到了,其實(shí)你可以不填(建議填一下,因?yàn)楫?dāng)你達(dá)到支付的條件時(shí)就可以確確時(shí)時(shí)的&lt;/P&gt; &lt;P&gt;收到人民幣),選擇要Q幣(只需要輸入QQ號(hào)碼) &lt;/P&gt; &lt;P&gt;注冊(cè)地址:&lt;A href=&quot;http://www.8qu.net/register.asp?net=rodneyluo&quot;&gt;http://www.8qu.net/register.asp?net=rodneyluo&lt;/A&gt;&lt;/P&gt; &lt;P&gt;推薦使用八趣TongBao的理由: &lt;/P&gt; &lt;P&gt;一. 無需任何點(diǎn)擊.泡時(shí)間積分,就像網(wǎng)易POPO一樣.對(duì)工作沒有任何影響.不象Newsbar(新聞時(shí)報(bào))或SABar等&lt;/P&gt; &lt;P&gt;要及時(shí)保存積分. &lt;BR&gt;二.真正的無干擾.隱藏時(shí)只在任務(wù)欄中有一個(gè)小“銅錢”,只占1M內(nèi)存,對(duì)于動(dòng)輒256,512甚至上G內(nèi)存的機(jī)來&lt;/P&gt; &lt;P&gt;說根本就九牛一毛,對(duì)你上網(wǎng)干其他事沒有干擾。 &lt;BR&gt;三. 綠色小軟件無需安裝. &lt;BR&gt;四. 無需一分錢投入.免費(fèi)注冊(cè)使用,因而沒有任何風(fēng)險(xiǎn)(要自己投資錢的話我是肯定不會(huì)去干的), 而且信譽(yù)&lt;/P&gt; &lt;P&gt;絕對(duì)沒問題,要有問題也不可能存在這么多年。我的親身經(jīng)歷就是 &lt;BR&gt;五.下線數(shù)與積分兌現(xiàn)金.TongBao支持五級(jí)下線:10%,5%,3%,3%,3%。 &lt;BR&gt;按每月推薦10名下線,你的下線每月又推薦10名下線,以公司承諾每1000個(gè)積分最低付費(fèi)5元計(jì)算(實(shí)際會(huì)超過&lt;/P&gt; &lt;P&gt;5元),你的月收入分別為(按每人每月1000個(gè)積分計(jì)算): &lt;BR&gt;第1個(gè)月收入: 5元; &lt;BR&gt;第2個(gè)月收入: 5 +5 =10元 &lt;BR&gt;第3個(gè)月收入: 5 +5 +25 =35元; &lt;BR&gt;第4個(gè)月收入: 5 +5 +25 +150 =185元; &lt;BR&gt;第5個(gè)月收入: 5 +5 +25 +150 +1500 =1685元; &lt;BR&gt;第6個(gè)月收入:5 +5 +25 +150 +1500 +15000 =16685元; &lt;BR&gt;說實(shí)話,其實(shí)這是理想的算法,實(shí)際上是很難達(dá)到的,因?yàn)椴荒鼙WC每個(gè)人都認(rèn)真去泡分和發(fā)展下線 ,但是你&lt;/P&gt; &lt;P&gt;認(rèn)真點(diǎn)去做的話,幾個(gè)月以后每個(gè)月賺幾百絕對(duì)沒問題,而且這將穩(wěn)定增長(zhǎng)的,這已經(jīng)相當(dāng)不錯(cuò)了,至少我覺&lt;/P&gt; &lt;P&gt;得是這樣!!! &lt;/P&gt; &lt;P&gt;當(dāng)然,如果單獨(dú)一個(gè)人只是掛機(jī)(一天只給掛四小時(shí)),一個(gè)月也就7元,但這個(gè)7元比Newsbar和SABar一個(gè)月的&lt;/P&gt; &lt;P&gt;7元容易賺多了,不需任何點(diǎn)擊。如果有下線,收入見上面算式。要是三個(gè)一起掛就更加不用說了。 &lt;/P&gt; &lt;P&gt;八趣TongBao免費(fèi)注冊(cè):(&lt;A href=&quot;http://www.8qu.net/register.asp?net=rodneyluo&quot;&gt;http://www.8qu.net/register.asp?net=rodneyluo&lt;/A&gt;強(qiáng)烈推薦) &lt;BR&gt;  &lt;BR&gt;我的使用心得。如果不是網(wǎng)蟲,一定得想辦法發(fā)展十來個(gè)下線,最簡(jiǎn)單的方法就是到論壇發(fā)貼,關(guān)鍵是這東西&lt;/P&gt; &lt;P&gt;可以賺QB,有很多人愿意掛的。我現(xiàn)在已經(jīng)發(fā)展了131個(gè)下線了。還有一點(diǎn),我們從下線那里提成,但下線自己&lt;/P&gt; &lt;P&gt;的點(diǎn)數(shù)是不會(huì)變的。所以越多人加進(jìn)來,你會(huì)越多的收益,并不會(huì)影響他們。到以后,自己上網(wǎng)時(shí)記得就掛,&lt;/P&gt; &lt;P&gt;不記得就算了。如果下線多,有一天可能收到100元或1000元,也可以補(bǔ)貼一下上網(wǎng)費(fèi),不能太浪費(fèi)寬帶吧,有&lt;/P&gt; &lt;P&gt;收獲當(dāng)做一種意外不是很好嗎?! &lt;/P&gt; &lt;P&gt;關(guān)鍵的關(guān)鍵,沒事多來發(fā)發(fā)貼,多拉點(diǎn)人成你的下線,就靠自己泡效果不明顯,一個(gè)月才10來個(gè)QB。如果下線&lt;/P&gt; &lt;P&gt;多了,自己都不用掛,吃提成都?jí)蛄恕4蠹乙黄饋頀彀桑透鷴霶Q似的,全民一起掛,我靠,最后加入的也有1&lt;/P&gt; &lt;P&gt;0塊一個(gè)月,那些下線多的真得會(huì)發(fā)死哎~~呵呵。注冊(cè)八趣&lt;A href=&quot;http://www.8qu.net/register.asp?net=iamcacy&quot;&gt;http://www.8qu.net/register.asp?net=iamcacy&lt;/A&gt;你&lt;/P&gt; &lt;P&gt;賺錢,我受益!掛在網(wǎng)上不費(fèi)事,月入一千也是你,還等什么快快成為第一批注冊(cè)者,讓更多的人成為你的下&lt;/P&gt; &lt;P&gt;線!具體介紹請(qǐng)?jiān)L問&lt;A href=&quot;http://www.8qu.net/register.asp?net=iamcacy&quot;&gt;http://www.8qu.net/register.asp?net=iamcacy&lt;/A&gt;如有疑問請(qǐng)加379588056聽我在線詢問!&lt;/P&gt; &lt;P&gt;決不騙你! &lt;/P&gt; &lt;P&gt;還有就是盡量去發(fā)BT種子發(fā)展下線,象我一樣,為他人服務(wù)的同時(shí)進(jìn)行宣傳,效果很好!!! &lt;BR&gt;雙管齊下還愁發(fā)展不了下線,哈哈,到時(shí)就坐著等錢拉, &lt;/P&gt; &lt;P&gt;持之以恒,相信收獲的一天很快到來!!(對(duì)沒有恒心,急功近利的不推薦使用,因?yàn)橹辽僖獛讉€(gè)月才能看到&lt;/P&gt; &lt;P&gt;非常明顯的效果) &lt;BR&gt;我建有一個(gè)群,交流使用心得和解答疑難:1653115,想加的在驗(yàn)證的時(shí)候?qū)懮希和▽氂脩?&lt;BR&gt;有疑惑的也可以加進(jìn)來再詳細(xì)咨詢。&lt;/P&gt;
    posted @ 2005-11-04 21:15 rodney 閱讀(794) | 評(píng)論 (1)編輯 收藏
     
    The checkBox 在html的form中要把值傳遞到servlet中進(jìn)行處理。這時(shí)如果checkbox的屬性checked = false時(shí),在servlet取checkbox的value是一個(gè)NULL值.只有checked = true時(shí)才能取到value.
    還因該注意一點(diǎn)如果有value是NULL時(shí)做String.equalsIgnoreCase("") or String.equals("")都會(huì)拋出空指異常。頁(yè)面上顯示500號(hào)錯(cuò)誤。請(qǐng)小心使用。
    posted @ 2005-11-03 17:10 rodney 閱讀(1759) | 評(píng)論 (0)編輯 收藏
     
    快到公司了,要過一個(gè)紅綠燈,我等綠燈一亮,我剛要過馬路,這時(shí)一個(gè)男子騎著自己車把我的自行車前輪撞得不成樣子。這時(shí)我們也沒有說什么,同時(shí)找一個(gè)家修理店,要把自行車修好。這個(gè)修車的老板一看是被撞的車子說不能修了。只能換一個(gè)輪子,那男子問要多少錢,老板血口大開說25元不能少。我一聽就知道這個(gè)老板要”殺人“。那男子說他出15元,因?yàn)樗砩现挥羞@么多錢。那還要10元怎么辦要我自己出不成我說。于是兩人在這家店門口小炒,說什么他不知道我要過馬路,我自行是舊的,換一個(gè)新的被我占便宜了。我很生氣說:“你換不換是你家的事,總之你一定對(duì)你今天所做的事情負(fù)責(zé)。”后來他把自行車上鎖就走了。我追上去,看來他的公司是這附近。我們走近一家小院子他的幾個(gè)同事走過了,問我想做什么?我氣了。把事情說了一遍。后來看到他是同事都在搬東西。想過去是一個(gè)做苦力的,掙錢也不容易。還是他出15,我出10。開始就這么解決就不會(huì)有那么多的口頭爭(zhēng)吵了。
    posted @ 2005-10-20 09:55 rodney 閱讀(360) | 評(píng)論 (0)編輯 收藏
     
    Calendar lCal = Calendar.getInstance(); 
    String year = tod.substring(6);  //tod 是DD/MM/YYYY的格式的日期。
    String month = tod.substring(3,5);
     lCal.set(FormatFunctions.s2i(year), FormatFunctions.s2i(month), 1); 調(diào)用一個(gè)共用方法將字符串轉(zhuǎn)換成整型。
         lCal.add(Calendar.MONTH, 0);
         lCal.add(Calendar.DATE, -1);
          SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
          tod = formatter.format(lCal.getTime();
    posted @ 2005-10-14 14:56 rodney 閱讀(2270) | 評(píng)論 (0)編輯 收藏
     
    中文機(jī)的日期如果是1月2005 SELECT TO_CHAR(SYSDATE,'MONYYYY') FROM DUAL
    英文機(jī)的日期如果是1月2005會(huì)顯示成JAN2005.
    從上面可以看出oracle在格式轉(zhuǎn)換中用MON的格式是取某個(gè)月的單詞的前三個(gè)字符。但是在中文機(jī)上有從SQL中取出來是1?空格2005一共是占七個(gè)字符。而英文機(jī)上也是占七個(gè)字符。只是在顯示時(shí)的效果不一樣。中:1?空格2005,英文機(jī)上:JAN2005.
    posted @ 2005-10-14 14:43 rodney 閱讀(364) | 評(píng)論 (0)編輯 收藏
     

    如果有一個(gè)程序是這樣:(PB的源代碼)
    IF NOT IsNull(ld_from_date) AND NOT IsNull(ld_date) THEN
     ls_sql_where = ls_sql_where + &
     " Trunc(~"CITYNET_INTERFACE~".~"REQUESTED_PICKUP_DTM~") between TO_DATE('" + &
     String(ld_from_date, 'dd/mm/yyyy') + &
     "', 'dd/mm/yyyy') and TO_DATE('" + &
     String(ld_date, 'dd/mm/yyyy') + "', 'dd/mm/yyyy')" + " AND "
     ls_query_criteria = ls_query_criteria + " Trip Date between " + String(ld_from_date,'DD/MM/YYYY') + &
      " AND " + String(ld_date,'DD/MM/YYYY')
    END IF

    IF NOT IsNull(ld_from_date) AND IsNull(ld_date) THEN
     ls_sql_where = ls_sql_where + &
     " Trunc(~"CITYNET_INTERFACE~".~"REQUESTED_PICKUP_DTM~") >= TO_DATE('" + &
     String(ld_from_date, 'dd/mm/yyyy') + "', 'dd/mm/yyyy')" + " AND "
     ls_query_criteria = ls_query_criteria + " Trip Date >= " + String(ld_from_date,'DD/MM/YYYY')
    END IF

    IF IsNull(ld_from_date) AND NOT IsNull(ld_date) THEN
     ls_sql_where = ls_sql_where + &
     " Trunc(~"CITYNET_INTERFACE~".~"REQUESTED_PICKUP_DTM~") <= TO_DATE('" + &
     String(ld_date, 'dd/mm/yyyy') + "', 'dd/mm/yyyy')" + " AND "
     ls_query_criteria = ls_query_criteria + " Trip Date <= " + String(ld_date,'DD/MM/YYYY')
    END IF
    把上面的代碼用SQL的查詢語句來實(shí)行。
    這時(shí)我用到了一個(gè)between運(yùn)算符,這個(gè)運(yùn)算符會(huì)包括它后的兩個(gè)入?yún)ⅲ?BR>如:select table.A from table where table.A between 5 and 10.也就是說這時(shí)的條件A>=5 and A<= 10的記錄。

    posted @ 2005-10-11 13:52 rodney 閱讀(785) | 評(píng)論 (0)編輯 收藏
     
    我的report server是IBM產(chǎn)品,我通過URL傳遞參數(shù)時(shí)http://work-5:80/reports/rwservlet?mykeys2&desType=cache&desFormat=PDF&report=/data1/ifms/xmlreports/IF3050R.xml&printid=SANCP2&pgmID=IF3050R
    但在&變量名之后加了空格,結(jié)果report不能打印。然后我把URL中的每個(gè)空格都去除。可以了。當(dāng)我不知道URL為什么不能有空格,HTTP協(xié)議是怎么處理空格的。希望有哪位高手能給一個(gè)指點(diǎn)。
    posted @ 2005-10-11 10:45 rodney 閱讀(3417) | 評(píng)論 (3)編輯 收藏
     
    1. 配置系統(tǒng)管理(Admin Web Application)
    大多數(shù)商業(yè)化的J2EE服務(wù)器都提供一個(gè)功能強(qiáng)大的管理界面,且大都采用易于理解的Web應(yīng)用界面。Tomcat按照自己的方式,同樣提供一個(gè)成熟的管理工具,并且絲毫不遜于那些商業(yè)化的競(jìng)爭(zhēng)對(duì)手。Tomcat的Admin Web Application最初在4.1版本時(shí)出現(xiàn),當(dāng)時(shí)的功能包括管理context、data source、user和group等。當(dāng)然也可以管理像初始化參數(shù),user、group、role的多種數(shù)據(jù)庫(kù)管理等。在后續(xù)的版本中,這些功能將得到很大的擴(kuò)展,但現(xiàn)有的功能已經(jīng)非常實(shí)用了。

    Admin Web Application被定義在自動(dòng)部署文件:CATALINA_BASE/webapps/admin.xml 。
    (譯者注:CATALINA_BASE即tomcat安裝目錄下的server目錄)

    你必須編輯這個(gè)文件,以確定Context中的docBase參數(shù)是絕對(duì)路徑。也就是說,CATALINA_BASE/webapps/admin.xml 的路徑是絕對(duì)路徑。作為另外一種選擇,你也可以刪除這個(gè)自動(dòng)部署文件,而在server.xml文件中建立一個(gè)Admin Web Application的context,效果是一樣的。你不能管理Admin Web Application這個(gè)應(yīng)用,換而言之,除了刪除CATALINA_BASE/webapps/admin.xml ,你可能什么都做不了。

    如果你使用UserDatabaseRealm(默認(rèn)),你將需要添加一個(gè)user以及一個(gè)role到CATALINA_BASE/conf/tomcat-users.xml 文件中。你編輯這個(gè)文件,添加一個(gè)名叫“admin”的role 到該文件中,如下:

    <role name="admin"/>

    你同樣需要有一個(gè)用戶,并且這個(gè)用戶的角色是“admin”。象存在的用戶那樣,添加一個(gè)用戶(改變密碼使其更加安全):

    <user name="admin" password="deep_dark_secret" roles="admin"/>

    當(dāng)你完成這些步驟后,請(qǐng)重新啟動(dòng)Tomcat,訪問http://localhost:8080/admin,你將看到一個(gè)登錄界面。Admin Web Application采用基于容器管理的安全機(jī)制,并采用了Jakarta Struts框架。一旦你作為“admin”角色的用戶登錄管理界面,你將能夠使用這個(gè)管理界面配置Tomcat。

    2.配置應(yīng)用管理(Manager Web Application)
    Manager Web Application讓你通過一個(gè)比Admin Web Application更為簡(jiǎn)單的用戶界面,執(zhí)行一些簡(jiǎn)單的Web應(yīng)用任務(wù)。

    Manager Web Application被被定義在一個(gè)自動(dòng)部署文件中:

    CATALINA_BASE/webapps/manager.xml 。

    你必須編輯這個(gè)文件,以確保context的docBase參數(shù)是絕對(duì)路徑,也就是說CATALINA_HOME/server/webapps/manager的絕對(duì)路徑。
    (譯者注:CATALINA_HOME即tomcat安裝目錄)

    如果你使用的是UserDatabaseRealm,那么你需要添加一個(gè)角色和一個(gè)用戶到CATALINA_BASE/conf/tomcat-users.xml文件中。接下來,編輯這個(gè)文件,添加一個(gè)名為“manager”的角色到該文件中:

    <role name=”manager”>

    你同樣需要有一個(gè)角色為“manager”的用戶。像已經(jīng)存在的用戶那樣,添加一個(gè)新用戶(改變密碼使其更加安全):

    <user name="manager" password="deep_dark_secret" roles="manager"/>

    然后重新啟動(dòng)Tomcat,訪問http://localhost/manager/list,將看到一個(gè)很樸素的文本型管理界面,或者訪問http://localhost/manager/html/list,將看到一個(gè)HMTL的管理界面。不管是哪種方式都說明你的Manager Web Application現(xiàn)在已經(jīng)啟動(dòng)了。

    Manager application讓你可以在沒有系統(tǒng)管理特權(quán)的基礎(chǔ)上,安裝新的Web應(yīng)用,以用于測(cè)試。如果我們有一個(gè)新的web應(yīng)用位于/home/user/hello下在,并且想把它安裝到 /hello下,為了測(cè)試這個(gè)應(yīng)用,我們可以這么做,在第一個(gè)文件框中輸入“/hello”(作為訪問時(shí)的path),在第二個(gè)文本框中輸入“file:/home/user/hello”(作為Config URL)。

    Manager application還允許你停止、重新啟動(dòng)、移除以及重新部署一個(gè)web應(yīng)用。停止一個(gè)應(yīng)用使其無法被訪問,當(dāng)有用戶嘗試訪問這個(gè)被停止的應(yīng)用時(shí),將看到一個(gè)503的錯(cuò)誤——“503 - This application is not currently available”。

    移除一個(gè)web應(yīng)用,只是指從Tomcat的運(yùn)行拷貝中刪除了該應(yīng)用,如果你重新啟動(dòng)Tomcat,被刪除的應(yīng)用將再次出現(xiàn)(也就是說,移除并不是指從硬盤上刪除)。

    3.部署一個(gè)web應(yīng)用
    有兩個(gè)辦法可以在系統(tǒng)中部署web服務(wù)。
    1> 拷貝你的WAR文件或者你的web應(yīng)用文件夾(包括該web的所有內(nèi)容)到$CATALINA_BASE/webapps目錄下。
    2> 為你的web服務(wù)建立一個(gè)只包括context內(nèi)容的XML片斷文件,并把該文件放到$CATALINA_BASE/webapps目錄下。這個(gè)web應(yīng)用本身可以存儲(chǔ)在硬盤上的任何地方。

    如果你有一個(gè)WAR文件,你若想部署它,則只需要把該文件簡(jiǎn)單的拷貝到CATALINA_BASE/webapps目錄下即可,文件必須以“.war”作為擴(kuò)展名。一旦Tomcat監(jiān)聽到這個(gè)文件,它將(缺省的)解開該文件包作為一個(gè)子目錄,并以WAR文件的文件名作為子目錄的名字。接下來,Tomcat將在內(nèi)存中建立一個(gè)context,就好象你在server.xml文件里建立一樣。當(dāng)然,其他必需的內(nèi)容,將從server.xml中的DefaultContext獲得。

    部署web應(yīng)用的另一種方式是寫一個(gè)Context XML片斷文件,然后把該文件拷貝到CATALINA_BASE/webapps目錄下。一個(gè)Context片斷并非一個(gè)完整的XML文件,而只是一個(gè)context元素,以及對(duì)該應(yīng)用的相應(yīng)描述。這種片斷文件就像是從server.xml中切取出來的context元素一樣,所以這種片斷被命名為“context片斷”。

    舉個(gè)例子,如果我們想部署一個(gè)名叫MyWebApp.war的應(yīng)用,該應(yīng)用使用realm作為訪問控制方式,我們可以使用下面這個(gè)片斷:

    <!--  
     Context fragment for deploying MyWebApp.war  
    -->
    <Context path="/demo" docBase="webapps/MyWebApp.war"
            debug="0" privileged="true">
     <Realm className="org.apache.catalina.realm.UserDatabaseRealm"                
            resourceName="UserDatabase"/>
    </Context>

    把該片斷命名為“MyWebApp.xml”,然后拷貝到CATALINA_BASE/webapps目錄下。

    這種context片斷提供了一種便利的方法來部署web應(yīng)用,你不需要編輯server.xml,除非你想改變?nèi)笔〉牟渴鹛匦裕惭b一個(gè)新的web應(yīng)用時(shí)不需要重啟動(dòng)Tomcat。


    4.配置虛擬主機(jī)(Virtual Hosts)
    關(guān)于server.xml中“Host”這個(gè)元素,只有在你設(shè)置虛擬主機(jī)的才需要修改。虛擬主機(jī)是一種在一個(gè)web服務(wù)器上服務(wù)多個(gè)域名的機(jī)制,對(duì)每個(gè)域名而言,都好象獨(dú)享了整個(gè)主機(jī)。實(shí)際上,大多數(shù)的小型商務(wù)網(wǎng)站都是采用虛擬主機(jī)實(shí)現(xiàn)的,這主要是因?yàn)樘摂M主機(jī)能直接連接到Internet并提供相應(yīng)的帶寬,以保障合理的訪問響應(yīng)速度,另外虛擬主機(jī)還能提供一個(gè)穩(wěn)定的固定IP。

    基于名字的虛擬主機(jī)可以被建立在任何web服務(wù)器上,建立的方法就是通過在域名服務(wù)器(DNS)上建立IP地址的別名,并且告訴web服務(wù)器把去往不同域名的請(qǐng)求分發(fā)到相應(yīng)的網(wǎng)頁(yè)目錄。因?yàn)檫@篇文章主要是講Tomcat,我們不準(zhǔn)備介紹在各種操作系統(tǒng)上設(shè)置DNS的方法,如果你在這方面需要幫助,請(qǐng)參考《DNS and Bind》一書,作者是Paul Albitz and Cricket Liu (O'Reilly)。為了示范方便,我將使用一個(gè)靜態(tài)的主機(jī)文件,因?yàn)檫@是測(cè)試別名最簡(jiǎn)單的方法。
    在Tomcat中使用虛擬主機(jī),你需要設(shè)置DNS或主機(jī)數(shù)據(jù)。為了測(cè)試,為本地IP設(shè)置一個(gè)IP別名就足夠了,接下來,你需要在server.xml中添加幾行內(nèi)容,如下:

    <Server port="8005" shutdown="SHUTDOWN" debug="0">
     <Service name="Tomcat-Standalone">
       <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
    port="8080" minProcessors="5" maxProcessors="75"
    enableLookups="true" redirectPort="8443"/>
       <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
    port="8443" minProcessors="5" maxProcessors="75"
    acceptCount="10" debug="0" scheme="https" secure="true"/>
         <Factory className="org.apache.coyote.tomcat4.CoyoteServerSocketFactory"
    clientAuth="false" protocol="TLS" />
       </Connector>
       <Engine name="Standalone" defaultHost="localhost" debug="0">
         <!-- This Host is the default Host -->
         <Host name="localhost" debug="0" appBase="webapps"
         unpackWARs="true" autoDeploy="true">
           <Context path="" docBase="ROOT" debug="0"/>
           <Context path="/orders" docBase="/home/ian/orders" debug="0"
                          reloadable="true" crossContext="true">
           </Context>
         </Host>

         <!-- This Host is the first "Virtual Host": www.example.com -->
         <Host name="www.example.com" appBase="/home/example/webapp">
           <Context path="" docBase="."/>
         </Host>

       </Engine>
     </Service>
    </Server>

    Tomcat的server.xml文件,在初始狀態(tài)下,只包括一個(gè)虛擬主機(jī),但是它容易被擴(kuò)充到支持多個(gè)虛擬主機(jī)。在前面的例子中展示的是一個(gè)簡(jiǎn)單的server.xml版本,其中粗體部分就是用于添加一個(gè)虛擬主機(jī)。每一個(gè)Host元素必須包括一個(gè)或多個(gè)context元素,所包含的context元素中必須有一個(gè)是默認(rèn)的context,這個(gè)默認(rèn)的context的顯示路徑應(yīng)該為空(例如,path=””)。

    5.配置基礎(chǔ)驗(yàn)證(Basic Authentication)
    容器管理驗(yàn)證方法控制著當(dāng)用戶訪問受保護(hù)的web應(yīng)用資源時(shí),如何進(jìn)行用戶的身份鑒別。當(dāng)一個(gè)web應(yīng)用使用了Basic Authentication(BASIC參數(shù)在web.xml文件中auto-method元素中設(shè)置),而有用戶訪問受保護(hù)的web應(yīng)用時(shí),Tomcat將通過HTTP Basic Authentication方式,彈出一個(gè)對(duì)話框,要求用戶輸入用戶名和密碼。在這種驗(yàn)證方法中,所有密碼將被以64位的編碼方式在網(wǎng)絡(luò)上傳輸。

    注意:使用Basic Authentication通過被認(rèn)為是不安全的,因?yàn)樗鼪]有強(qiáng)健的加密方法,除非在客戶端和服務(wù)器端都使用HTTPS或者其他密碼加密碼方式(比如,在一個(gè)虛擬私人網(wǎng)絡(luò)中)。若沒有額外的加密方法,網(wǎng)絡(luò)管理員將能夠截獲(或?yàn)E用)用戶的密碼。但是,如果你是剛開始使用Tomcat,或者你想在你的web應(yīng)用中測(cè)試一下基于容器的安全管理,Basic Authentication還是非常易于設(shè)置和使用的。只需要添加<security-constraint>和<login-config>兩個(gè)元素到你的web應(yīng)用的web.xml文件中,并且在CATALINA_BASE/conf/tomcat-users.xml 文件中添加適當(dāng)?shù)?lt;role>和<user>即可,然后重新啟動(dòng)Tomcat。

    下面例子中的web.xml摘自一個(gè)俱樂部會(huì)員網(wǎng)站系統(tǒng),該系統(tǒng)中只有member目錄被保護(hù)起來,并使用Basic Authentication進(jìn)行身份驗(yàn)證。請(qǐng)注意,這種方式將有效的代替Apache web服務(wù)器中的.htaccess文件。

    <!--
     Define the Members-only area, by defining
     a "Security Constraint" on this Application, and
     mapping it to the subdirectory (URL) that we want
     to restrict.
    -->
    <security-constraint>
     <web-resource-collection>
       <web-resource-name>
         Entire Application
       </web-resource-name>
       <url-pattern>/members/*</url-pattern>
     </web-resource-collection>
     <auth-constraint>
         <role-name>member</role-name>
     </auth-constraint>
    </security-constraint>
    <!-- Define the Login Configuration for this Application -->
    <login-config>
     <auth-method>BASIC</auth-method>
     <realm-name>My Club Members-only Area</realm-name>
    </login-config>

    6.配置單點(diǎn)登錄(Single Sign-On)
    一旦你設(shè)置了realm和驗(yàn)證的方法,你就需要進(jìn)行實(shí)際的用戶登錄處理。一般說來,對(duì)用戶而言登錄系統(tǒng)是一件很麻煩的事情,你必須盡量減少用戶登錄驗(yàn)證的次數(shù)。作為缺省的情況,當(dāng)用戶第一次請(qǐng)求受保護(hù)的資源時(shí),每一個(gè)web應(yīng)用都會(huì)要求用戶登錄。如果你運(yùn)行了多個(gè)web應(yīng)用,并且每個(gè)應(yīng)用都需要進(jìn)行單獨(dú)的用戶驗(yàn)證,那這看起來就有點(diǎn)像你在與你的用戶搏斗。用戶們不知道怎樣才能把多個(gè)分離的應(yīng)用整合成一個(gè)單獨(dú)的系統(tǒng),所有他們也就不知道他們需要訪問多少個(gè)不同的應(yīng)用,只是很迷惑,為什么總要不停的登錄。

    Tomcat 4的“single sign-on”特性允許用戶在訪問同一虛擬主機(jī)下所有web應(yīng)用時(shí),只需登錄一次。為了使用這個(gè)功能,你只需要在Host上添加一個(gè)SingleSignOn Valve元素即可,如下所示:

    <Valve className="org.apache.catalina.authenticator.SingleSignOn"
          debug="0"/>

    在Tomcat初始安裝后,server.xml的注釋里面包括SingleSignOn Valve配置的例子,你只需要去掉注釋,即可使用。那么,任何用戶只要登錄過一個(gè)應(yīng)用,則對(duì)于同一虛擬主機(jī)下的所有應(yīng)用同樣有效。

    使用single sign-on valve有一些重要的限制:
    1> value必須被配置和嵌套在相同的Host元素里,并且所有需要進(jìn)行單點(diǎn)驗(yàn)證的web應(yīng)用(必須通過context元素定義)都位于該Host下。
    2> 包括共享用戶信息的realm必須被設(shè)置在同一級(jí)Host中或者嵌套之外。
    3> 不能被context中的realm覆蓋。
    4> 使用單點(diǎn)登錄的web應(yīng)用最好使用一個(gè)Tomcat的內(nèi)置的驗(yàn)證方式(被定義在web.xml中的<auth-method>中),這比自定義的驗(yàn)證方式強(qiáng),Tomcat內(nèi)置的的驗(yàn)證方式包括basic、digest、form和client-cert。
    5> 如果你使用單點(diǎn)登錄,還希望集成一個(gè)第三方的web應(yīng)用到你的網(wǎng)站中來,并且這個(gè)新的web應(yīng)用使用它自己的驗(yàn)證方式,而不使用容器管理安全,那你基本上就沒招了。你的用戶每次登錄原來所有應(yīng)用時(shí)需要登錄一次,并且在請(qǐng)求新的第三方應(yīng)用時(shí)還得再登錄一次。當(dāng)然,如果你擁有這個(gè)第三方web應(yīng)用的源碼,而你又是一個(gè)程序員,你可以修改它,但那恐怕也不容易做。
    6> 單點(diǎn)登錄需要使用cookies。

    7.配置用戶定制目錄(Customized User Directores)
    一些站點(diǎn)允許個(gè)別用戶在服務(wù)器上發(fā)布網(wǎng)頁(yè)。例如,一所大學(xué)的學(xué)院可能想給每一位學(xué)生一個(gè)公共區(qū)域,或者是一個(gè)ISP希望給一些web空間給他的客戶,但這又不是虛擬主機(jī)。在這種情況下,一個(gè)典型的方法就是在用戶名前面加一個(gè)特殊字符(~),作為每位用戶的網(wǎng)站,比如:

    http://www.cs.myuniversity.edu/~username
    http://members.mybigisp.com/~username

    Tomcat提供兩種方法在主機(jī)上映射這些個(gè)人網(wǎng)站,主要使用一對(duì)特殊的Listener元素。Listener的className屬性應(yīng)該是org.apache.catalina.startup.UserConfig,userClass屬性應(yīng)該是幾個(gè)映射類之一。如果你的系統(tǒng)是Unix,它將有一個(gè)標(biāo)準(zhǔn)的/etc/passwd文件,該文件中的帳號(hào)能夠被運(yùn)行中的Tomcat很容易的讀取,該文件指定了用戶的主目錄,使用PasswdUserDatabase 映射類。

    <Listener className="org.apache.catalina.startup.UserConfig"
    directoryName="public_html"
    userClass="org.apache.catalina.startup.PasswdUserDatabase"/>

    web文件需要放置在像/home/users/ian/public_html 或者 /users/jbrittain/public_html一樣的目錄下面。當(dāng)然你也可以改變public_html 到其他任何子目錄下。

    實(shí)際上,這個(gè)用戶目錄根本不一定需要位于用戶主目錄下里面。如果你沒有一個(gè)密碼文件,但你又想把一個(gè)用戶名映射到公共的像/home一樣目錄的子目錄里面,則可以使用HomesUserDatabase類。

    <Listener className="org.apache.catalina.startup.UserConfig"
    directoryName="public_html" homeBase="/home"
    userClass="org.apache.catalina.startup.HomesUserDatabase"/>

    這樣一來,web文件就可以位于像/home/ian/public_html 或者 /home/jasonb/public_html一樣的目錄下。這種形式對(duì)Windows而言更加有利,你可以使用一個(gè)像c:\home這樣的目錄。

    這些Listener元素,如果出現(xiàn),則必須在Host元素里面,而不能在context元素里面,因?yàn)樗鼈兌加脩?yīng)用于Host本身。


    8.在Tomcat中使用CGI腳本
    Tomcat主要是作為Servlet/JSP容器,但它也有許多傳統(tǒng)web服務(wù)器的性能。支持通用網(wǎng)關(guān)接口(Common Gateway Interface,即CGI)就是其中之一,CGI提供一組方法在響應(yīng)瀏覽器請(qǐng)求時(shí)運(yùn)行一些擴(kuò)展程序。CGI之所以被稱為通用,是因?yàn)樗茉诖蠖鄶?shù)程序或腳本中被調(diào)用,包括:Perl,Python,awk,Unix shell scripting等,甚至包括Java。當(dāng)然,你大概不會(huì)把一個(gè)Java應(yīng)用程序當(dāng)作CGI來運(yùn)行,畢竟這樣太過原始。一般而言,開發(fā)Servlet總要比CGI具有更好的效率,因?yàn)楫?dāng)用戶點(diǎn)擊一個(gè)鏈接或一個(gè)按鈕時(shí),你不需要從操作系統(tǒng)層開始進(jìn)行處理。

    Tomcat包括一個(gè)可選的CGI Servlet,允許你運(yùn)行遺留下來的CGI腳本。

    為了使Tomcat能夠運(yùn)行CGI,你必須做如下幾件事:
    1. 把servlets-cgi.renametojar (在CATALINA_HOME/server/lib/目錄下)改名為servlets-cgi.jar。處理CGI的servlet應(yīng)該位于Tomcat的CLASSPATH下。
    2. 在Tomcat的CATALINA_BASE/conf/web.xml 文件中,把關(guān)于<servlet-name> CGI的那段的注釋去掉(默認(rèn)情況下,該段位于第241行)。
    3. 同樣,在Tomcat的CATALINA_BASE/conf/web.xml文件中,把關(guān)于對(duì)CGI進(jìn)行映射的那段的注釋去掉(默認(rèn)情況下,該段位于第299行)。注意,這段內(nèi)容指定了HTML鏈接到CGI腳本的訪問方式。
    4. 你可以把CGI腳本放置在WEB-INF/cgi 目錄下(注意,WEB-INF是一個(gè)安全的地方,你可以把一些不想被用戶看見或基于安全考慮不想暴露的文件放在此處),或者你也可以把CGI腳本放置在context下的其他目錄下,并為CGI Servlet調(diào)整cgiPathPrefix初始化參數(shù)。這就指定的CGI Servlet的實(shí)際位置,且不能與上一步指定的URL重名。
    5. 重新啟動(dòng)Tomcat,你的CGI就可以運(yùn)行了。

    在Tomcat中,CGI程序缺省放置在WEB-INF/cgi目錄下,正如前面所提示的那樣,WEB-INF目錄受保護(hù)的,通過客戶端的瀏覽器無法窺探到其中內(nèi)容,所以對(duì)于放置含有密碼或其他敏感信息的CGI腳本而言,這是一個(gè)非常好的地方。為了兼容其他服務(wù)器,盡管你也可以把CGI腳本保存在傳統(tǒng)的/cgi-bin目錄,但要知道,在這些目錄中的文件有可能被網(wǎng)上好奇的沖浪者看到。另外,在Unix中,請(qǐng)確定運(yùn)行Tomcat的用戶有執(zhí)行CGI腳本的權(quán)限。

    9.改變Tomcat中的JSP編譯器(JSP Compiler)
    在Tomcat 4.1(或更高版本,大概),JSP的編譯由包含在Tomcat里面的Ant程序控制器直接執(zhí)行。這聽起來有一點(diǎn)點(diǎn)奇怪,但這正是Ant有意為之的一部分,有一個(gè)API文檔指導(dǎo)開發(fā)者在沒有啟動(dòng)一個(gè)新的JVM的情況下,使用Ant。這是使用Ant進(jìn)行Java開發(fā)的一大優(yōu)勢(shì)。另外,這也意味著你現(xiàn)在能夠在Ant中使用任何javac支持的編譯方式,這里有一個(gè)關(guān)于Apache Ant使用手冊(cè)的javac page列表。使用起來是容易的,因?yàn)槟阒恍枰?lt;init-param> 元素中定義一個(gè)名字叫“compiler”,并且在value中有一個(gè)支持編譯的編譯器名字,示例如下:

    <servlet>
       <servlet-name>jsp</servlet-name>
       <servlet-class>
         org.apache.jasper.servlet.JspServlet
       </servlet-class>
       <init-param>
         <param-name>logVerbosityLevel</param-name>
         <param-value>WARNING</param-value>
       </init-param>
       <init-param>
         <param-name>compiler</param-name>
         <param-value>jikes</param-value>
       </init-param>
       <load-on-startup>3</load-on-startup>
    </servlet>

    當(dāng)然,給出的編譯器必須已經(jīng)安裝在你的系統(tǒng)中,并且CLASSPATH可能需要設(shè)置,那處決于你選擇的是何種編譯器。

    10.限制特定主機(jī)訪問(Restricting Access to Specific Hosts)
    有時(shí),你可能想限制對(duì)Tomcat web應(yīng)用的訪問,比如,你希望只有你指定的主機(jī)或IP地址可以訪問你的應(yīng)用。這樣一來,就只有那些指定的的客戶端可以訪問服務(wù)的內(nèi)容了。為了實(shí)現(xiàn)這種效果,Tomcat提供了兩個(gè)參數(shù)供你配置:RemoteHostValve 和RemoteAddrValve。

    通過配置這兩個(gè)參數(shù),可以讓你過濾來自請(qǐng)求的主機(jī)或IP地址,并允許或拒絕哪些主機(jī)/IP。與之類似的,在Apache的httpd文件里有對(duì)每個(gè)目錄的允許/拒絕指定。
    例如你可以把Admin Web application設(shè)置成只允許本地訪問,設(shè)置如下:

    <Context path="/path/to/secret_files" ...>
     <Valve className="org.apache.catalina.valves.RemoteAddrValve"
            allow="127.0.0.1" deny=""/>
    </Context>

    如果沒有給出允許主機(jī)的指定,那么與拒絕主機(jī)匹配的主機(jī)就會(huì)被拒絕,除此之外的都是允許的。與之類似,如果沒有給出拒絕主機(jī)的指定,那么與允許主機(jī)匹配的主機(jī)就會(huì)被允許,除此之外的都是拒絕的。
    posted @ 2005-10-10 12:19 rodney 閱讀(251) | 評(píng)論 (0)編輯 收藏
     

    今天上網(wǎng)不管輸入任何一個(gè)網(wǎng)址都沒有辦法顯示內(nèi)容,提示找不該網(wǎng)頁(yè)。
    用ping www.google.com提示Unknow host www.google.com
    用nslookup www.google.com 提示有:服務(wù)器名,IP地址都有顯示出來。
    用tracert IP地址也可以。
    后來我在服務(wù)中把DNS Client的服務(wù)重啟一下就OK了。

    posted @ 2005-09-23 10:17 rodney 閱讀(388) | 評(píng)論 (0)編輯 收藏
     
    主站蜘蛛池模板: 免费看国产一级特黄aa大片| 亚洲精品无码专区在线| 一级毛片无遮挡免费全部| 成人免费视频国产| 国产免费AV片在线播放唯爱网| 可以免费看的卡一卡二| 亚洲国产成人精品无码区在线网站| 亚洲视频一区二区三区四区| 国色精品卡一卡2卡3卡4卡免费| 四虎影视精品永久免费网站| 男男gvh肉在线观看免费| 久久久久成人片免费观看蜜芽| 免费看香港一级毛片| 久久久久亚洲精品影视| 久久久久久影院久久久久免费精品国产小说 | 特级做A爰片毛片免费69| 亚洲AV男人的天堂在线观看| 国产亚洲福利一区二区免费看| 无码国产精品一区二区免费模式| 成在线人永久免费视频播放 | 亚洲高清日韩精品第一区| 50岁老女人的毛片免费观看| 亚洲国产人成在线观看| 在线播放国产不卡免费视频| 亚洲中文字幕无码一区二区三区| 亚洲国产一区在线| 九九久久国产精品免费热6| 国内精品99亚洲免费高清| 中文字幕免费不卡二区 | 免费A级毛片无码A∨中文字幕下载| 可以免费观看的一级毛片| 亚洲精品视频免费| 亚洲欧洲自拍拍偷午夜色| 一二三四在线播放免费观看中文版视频| 国产福利免费在线观看| 性生大片视频免费观看一级| 日本妇人成熟免费中文字幕| 久久水蜜桃亚洲AV无码精品| 无人在线观看完整免费版视频| 亚洲午夜久久久精品影院| 1000部啪啪毛片免费看|