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

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

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

    隨筆-13  評(píng)論-6  文章-0  trackbacks-0
      2006年2月9日
    1:
    java.sql.Timestamp a = new java.sql.Timestamp(System.currentTimeMillis());

    2:
    java.util.Date a = new java.util.Date();

    3:
    java.util.Date a;
    a.setTime(System.currentTimeMillis());
    posted @ 2006-03-24 09:41 java之海 閱讀(4996) | 評(píng)論 (0)編輯 收藏

    J2EE1.4 新特性之JSP 2.0的新特性

    作者:務(wù)實(shí)工作室 發(fā)文時(shí)間:2003.10.27

    SUN 的新版J2EE1.4提供了在J2EE中開(kāi)發(fā)Web Service的基礎(chǔ),對(duì)開(kāi)發(fā)工具做了一些重要的增強(qiáng),在應(yīng)用程序部署和服務(wù)器管理方面也提供了新的標(biāo)準(zhǔn),在集成性和安全性方面有所增強(qiáng),提升了J2EE 開(kāi)發(fā)Web應(yīng)用程序的能力;在編程模型方面的重要變化包括JSP表達(dá)式語(yǔ)言、簡(jiǎn)化的標(biāo)記庫(kù)等;EJB 2.1中提供了新的timer服務(wù),查詢語(yǔ)言(QL)也有所增強(qiáng);Jdbc3.0 API把通常的Jdbc API與擴(kuò)充API結(jié)合起來(lái);J2EE Connectors規(guī)范和獨(dú)立于消息類(lèi)型的EJB提供了對(duì)雙向通信的支持。下面給大家重點(diǎn)介紹J2EE1.4中包含的JSP2.0 Servlet2.4Jdbc3.0以及EJB2.1方面的新特性。


    一、JSP 2.0的新特性



    JSP 2.0
    屬于J2EE 1.4平臺(tái),它在JSP 1.2基礎(chǔ)之上增加了新的功能。它保證了向下兼容,原先使用的JSP技術(shù)在JSP 2.0中都可以支持。JSP 2.0的新功能主要包括下面幾部分:

    (
    )運(yùn)行環(huán)境變化

    1
    web.xml格式變化

    我們知道JSP 1.2可以在Java 2標(biāo)準(zhǔn)版1.3版本運(yùn)行,而JSP 2.0要求使用Java 2標(biāo)準(zhǔn)版1.4或更新版本,JSP 2.0使用由Servlet 2.4規(guī)定的Web程序部署描述格式。

    Web程序描述文件web.xml中需要使用xml schema打頭的格式。在web.xml中主要的變化是所有有關(guān)JSP的設(shè)置信息要放在標(biāo)記中。下面程序例1顯示了一個(gè)web.xml大致的樣子。

    1




    ??? .......



    ??? http://www.icconcept.com/ics/sample-taglib


    ??? /WEB-INF/jsp/sample-taglib.tld


    ??? ........


    ??? For config the ICW sample application

    JSPConfiguration
    /jsp/datareset.jsp
    true<
    el-ignored>
    ISO-8859-1
    true
    /jsp/prelude.jspf
    /jsp/coda.jspf





    2
    JSP設(shè)置

    在標(biāo)記提供了Web程序中JSP程序的設(shè)置信息。包括和兩類(lèi)元素。定義了Web程序使用的custom tag,它的用法和以前JSP 1.2中的用法相同。定義了一組JSP的特性。這些特性實(shí)際上對(duì)應(yīng)JSPpage directive定義的特性。通過(guò)只不過(guò)可以方便地對(duì)多個(gè)具有相同屬性的JSP統(tǒng)一定義。

    定義一個(gè)或多個(gè)URL樣式,在中定義的屬性會(huì)適用于匹配這些URL樣式的所有JSP文件。在中的屬性可以定義以下設(shè)置:

    (1)
    允許或禁止使用表達(dá)式語(yǔ)言(EL)

    在中可以設(shè)定是否允許對(duì)應(yīng)的JSP使用JSTL表達(dá)式語(yǔ)言(EL)。如果屬性標(biāo)記被設(shè)定為falseJSP中的EL表達(dá)式會(huì)被處理;如果是trueWeb容器會(huì)在轉(zhuǎn)換JSP時(shí)忽略EL表達(dá)式。

    (2)
    允許或禁止使用scripting

    屬性可以允許或禁止使用JSP的腳本語(yǔ)言(scripting)。如果這個(gè)屬性標(biāo)記對(duì)應(yīng)為 true,即scripting元素被禁止,則JSP中不能使用scriptletscripting表達(dá)式和declaration,否則會(huì)有轉(zhuǎn)換錯(cuò) 誤。當(dāng)這個(gè)屬性標(biāo)記為false時(shí),JSP可以像在1.2版本之前那樣使用腳本語(yǔ)言。

    (3)
    聲明JSP編碼

    通過(guò)標(biāo)記可以設(shè)置對(duì)應(yīng)的JSP網(wǎng)頁(yè)的編碼。這個(gè)屬性對(duì)應(yīng)每個(gè)JSP中的pageEncoding屬性,Web容器將根據(jù)這個(gè)屬性對(duì)JSP內(nèi)容進(jìn)行編碼。

    (4)
    對(duì)應(yīng)隱含包括(Implicit Includes)

    在中可以在對(duì)應(yīng)JSP中加入抬頭(preludes)和結(jié)尾(coda),使用和屬性可以設(shè)定在JSP網(wǎng)頁(yè)中包括的preludescodajspf文件。這些文件的位置相對(duì)于當(dāng)前Web程序的context。當(dāng)有超過(guò)一個(gè)preludescoda元素在中時(shí),JSP會(huì)按照其順序加入到內(nèi)容中。

    (
    )引入表達(dá)式語(yǔ)言(EL)

    JSP 2.0
    的一個(gè)主要特點(diǎn)是它支持表達(dá)語(yǔ)言(expression language)JSTL表達(dá)式語(yǔ)言可以使用標(biāo)記格式方便地訪問(wèn)JSP的隱含對(duì)象和JavaBeans組件,JSTL的核心標(biāo)記提供了流程和循環(huán)控制 功能。自制標(biāo)記也有自定義函數(shù)的功能,因此基本上所有seriptlet能實(shí)現(xiàn)的功能都可以由JSP替代。在JSP 2.0中,建議盡量使用EL而使JSP的格式更一致。

    web.xml的中可以控制一組JSP是否使用EL,在每個(gè)JSP中也可以指定是否該JSP使用EL。在page directive中的isELIgnored屬性用來(lái)指定是否忽略。格式為:


    <%@ page isELIgnored "true|false"%>



    如果設(shè)定為真,那么JSP中的表達(dá)式被當(dāng)成字符串處理。比如下面這個(gè)表達(dá)式

    ${2000 % 20}

    isELIgnored"true"時(shí)輸出為${2000 % 20},而isELIgnored"false"時(shí)輸出為100Web容器默認(rèn)isELIgnored"false"

    雖然JSP 2.0可以使JSP中完全使用表達(dá)語(yǔ)言而避免scriptlet,在實(shí)際編程中,應(yīng)該根據(jù)程序的功能要求和編程人員的自身?xiàng)l件選擇合適的方式。使用表達(dá)語(yǔ) 言的JSP比較方便規(guī)整,但是由于需要將標(biāo)記進(jìn)行轉(zhuǎn)換,在第一次被調(diào)用時(shí)會(huì)比較慢;有些編程人員由于對(duì)Java比較了解,因而更習(xí)慣JSP 1.2之前的編程方式,因此,在使用中應(yīng)因地制宜地選擇適用的編程方法。

    (
    )SimpleTag

    JSP 2.0
    中加入了新的創(chuàng)建自制標(biāo)記的APIjavax.servlet.jsp.tagext.SimpleTag定義了用來(lái)實(shí)現(xiàn)簡(jiǎn)單標(biāo)記的接口。和 JSP 1.2中的已有接口不同的是,SimpleTag接口不使用doStartTag()doEndTag()方法,而提供了一個(gè)簡(jiǎn)單的doTag()方 法。這個(gè)方法在調(diào)用該標(biāo)記時(shí)只被使用一次。而需要在一個(gè)自制標(biāo)記中實(shí)現(xiàn)的所有邏輯過(guò)程、循環(huán)和對(duì)標(biāo)記體的評(píng)估等都在這個(gè)方法中實(shí)現(xiàn)。從這個(gè)方面來(lái)講, SimpleTagIterationTag可以達(dá)到同等的作用。但SimpleTag的方法和處理周期要簡(jiǎn)單得多。在SimpleTag中還有用來(lái)設(shè) 置JSP內(nèi)容的seUspBody()getJspBody()方法。Web容器會(huì)使用setJspBody()方法定義一個(gè)代表JSP內(nèi)容的 JspFragment對(duì)象。實(shí)現(xiàn)SimpleTag標(biāo)記的程序可以在doTag方法中根據(jù)需要多次調(diào)用getJspBody().invoke()方法 以處理JSP內(nèi)容。

    例如,程序例2 SimpleTag根據(jù)指定的次數(shù)(times)進(jìn)行循環(huán)并輸出當(dāng)前序號(hào)(sequence)。程序的結(jié)構(gòu)比較簡(jiǎn)單,所有邏輯都在doTag方法中實(shí)現(xiàn)。

    2


    package ICW.taglib;
    ? import javax.servlet.jsp.JspException;
    ? import javax.servlet.jsp.tagext.SimpleTagSupport;
    ? import java.util.HashMap;
    ? import java.io.IOException;
    ? public class IterationSimpleTag extends SimpleTagSupport{
    ? private int times;
    public void setTimes(int_times){
    ??? this.times=_times;
    ??????? }
    ??? public void doTag() throws JspException,IOException{
    ??? HashMap params=new HashMap();
    ??? for(int i=0; i



    這個(gè)標(biāo)記的TLD文件內(nèi)容如下,它使用了XML schcma定義標(biāo)記的使用方法。

    程序例3如下:





    1.0
    Jwad book simple tag
    /JwadSimpleTag
    Simple Tag Handler

    iteration
    ICW.taglib.IterationSimpleTag
    scriptless
    Iteration Tag

    Current iterationnumber
    sequence


    times
    true
    true





    程序例4中的JSP使用上面例3中定義的IterationSimpleTag,它根據(jù)Web請(qǐng)求參數(shù)中給定的“times”的值進(jìn)行一定次數(shù)的循環(huán)。在每次循環(huán)中將輸出"sequence"的值。

    4


    <%@ taglib prefix="ictag" uri="/WEB-INF/ics-jsp2.tld" %>




    Interation Simple Tag

    ?





    Reminder:




    ??? This is the ${sequence} Of ${times} times of reminder




    (
    )使用JSP fragment

    JSP 2.0
    中的一個(gè)主要功能是JSP fragment,它的基本特點(diǎn)是可以使處理JSP的容器推遲評(píng)估JSP標(biāo)記屬性。我們知道一般JSP是首先評(píng)估JSP標(biāo)記的屬性,然后在處理JSP標(biāo)記 時(shí)使用這些屬性,而JSP fragment提供了動(dòng)態(tài)的屬性。也就是說(shuō),這些屬性在JSP處理其標(biāo)記體時(shí)是可以被改變的。JSP需要將這樣的屬性定義為 javax.servlet.jsp.tagext.JspFragment類(lèi)型。當(dāng)JSP標(biāo)記設(shè)置成這種形式時(shí),這種標(biāo)記屬性實(shí)際上的處理方法類(lèi)似于標(biāo) 記體。在實(shí)現(xiàn)標(biāo)記的程序中,標(biāo)記屬性可以被反復(fù)評(píng)估多次。這種用法稱為JSP fragmentJSP fragment還可以定義在一個(gè)SimpleTag處理程序中使用的自制標(biāo)記動(dòng)作。像前面例子說(shuō)明的,getJspBody返回一個(gè) JspFragment對(duì)象并可以在doTag方法中多次使用。需要注意的是,使用JSP fragmentJSP只能有一般的文本和JSP action,不能有scriptletscriptlet表達(dá)式。

    我們可以簡(jiǎn)單地認(rèn)為JSP fragment是一段可以重復(fù)使用的JSP。一段JSP fragment可以被傳遞到另一個(gè)JSP中并被使用。與JSP include概念不同的是,JSP fragment一般功能比較短小簡(jiǎn)單而且重復(fù)使用率高。

    JSP fragment
    一般在標(biāo)記體內(nèi)或標(biāo)記體內(nèi)定義。每次當(dāng)含有JSP fragment的標(biāo)記被使用時(shí),Web容器生成一個(gè)JspFragment對(duì)象,這個(gè)對(duì)象和當(dāng)前JSPpage scope聯(lián)系起來(lái)。同時(shí),這個(gè)JspFragment對(duì)象和包含它的父標(biāo)記建立聯(lián)系。JspFragment對(duì)象可以有兩種調(diào)用方式:使用Java編寫(xiě) 的標(biāo)記處理程序,或者使用標(biāo)記文件(tag file)。標(biāo)記文件可以使用,或者動(dòng)作使用JSP fragment JSP標(biāo)記文件可以和JSP fragment共同工作。CustomTag都是以編程方式實(shí)現(xiàn)的。JSP標(biāo)記文件是用文本文件格式(JSP語(yǔ)法)實(shí)現(xiàn)自制標(biāo)記,這也是JSP 2.0的一個(gè)主要新功能。一個(gè)標(biāo)記文件可以對(duì)應(yīng)一個(gè)標(biāo)記,可以不需tld文件定義該標(biāo)記的方法。這樣,即使編程人員不熟悉Java,也可以使用JSP語(yǔ)法 定義自己的標(biāo)記。標(biāo)記文件一般使用.tag為后綴并放在Web程序的/WEB-INF目錄下。

    程序例5中的taskstatus.jsp使用了兩個(gè)JSP fragment。這個(gè)JSP的功能是顯示一組Task的名稱和完成日期,它通過(guò)定義了兩段JSPfragment(名稱為onSeheduledelayed)。在標(biāo)記內(nèi)的JSP就是JSPfragment,而標(biāo)記被一個(gè)包圍。這個(gè)標(biāo)記是一個(gè)通過(guò)標(biāo)記文件定義的自制標(biāo)記,它的定義文件在/WEB-INF/tags目錄下。標(biāo)記文件的名稱和標(biāo)記名稱一致為“l(fā)istTasks.tag"。這個(gè)標(biāo)記會(huì)使用到前面定義的兩個(gè)JSP fragment

    5:


    <%@ taglib prefix="ictag" tagdir="/WEB-INF/tags" %>




    JSP Fragment Sample Using Tag Files

    ?


    ?

    Tasks





    Name:${name}

    Date:${date}

    Name:${name}

    Plan: ${pianDate}
    Actural:${actDate}



    (
    )其他特性

    JSP2.0
    還有一些其他特性變化,比如嚴(yán)格修正了I18N的語(yǔ)法規(guī)則,改進(jìn)JSP對(duì)應(yīng)XML語(yǔ)法從而允許使用namespaces等。這些并不是核心功能,大家可以參照java.sun.com的有關(guān)資料了解功能的細(xì)節(jié),這里就不再闡述。

    posted @ 2006-03-23 09:54 java之海 閱讀(444) | 評(píng)論 (0)編輯 收藏

    簡(jiǎn)單的表達(dá)式語(yǔ)言


    Sun Microsystems 在 1997 年下半年推出了 Servlet API,將它定位為 CGI 開(kāi)發(fā)人員使用的一種功能強(qiáng)大的工具,這些開(kāi)發(fā)人員正在尋找比 CGI(通用網(wǎng)關(guān)接口)編程更高效和輕便的優(yōu)秀解決方案。但是,開(kāi)發(fā)人員很快就發(fā)現(xiàn) Servlet API 有其自身的缺點(diǎn),從代碼的可維護(hù)性和可擴(kuò)展性方面來(lái)看,該解決方案難以實(shí)施。在某種程度上,這種缺點(diǎn)促使團(tuán)隊(duì)開(kāi)發(fā)一種允許在 HTML 中嵌入 Java 代碼的解決方案 — JavaServer Pages (JSP) 因此而出現(xiàn)。

    不久以后,開(kāi)發(fā)人員意識(shí)到將表達(dá)與商務(wù)邏輯混合在一起的復(fù)雜 JSP 頁(yè)不易于理解和維護(hù)。不能編寫(xiě) scriplet 的頁(yè)面制作人員所面臨的另一個(gè)問(wèn)題是由于標(biāo)準(zhǔn)標(biāo)記集而帶來(lái)的 JSP 限制。這些限制使得難點(diǎn)變成利用 JSP 實(shí)施自定義標(biāo)記的機(jī)制來(lái)創(chuàng)建 JSP 自定義標(biāo)記。

    JSP 標(biāo)準(zhǔn)標(biāo)記庫(kù) (JSTL) 是自定義標(biāo)記庫(kù)的集合,它將許多 JSP 應(yīng)用程序通用的核心功能封裝為簡(jiǎn)單的標(biāo)記。它不再需要使用 JSP scriptlet
    和表達(dá)式,而使用表達(dá)式的更高級(jí)語(yǔ)法。它還實(shí)現(xiàn)了通用目的的功能,如迭代和條件化、數(shù)據(jù)管理格式化、XML 操作、數(shù)據(jù)庫(kù)訪問(wèn)、國(guó)際化和對(duì)本地化信息敏感的格式化標(biāo)記以及 SQL 標(biāo)記。JSTL 1.0 推出了 EL 的概念,但只限于 JSTL 標(biāo)記。在 JSP 2.0 中,您可以使用帶模板文本的 EL,甚至可以通過(guò) javax.servlet.jsp.el 獲得編程方式的訪問(wèn)。

    在我們了解 JSTL 如何適應(yīng)環(huán)境以及與 JSTL 表達(dá)式語(yǔ)言相關(guān)的限制以后,我們來(lái)看 JSP 2.0 的重要優(yōu)點(diǎn)之一 — JSP 表達(dá)式語(yǔ)言 (EL)。我們將特別涉及到以下內(nèi)容:

    JSP 表達(dá)式語(yǔ)言定義
    在無(wú)腳本的 JSP 頁(yè)面中支持 EL 的機(jī)制
    表達(dá)式語(yǔ)言語(yǔ)法
    JSP EL 中有效的表達(dá)式
    使用 EL 表達(dá)式

    JSP 表達(dá)式語(yǔ)言定義

    表達(dá)式語(yǔ)言的靈感來(lái)自于 ECMAScript 和 XPath 表達(dá)式語(yǔ)言,它提供了在 JSP 中簡(jiǎn)化表達(dá)式的方法。它是一種簡(jiǎn)單的語(yǔ)言,基于可用的命名空間(PageContext 屬性)、嵌套屬性和對(duì)集合、操作符(算術(shù)型、關(guān)系型和邏輯型)的訪問(wèn)符、映射到 Java 類(lèi)中靜態(tài)方法的可擴(kuò)展函數(shù)以及一組隱式對(duì)象。

    EL 提供了在 JSP 腳本編制元素范圍外使用運(yùn)行時(shí)表達(dá)式的功能。腳本編制元素是指頁(yè)面中能夠用于在 JSP 文件中嵌入 Java 代碼的元素。它們通常用于對(duì)象操作以及執(zhí)行那些影響所生成內(nèi)容的計(jì)算。JSP 2.0 將 EL 表達(dá)式添加為一種腳本編制元素。

    腳本編制元素具有三個(gè)從屬形式:

  • 聲明
  • Scriptlet
  • 表達(dá)式。

    讓我們來(lái)看代碼中的這三種從屬形式:

    <%! int i = 1; %> <% -- Declaration --%>
    <% for (int i =0; i < 10; i++) { %> <% -- Scriptlets --%>
    table.getColumn( ) <% -- Expression --%>

    在將 EL 添加到 JSP 工具包以后,可以使用更簡(jiǎn)單的語(yǔ)法來(lái)編寫(xiě)以上的代碼,而獲得與以上 JSP 元素相同的結(jié)果。EL 表達(dá)式的另一個(gè)優(yōu)勢(shì)是,可以在不允許使用上述任何腳本編制元素從屬形式的無(wú)腳本的 JSP 頁(yè)中使用它。但是必須注意,可以不使用三種腳本編制元素從屬形式中的任一種來(lái)編寫(xiě) JSP 頁(yè),而對(duì) JSP 頁(yè)是否應(yīng)該為無(wú)腳本形式的選擇則完全基于應(yīng)用程序的需求。如果您希望明確分開(kāi)表達(dá)與商務(wù)邏輯,則還可以選擇將頁(yè)面強(qiáng)制為無(wú)腳本形式。通過(guò)強(qiáng)制成為無(wú)腳本頁(yè) 面,必須通過(guò)其他元素(如 JavaBean、EL 表達(dá)式、自定義操作和標(biāo)準(zhǔn)標(biāo)記庫(kù))提供 JSP 頁(yè)的動(dòng)態(tài)行為。

    在無(wú)腳本的 JSP 頁(yè)中支持 EL 的機(jī)制

    有兩種機(jī)制可以確保頁(yè)面不包含任何腳本編制元素。每種機(jī)制還提供在無(wú)腳本的 JSP 頁(yè)中支持 EL 的方法。

    • 使用頁(yè)面指示:

      在使用頁(yè)面指示時(shí),您可以通過(guò)將 isELEnabled 指示的值相應(yīng)地設(shè)為“true”或“false”,指定是否支持 EL,如下所示:

      <%@ page isScriptingEnabled="true|false" isELEnabled="true|false"%>
    • 使用部署描述符的元素:

      當(dāng)使用部署描述符的元素時(shí),您可以通過(guò)在 標(biāo)記間包含布爾值“true”或“false”,指定是否支持 EL,如下所示:
      ...


      *.jsp
      true
      true


      ....

    表達(dá)式語(yǔ)言語(yǔ)法

    JSP 表達(dá)式語(yǔ)言允許頁(yè)面制作人員使用簡(jiǎn)單語(yǔ)法訪問(wèn)組件,如:


    ${expr}

    在以上的語(yǔ)法中,expr 代表有效的表達(dá)式。必須注意,該表達(dá)式可以與靜態(tài)文本混合,還可以與其他表達(dá)式結(jié)合成更大的表達(dá)式。

    JSP EL 中的有效表達(dá)式

    有效表達(dá)式可以包含文字、操作符、變量(對(duì)象引用)和函數(shù)調(diào)用。我們將分別了解這些有效表達(dá)式中的每一種:

    文字

    JSP 表達(dá)式語(yǔ)言定義可在表達(dá)式中使用的以下文字:

  • 文字文字的值

    Boolean

    true 和 false

    Integer

    與 Java 類(lèi)似。可以包含任何正數(shù)或負(fù)數(shù),例如 24、-45、567

    Floating Point

    與 Java 類(lèi)似。可以包含任何正的或負(fù)的浮點(diǎn)數(shù),例如 -1.8E-45、4.567

    String

    任何由單引號(hào)或雙引號(hào)限定的字符串。對(duì)于單引號(hào)、雙引號(hào)和反斜杠,使用反斜杠字符作為轉(zhuǎn)義序列。必須注意,如果在字符串兩端使用雙引號(hào),則單引號(hào)不需要轉(zhuǎn)義。

    Nullnull

    讓我們來(lái)看一些使用文字作為有效表達(dá)式的示例:

    ${false} <%-- evaluates to false --%>
    ${3*8)

    操作符

    JSP 表達(dá)式語(yǔ)言提供以下操作符,其中大部分是 Java 中常用的操作符:

    術(shù)語(yǔ)定義

    算術(shù)型

    +、-(二元)、*、/、div、%、mod、-(一元)

    邏輯型

    and、&&、or、||、!、not

    關(guān)系型

    ==、eq、!=、ne、、gt、<=、le、>=、ge。可以與其他值進(jìn)行比較,或與布爾型、字符串型、整型或浮點(diǎn)型文字進(jìn)行比較。

    空操作符是前綴操作,可用于確定值是否為空。

    條件型A ?B :C。根據(jù) A 賦值的結(jié)果來(lái)賦值 B 或 C。

    讓我們來(lái)看一些使用操作符作為有效表達(dá)式的示例:

    ${ (6 * 5) + 5 } <%-- evaluates to 35 --%>
    ${empty name}

    隱式對(duì)象

    JSP 表達(dá)式語(yǔ)言定義了一組隱式對(duì)象,其中許多對(duì)象在 JSP scriplet 和表達(dá)式中可用:

    術(shù)語(yǔ)定義

    pageContext

    JSP 頁(yè)的上下文。它可以用于訪問(wèn) JSP 隱式對(duì)象,如請(qǐng)求、響應(yīng)、會(huì)話、輸出、servletContext 等。例如,${pageContext.response} 為頁(yè)面的響應(yīng)對(duì)象賦值。

    此外,還提供幾個(gè)隱式對(duì)象,允許對(duì)以下對(duì)象進(jìn)行簡(jiǎn)易訪問(wèn):

    術(shù)語(yǔ)定義

    param

    將請(qǐng)求參數(shù)名稱映射到單個(gè)字符串參數(shù)值(通過(guò)調(diào)用 ServletRequest.getParameter (String name) 獲得)。getParameter (String) 方法返回帶有特定名稱的參數(shù)。表達(dá)式 $(param.name) 相當(dāng)于 request.getParameter (name)。

    paramValues

    將請(qǐng)求參數(shù)名稱映射到一個(gè)數(shù)值數(shù)組(通過(guò)調(diào)用 ServletRequest.getParameter (String name) 獲得)。它與 param 隱式對(duì)象非常類(lèi)似,但它檢索一個(gè)字符串?dāng)?shù)組而不是單個(gè)值。表達(dá)式 ${paramvalues.name) 相當(dāng)于 request.getParamterValues(name)。

    header

    將請(qǐng)求頭名稱映射到單個(gè)字符串頭值(通過(guò)調(diào)用 ServletRequest.getHeader(String name) 獲得)。表達(dá)式 ${header.name} 相當(dāng)于 request.getHeader(name)。

    headerValues

    將請(qǐng)求頭名稱映射到一個(gè)數(shù)值數(shù)組(通過(guò)調(diào)用 ServletRequest.getHeaders(String) 獲得)。它與頭隱式對(duì)象非常類(lèi)似。表達(dá)式 ${headerValues.name} 相當(dāng)于 request.getHeaderValues(name)。

    cookie將 cookie 名稱映射到單個(gè) cookie 對(duì)象。向服務(wù)器發(fā)出的客戶端請(qǐng)求可以獲得一個(gè)或多個(gè) cookie。表達(dá)式 ${cookie.name.value} 返回帶有特定名稱的第一個(gè) cookie 值。如果請(qǐng)求包含多個(gè)同名的 cookie,則應(yīng)該使用 ${headerValues.name} 表達(dá)式。
    initParam將上下文初始化參數(shù)名稱映射到單個(gè)值(通過(guò)調(diào)用 ServletContext.getInitparameter(String name) 獲得)。

    除了上述兩種類(lèi)型的隱式對(duì)象之外,還有些對(duì)象允許訪問(wèn)多種范圍的變量,如 Web 上下文、會(huì)話、請(qǐng)求、頁(yè)面:

    術(shù)語(yǔ)定義

    pageScope

    將頁(yè)面范圍的變量名稱映射到其值。例如,EL 表達(dá)式可以使用 ${pageScope.objectName} 訪問(wèn)一個(gè) JSP 中頁(yè)面范圍的對(duì)象,還可以使用 ${pageScope.objectName.attributeName} 訪問(wèn)對(duì)象的屬性。

    requestScope

    將請(qǐng)求范圍的變量名稱映射到其值。該對(duì)象允許訪問(wèn)請(qǐng)求對(duì)象的屬性。例如,EL 表達(dá)式可以使用 ${requestScope.objectName} 訪問(wèn)一個(gè) JSP 請(qǐng)求范圍的對(duì)象,還可以使用 ${requestScope.objectName.attributeName} 訪問(wèn)對(duì)象的屬性。

    sessionScope

    將會(huì)話范圍的變量名稱映射到其值。該對(duì)象允許訪問(wèn)會(huì)話對(duì)象的屬性。例如:

    <% session.put (name", "John Doe"); %>
    $sessionScope.name} <%-- evaluates to John Doe --%>
    <%= session.get("name"); %> <%-- This is an equivalent scripting expression --%>

    applicationScope

    將應(yīng)用程序范圍的變量名稱映射到其值。該隱式對(duì)象允許訪問(wèn)應(yīng)用程序范圍的對(duì)象。

    必須注意,當(dāng)表達(dá)式根據(jù)名稱引用這些對(duì)象之一時(shí),返回的是相應(yīng)的對(duì)象而不是相應(yīng)的屬性。例如:即使現(xiàn)有的 pageContext 屬性包含某些其他值,${pageContext} 也返回 PageContext 對(duì)象。

    使用 EL 表達(dá)式

    EL 表達(dá)式可用于兩種情況:

    • 作為標(biāo)準(zhǔn)操作和自定義操作中的屬性值

    • 在 JSP 文件的模板文本中,如 HTML 或非 JSP 元素 — 在這種情況下,模板文本中的表達(dá)式被賦值并插入到當(dāng)前的輸出中。但是,必須注意,如果標(biāo)記的主體被聲明為與標(biāo)記相關(guān),則不會(huì)對(duì)表達(dá)式賦值。
    posted @ 2006-03-23 09:51 java之海 閱讀(629) | 評(píng)論 (0)編輯 收藏
    <action path="/articleEdit" attribute="articleForm" input="/ArticleEdit.jsp" name="articleForm" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? type="com.xianeizhu.struts.action.ArticleEditAction">
    <forward name="articleList" path="/articleList.do" redirect="true" />
    </action>

    redirect="true"造成錯(cuò)誤
    Cannot find bean blacktags in any scope
    posted @ 2006-03-21 16:06 java之海 閱讀(617) | 評(píng)論 (0)編輯 收藏
    使用MyEclipse開(kāi)發(fā)web項(xiàng)目,所生成的web.xml頭部如下:
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    等到要在web.xml加入taglib
        <taglib>
            <taglib-uri>/WEB-INF/tiles.tld</taglib-uri>
            <taglib-location>/WEB-INF/tiles.tld</taglib-location>
        </taglib>
    始終會(huì)報(bào)錯(cuò)
    后來(lái)把頭部改為
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app
      PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
      "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">

    <web-app>
    ......
    </web-app>
    終于可以加taglib了,但原來(lái)的filter又報(bào)錯(cuò),最后把
    filter和filter-mapping放在最前面,終于ok.

    posted @ 2006-03-14 16:02 java之海 閱讀(5005) | 評(píng)論 (6)編輯 收藏
    推薦一個(gè)java GUI設(shè)計(jì)的極品網(wǎng)站

    look and feel: http://www.javootoo.com/
    java開(kāi)源: http://www.open-open.com/

  • 3D Look And Feel
  • Audio Look And Feel
  • Kunststoff Look&Feel
  • Metouia Look & Feel
  • NextStep Look And Feel
  • Teknolust Look And Feel
  • xp look and feel

  • posted @ 2006-03-07 09:46 java之海 閱讀(309) | 評(píng)論 (0)編輯 收藏
     

    Table of ASCII Characters

    This table lists the ASCII characters and their decimal, octal and hexadecimal numbers. Characters which appear as names in parentheses (e.g., (nl)) are non-printing characters. A table of the common non-printing characters appears after this table.

    Char  Dec  Oct  Hex | Char  Dec  Oct  Hex | Char  Dec  Oct  Hex | Char Dec  Oct   Hex
    -------------------------------------------------------------------------------------
    (nul) 0 0000 0x00 | (sp) 32 0040 0x20 | @ 64 0100 0x40 | ` 96 0140 0x60
    (soh) 1 0001 0x01 | ! 33 0041 0x21 | A 65 0101 0x41 | a 97 0141 0x61
    (stx) 2 0002 0x02 | " 34 0042 0x22 | B 66 0102 0x42 | b 98 0142 0x62
    (etx) 3 0003 0x03 | # 35 0043 0x23 | C 67 0103 0x43 | c 99 0143 0x63
    (eot) 4 0004 0x04 | $ 36 0044 0x24 | D 68 0104 0x44 | d 100 0144 0x64
    (enq) 5 0005 0x05 | % 37 0045 0x25 | E 69 0105 0x45 | e 101 0145 0x65
    (ack) 6 0006 0x06 | & 38 0046 0x26 | F 70 0106 0x46 | f 102 0146 0x66
    (bel) 7 0007 0x07 | ' 39 0047 0x27 | G 71 0107 0x47 | g 103 0147 0x67
    (bs) 8 0010 0x08 | ( 40 0050 0x28 | H 72 0110 0x48 | h 104 0150 0x68
    (ht) 9 0011 0x09 | ) 41 0051 0x29 | I 73 0111 0x49 | i 105 0151 0x69
    (nl) 10 0012 0x0a | * 42 0052 0x2a | J 74 0112 0x4a | j 106 0152 0x6a
    (vt) 11 0013 0x0b | + 43 0053 0x2b | K 75 0113 0x4b | k 107 0153 0x6b
    (np) 12 0014 0x0c | , 44 0054 0x2c | L 76 0114 0x4c | l 108 0154 0x6c
    (cr) 13 0015 0x0d | - 45 0055 0x2d | M 77 0115 0x4d | m 109 0155 0x6d
    (so) 14 0016 0x0e | . 46 0056 0x2e | N 78 0116 0x4e | n 110 0156 0x6e
    (si) 15 0017 0x0f | / 47 0057 0x2f | O 79 0117 0x4f | o 111 0157 0x6f
    (dle) 16 0020 0x10 | 0 48 0060 0x30 | P 80 0120 0x50 | p 112 0160 0x70
    (dc1) 17 0021 0x11 | 1 49 0061 0x31 | Q 81 0121 0x51 | q 113 0161 0x71
    (dc2) 18 0022 0x12 | 2 50 0062 0x32 | R 82 0122 0x52 | r 114 0162 0x72
    (dc3) 19 0023 0x13 | 3 51 0063 0x33 | S 83 0123 0x53 | s 115 0163 0x73
    (dc4) 20 0024 0x14 | 4 52 0064 0x34 | T 84 0124 0x54 | t 116 0164 0x74
    (nak) 21 0025 0x15 | 5 53 0065 0x35 | U 85 0125 0x55 | u 117 0165 0x75
    (syn) 22 0026 0x16 | 6 54 0066 0x36 | V 86 0126 0x56 | v 118 0166 0x76
    (etb) 23 0027 0x17 | 7 55 0067 0x37 | W 87 0127 0x57 | w 119 0167 0x77
    (can) 24 0030 0x18 | 8 56 0070 0x38 | X 88 0130 0x58 | x 120 0170 0x78
    (em) 25 0031 0x19 | 9 57 0071 0x39 | Y 89 0131 0x59 | y 121 0171 0x79
    (sub) 26 0032 0x1a | : 58 0072 0x3a | Z 90 0132 0x5a | z 122 0172 0x7a
    (esc) 27 0033 0x1b | ; 59 0073 0x3b | [ 91 0133 0x5b | { 123 0173 0x7b
    (fs) 28 0034 0x1c | < 60 0074 0x3c | \ 92 0134 0x5c | | 124 0174 0x7c
    (gs) 29 0035 0x1d | = 61 0075 0x3d | ] 93 0135 0x5d | } 125 0175 0x7d
    (rs) 30 0036 0x1e | > 62 0076 0x3e | ^ 94 0136 0x5e | ~ 126 0176 0x7e
    (us) 31 0037 0x1f | ? 63 0077 0x3f | _ 95 0137 0x5f | (del) 127 0177 0x7f
    ASCII Name Description C Escape Sequence
    nul null byte \0
    bel bell character \a
    bs backspace \b
    ht horizontal tab \t
    np formfeed \f
    nl newline \n
    cr carriage return \r
    vt vertical tab
    esc escape
    sp space
    posted @ 2006-03-07 09:45 java之海 閱讀(349) | 評(píng)論 (0)編輯 收藏
    mysql error number 1005 can't create table errno: 150

    這是建外鍵的列與要關(guān)聯(lián)的列類(lèi)型不匹配造成的。
    一個(gè)表用powerdesigner導(dǎo)入的整型長(zhǎng)度為11
    另一個(gè)直接再mysql中建立的表默認(rèn)整型長(zhǎng)度是10

    造成不能建立外鍵
    posted @ 2006-03-03 17:09 java之海 閱讀(1287) | 評(píng)論 (0)編輯 收藏

    Tomcat服務(wù)器配置參考

    Host容器

    概述

    Host元素代表一個(gè)虛擬主機(jī),虛擬主機(jī)將服務(wù)器的網(wǎng)絡(luò)名(比如www.mycompany.com)和運(yùn)行Catalinade的某個(gè)特定服務(wù)器聯(lián)系起來(lái)。為了生效,網(wǎng)絡(luò)名稱必須在管理你所在的Internet域的DNS服務(wù)器進(jìn)行登記---請(qǐng)聯(lián)系你的網(wǎng)絡(luò)管理員。

    在許多情況下,系統(tǒng)管理員可能希望為同一個(gè)虛擬主機(jī)或應(yīng)用關(guān)聯(lián)多個(gè)網(wǎng)絡(luò)名稱(比如www.mycompany.com和company.com)。這可以利用下面討論的Host Name Alias特征來(lái)完成。

    在Engine元素中可以嵌套一個(gè)或多個(gè)Host元素。在Host元素中可以嵌套context元素。在與每個(gè)Engine相關(guān)聯(lián)的所有Host中,必須有一個(gè)Host的名稱與Engine的defaultHost屬性匹配。

    以下的描述使用變量$CATALINA_HOME來(lái)指Tomcat 5安裝的目錄。大多數(shù)的相對(duì)路徑都是以該目錄為基準(zhǔn)。但是,通過(guò)設(shè)置CATALINA_BASE目錄,可以運(yùn)行多個(gè)Tomcat 5實(shí)例,這時(shí)你應(yīng)該使用$CATALINA_BASE來(lái)作為目錄基準(zhǔn),而不是使用$CATALINA_HOME。

    屬性
    公共屬性

    所有Host的實(shí)現(xiàn)必須支持如下屬性:

    屬性 描述
    appBase

    虛擬主機(jī)的Applicaton Base目錄。這是在該虛擬主機(jī)上發(fā)布web應(yīng)用的目錄路徑。你可以指定絕對(duì)路徑,或者使用相對(duì)于$CATALINA_HOME的路徑。有關(guān)web應(yīng)用的自動(dòng)識(shí)別和發(fā)布的更多信息,請(qǐng)參考應(yīng)用自動(dòng)發(fā)布。

    autoDeploy

    這個(gè)標(biāo)志表示,在Tomcat運(yùn)行的時(shí)候,放到appBase目錄下的新的web應(yīng)用是否自動(dòng)發(fā)布。缺省為true。這方面的更多信息參考應(yīng)用自動(dòng)發(fā)布

    backgroundProcessorDelay

    這個(gè)值代表在該host及其子容器(包括所有的wrappers)上調(diào)用backgroundProcess方法的延時(shí),以秒為單位。如果延時(shí)值非負(fù),子容器不會(huì)被調(diào)用,這意味著子容器使用自己的處理線程。如果該值為正,會(huì)創(chuàng)建一個(gè)新的線程。在等待指定的時(shí)間以后,該線程在Host及其子容器上調(diào)用backgroundProcess方法。Host使用后臺(tái)處理進(jìn)行與web應(yīng)用實(shí)時(shí)發(fā)布有關(guān)的操作。如果沒(méi)有指定,缺省值是-1,說(shuō)明host依賴其所屬的Engine的后臺(tái)處理。

    className

    實(shí)現(xiàn)的Java類(lèi)名。該類(lèi)必須實(shí)現(xiàn)org.apache.catalina.Host接口。如果沒(méi)有指定,使用標(biāo)準(zhǔn)實(shí)現(xiàn)(在下面定義)

    deployOnStartup

    這個(gè)標(biāo)志表明這個(gè)host的web應(yīng)用是否由host configurator 自動(dòng)發(fā)布。缺省為true。這方面的更多信息參考自動(dòng)應(yīng)用發(fā)布。

    name

    虛擬主機(jī)的網(wǎng)絡(luò)名稱,也就是在DNS服務(wù)器上注冊(cè)的名稱。嵌套在Engine的所有Host中,必須有一個(gè)Host的名字與Engine的defaultHost屬性相同。如果想為同一個(gè)虛擬主機(jī)指定多個(gè)網(wǎng)絡(luò)名稱,參考主機(jī)名別名。

     

    標(biāo)準(zhǔn)實(shí)現(xiàn)

    Host的標(biāo)準(zhǔn)實(shí)現(xiàn)是org.apache.catalina.core.StandardHost。它還支持如下的附加屬性

    屬性 描述
    debug

    與Engine相關(guān)聯(lián)的Logger的調(diào)試信息的詳細(xì)程度。數(shù)字越大,輸出越詳細(xì)。如果沒(méi)有指定,缺省值為0。

    deployXML

    如果不想使用Context XML配置文件來(lái)發(fā)布web應(yīng)用,設(shè)為false。同時(shí)也失去了利用manager應(yīng)用程序安裝web應(yīng)用或者“.war”文件的能力(這些web應(yīng)用或.war文件不在Host的配置基準(zhǔn)目錄$CATALINA_HOME/conf/[engine_name]/[host_name]下面)

    web應(yīng)用使用catalina的安全許可發(fā)布,如果需要讓不可信的用戶管理web應(yīng)用,這個(gè)值可以設(shè)為false。缺省為true。

    errorReportValveClass

    Host使用的錯(cuò)誤報(bào)告valve的Java類(lèi)名。這個(gè)valve的責(zé)任是輸出錯(cuò)誤報(bào)告。設(shè)置這個(gè)值可以定制Tomcat產(chǎn)生的錯(cuò)誤頁(yè)面的格式。這個(gè)類(lèi)必須實(shí)現(xiàn)org.apache.catalina.Valve接口。如果沒(méi)有指定,使用缺省值

    og.apache.catalina.valvees.ErrorReportValve.

    unpackWARs

    如果希望將位于appBase目錄下的WAR文件解壓縮成對(duì)應(yīng)的目錄結(jié)構(gòu),設(shè)為true。如果希望直接從WAR文件運(yùn)行web應(yīng)用,設(shè)為false。更多信息參考應(yīng)用自動(dòng)發(fā)布。

    workDir

    Host的web應(yīng)用使用的臨時(shí)目錄的路徑。每個(gè)應(yīng)用都有自己的子目錄,用于臨時(shí)的讀寫(xiě)。如果在Context中設(shè)置了workDir屬性,它將會(huì)覆蓋Host的workDir屬性。如Servlet Specification中所述,通過(guò)servlet context的屬性javax.servlet.context.tempdir,這個(gè)目錄可以被servlet使用。如果沒(méi)有指定,使用$CATALINA_HOME/work下面的合適的目錄。

    嵌套組件

    可以在Host元素中嵌套一個(gè)或者多個(gè)Context元素,每個(gè)Context元素代表這個(gè)虛擬主機(jī)下的一個(gè)不同的web應(yīng)用。同時(shí),你可以嵌套一個(gè)DefaultContext元素,用來(lái)定義后續(xù)發(fā)布的web應(yīng)用的缺省值

    可以在Host元素中選擇嵌套一個(gè)DefaultContext元素,用來(lái)定義自動(dòng)發(fā)布的web應(yīng)用的缺省特性。

    下列元素可以嵌套在Host元素中,但至多只能嵌套一個(gè)實(shí)例:

    • Logger - 配置一個(gè)logger,用來(lái)接收和處理Host的所有日志消息,以及這個(gè)Host的所有Context的日志消息(除非被低一級(jí)的Logger配置覆蓋)
    • Realm -配置一個(gè)realm,Realm的用戶數(shù)據(jù)庫(kù)以及用戶角色被這個(gè)Host的所有Context共享(除非被低一級(jí)的Realm配置覆蓋)
    專(zhuān)有特征
    訪問(wèn)日志

    正常情況下,運(yùn)行web服務(wù)器會(huì)生成訪問(wèn)日志。訪問(wèn)日志以標(biāo)準(zhǔn)格式為每個(gè)請(qǐng)求輸出一行信息。Catalina包含一個(gè)可選的Valve實(shí)現(xiàn),可以用標(biāo)準(zhǔn)格式生成日志,還可以使用任意定制的格式。

    通過(guò)在Engine,Host或者Context中嵌套一個(gè)Valve元素,Catalina會(huì)為該容器處理的所有請(qǐng)求創(chuàng)建訪問(wèn)日志,如下所示:

    <Host name="localhost" ...>
      ...
      <Valve className="org.apache.catalina.valves.AccessLogValve"
             prefix="localhost_access_log." suffix=".txt"
             pattern="common"/>
      ...
    </Host>
    
    參考Access Log Valve,以獲得更多配置屬性的信息;
    應(yīng)用自動(dòng)發(fā)布

    如果使用標(biāo)準(zhǔn)的Host實(shí)現(xiàn),當(dāng)Catalina第一次啟動(dòng)時(shí),如果deployOnStartup屬性為true,tomcat會(huì)自動(dòng)采取如下的步驟:

    • 假定$CATALINA_HOME/conf/[engine_name]/[host_name]目錄中的任何XML文件都包含一個(gè)Context元素(以及它的相關(guān)的子元素),通常情況下,這個(gè)<Context>的docBase屬性指向一個(gè)web應(yīng)用目錄的絕對(duì)路徑,或者是WAR文件的絕對(duì)路徑。
    • 如果WAR文件對(duì)應(yīng)的目錄不存在,則這個(gè)WAR文件會(huì)被自動(dòng)展開(kāi),除非unpackWARs屬性設(shè)為false。在重新發(fā)布更新后的WAR文件時(shí),重新啟動(dòng)Tomcat之前一定要?jiǎng)h除展開(kāi)后的目錄,這樣更新后的WAR文件才會(huì)被重新展開(kāi)(如果使能了auto deployer,它會(huì)自動(dòng)完成這項(xiàng)工作)
    • application base目錄下的任何子目錄,如果包含/WEB-INF/web.xml文件,Tomcat認(rèn)為這個(gè)一個(gè)展開(kāi)后的web應(yīng)用,會(huì)為這個(gè)目錄自動(dòng)產(chǎn)生一個(gè)Context元素,即使這個(gè)目錄沒(méi)有在conf/server.xml文件中出現(xiàn)。產(chǎn)生的Context會(huì)使用DefaultContext中的屬性來(lái)配置。自動(dòng)產(chǎn)生的Context的context路徑是“/”后面跟上目錄名,除非目錄名是ROOT,這種情況下context路徑是空字符串(“”);

    除了啟動(dòng)時(shí)候的自動(dòng)發(fā)布以外,在Tomcat運(yùn)行的時(shí)候,當(dāng)新的XML 配置文件,WAR文件或者子目錄(包含新的web應(yīng)用)放到appBase目錄下,或者當(dāng)XML配置文件放到$CATALINA_HOME/conf/[engine_name]/[host_name]目錄)的時(shí)候,該web應(yīng)用被自動(dòng)發(fā)布。auto deployer也負(fù)責(zé)跟蹤web應(yīng)用的如下變化:

    • 如果更新了WEB-INF/web.xml文件,會(huì)觸發(fā)web應(yīng)用的重載;
    • 如果WAR文件被更新,并且WAR文件已經(jīng)展開(kāi),首先刪除展開(kāi)的web應(yīng)用,然后發(fā)布更新的WAR文件;
    • 如果XML配置文件被更新,首先刪除該應(yīng)用(但是不刪除任何展開(kāi)以后的目錄),然后發(fā)布相關(guān)的web應(yīng)用
    主機(jī)名別名

    在許多服務(wù)器環(huán)境中,多個(gè)網(wǎng)絡(luò)名稱可能指向同一個(gè)IP地址(比如,www.mycompany.com和company.com都指向192.168.1.1)。正常情況下,每個(gè)網(wǎng)絡(luò)名稱應(yīng)該在conf/server.xml中對(duì)應(yīng)一個(gè)Host元素,每個(gè)Host元素有自己的一套web應(yīng)用。

    但是,有些情況下,可能希望兩個(gè)或者更多網(wǎng)絡(luò)名稱解析到同一個(gè)虛擬主機(jī)上,運(yùn)行相同的一套web應(yīng)用。這種情況的典型用途是公司網(wǎng)站。用戶可以使用www.mycompany.com和company.com訪問(wèn)同樣的內(nèi)容和應(yīng)用。

    通過(guò)在Host元素中嵌套一個(gè)或者多個(gè)Alias元素,可以完成上述功能。

     

    <Host name="www.mycompany.com" ...>
      ...
      <Alias>mycompany.com</Alias>
      ...
    </Host>
    

    為了使這個(gè)策略生效,所有的網(wǎng)絡(luò)名稱必須在DNS服務(wù)器登記,指向運(yùn)行Catalina實(shí)例的同一臺(tái)計(jì)算機(jī)。

     

    生命期Listeners

    如果一個(gè)Java對(duì)象需要知道Context什么時(shí)候啟動(dòng),什么時(shí)候停止,可以在這個(gè)對(duì)象中嵌套一個(gè)Listener元素。該Listener元素必須實(shí)現(xiàn)了org.apache.catalina.LifecycleListener接口,在發(fā)生對(duì)應(yīng)的生命期事件的時(shí)候,通知該Listener。可以按照如下的格式配置這樣的Listener:

    <Host name="localhost" ...>
      ...
      <Listener className="com.mycompany.mypackage.MyListener" ... >
      ...
    </Host>
    
    注意,一個(gè)listener可以具有任意多的附加屬性。屬性名與JavaBean的屬性名相對(duì)應(yīng),使用標(biāo)準(zhǔn)的屬性命名方法。
    請(qǐng)求過(guò)濾器
    對(duì)每個(gè)發(fā)送到Engine,Host或者Context的請(qǐng)求,可以要求Catalina檢查IP地址或主機(jī)名稱。Catalina使用一系列配置好的“接受”或者“拒絕”過(guò)濾器對(duì)客戶端的地址或者主機(jī)名進(jìn)行檢查,過(guò)濾器是按照正則表達(dá)式語(yǔ)法定義的,由Jakarta Regexp正則表達(dá)式庫(kù)支持。不被接受的請(qǐng)求會(huì)返回一個(gè)HTTP“Forbidden”錯(cuò)誤。下面是過(guò)濾器的定義。
    <Host name="localhost" ...>
      ...
      <Valve className="org.apache.catalina.valves.RemoteHostValve"
             allow="*.mycompany.com,www.yourcompany.com"/>
      <Valve className="org.apache.catalina.valves.RemoteAddrValve"
             deny="192.168.1.*"/>
      ...
    </Host>
    

     

    如果想知道過(guò)濾器支持的更多選項(xiàng)的信息,參考Remote Address Filter和Remote Host Filter

    單次登錄(Single Sign On

    在許多環(huán)境尤其是門(mén)戶環(huán)境下,對(duì)特定虛擬主機(jī)上的一套web應(yīng)用,只希望對(duì)用戶進(jìn)行一次認(rèn)證。這可以在Host元素中嵌套如下的元素完成:

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

    單次登錄根據(jù)如下規(guī)則運(yùn)作:

    • 這個(gè)虛擬主機(jī)的所有web應(yīng)用必須共享同一個(gè)Realm。在實(shí)際情況中,這意味著你可以在這個(gè)Host元素中嵌套R(shí)ealm元素(或者是Engine元素),但不能在web應(yīng)用對(duì)應(yīng)的Context中嵌套R(shí)ealm元素
    • 如果用戶只訪問(wèn)這個(gè)虛擬主機(jī)上任意web應(yīng)用的沒(méi)有加保護(hù)的資源,他們不會(huì)被要求認(rèn)證;
    • 一旦用戶訪問(wèn)這個(gè)虛擬主機(jī)下的任意web應(yīng)用的保護(hù)資源,用戶會(huì)被要求認(rèn)證。使用正在訪問(wèn)的web應(yīng)用的login方法;
    • 一旦認(rèn)證通過(guò),與這個(gè)用戶相關(guān)聯(lián)的角色決定了它對(duì)所有的web應(yīng)用的訪問(wèn)控制權(quán)限;而不需要對(duì)每個(gè)應(yīng)用單獨(dú)認(rèn)證;
    • 一旦用戶從某個(gè)web應(yīng)用注銷(xiāo)(比如,如果使用了基于表單的login,對(duì)應(yīng)的session過(guò)期或者無(wú)效),用戶在所有web應(yīng)用的session都會(huì)失效;任何后續(xù)的對(duì)保護(hù)資源的訪問(wèn)會(huì)要求對(duì)用戶重新認(rèn)證;
    • 單次登錄特征使用HTTP cookies傳輸令牌,將每個(gè)請(qǐng)求和用戶身份聯(lián)系起來(lái),因此客戶端必須支持cookies;
    用戶Web應(yīng)用

    許多web服務(wù)器會(huì)自動(dòng)將以"~"和用戶名開(kāi)始的URI映射到用戶主目錄下的某個(gè)目錄(通常為public_html)。在Catalina中,通過(guò)使用特殊的Listener元素,可以完成上述功能

    在利用/etc/password來(lái)標(biāo)識(shí)有效用戶的Unix系統(tǒng)下使用如下配置:

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

    在不使用/etc/password的服務(wù)器上,可以要求Catalina將指定的基準(zhǔn)目錄下的所有目錄(比如c:\homes)看成是用戶主目錄:

    <Host name="localhost" ...>
      ...
      <Listener className="org.apache.catalina.startup.UserConfig"
                directoryName="public_html"
                homeBase=c:\Homes"
                userClass="org.apache.catalina.startup.HomesUserDatabase"/>
      ...
    </Host>
    

    如果某個(gè)名為craigmcc的用戶的主目錄已經(jīng)設(shè)置好,通過(guò)使用如下URL,可以瀏覽它的內(nèi)容:

    http://www.mycompany.com:8080/~craigmcc
    

     

    使用這個(gè)特征需要注意如下幾個(gè)問(wèn)題:

    • 每個(gè)用戶web應(yīng)用會(huì)使用該Host的DefaultContext元素定義的特征發(fā)布;
    • 包含多個(gè)Listener元素的實(shí)例也是有效的。但是,這只在你希望配置多個(gè)homeBase目錄情況下才有意義;
    • 執(zhí)行Catalina的用戶名對(duì)每個(gè)用戶的web應(yīng)用目錄以及它的所有內(nèi)容必須有讀的權(quán)限;
    posted @ 2006-02-16 17:05 java之海 閱讀(3044) | 評(píng)論 (0)編輯 收藏

    首先在數(shù)據(jù)訪問(wèn)層讀取一條記錄并返回該類(lèi)的Form

       if ("request".equals(mapping.getScope())) {

        request.setAttribute(mapping.getAttribute(), articleForm);
       } else {

        session.setAttribute(mapping.getAttribute(), articleForm);
       }
    上面的代碼把Form放入Request并返回給客戶端

    在界面顯示的jsp中有如下聲明

      <html:form action="/articleEdit" name="articleForm" type="com.xianeizhu.struts.form.ArticleForm" scope="request">
    ....
    <html:text property="title" />
    顯示該Form的title屬性


    scope="request"如果漏掉,會(huì)造成數(shù)據(jù)顯示為空

    posted @ 2006-02-15 11:51 java之海 閱讀(348) | 評(píng)論 (0)編輯 收藏
    CREATE TABLE <<table name>> AS SELECT * from <<old table>>
    posted @ 2006-02-14 09:19 java之海 閱讀(200) | 評(píng)論 (0)編輯 收藏
    延遲初始化錯(cuò)誤(ERROR LazyInitializer)是如何產(chǎn)生的?

    選自<<精通Hibernate:Java對(duì)象持久化技術(shù)詳解>> 作者:孫衛(wèi)琴 來(lái)源:www.javathinker.org
    如果轉(zhuǎn)載,請(qǐng)標(biāo)明出處,謝謝


    延遲初始化錯(cuò)誤是運(yùn)用Hibernate開(kāi)發(fā)項(xiàng)目時(shí)最常見(jiàn)的錯(cuò)誤。如果對(duì)一個(gè)類(lèi)或者集合配置了延遲檢索策略,那么必須當(dāng)代理類(lèi)實(shí)例或代理集合處于持久化狀態(tài)(即處于Session范圍內(nèi))時(shí),才能初始化它。如果在游離狀態(tài)時(shí)才初始化它,就會(huì)產(chǎn)生延遲初始化錯(cuò)誤。

    下面把Customer.hbm.xml文件的<class>元素的lazy屬性設(shè)為true,表示使用延遲檢索策略:

    <class name="mypack.Customer" table="CUSTOMERS" lazy="true">

    當(dāng)執(zhí)行Session的load()方法時(shí),Hibernate不會(huì)立即執(zhí)行查詢CUSTOMERS表的select語(yǔ)句,僅僅返回Customer類(lèi)的代理類(lèi)的實(shí)例,這個(gè)代理類(lèi)具由以下特征:

    (1) 由Hibernate在運(yùn)行時(shí)動(dòng)態(tài)生成,它擴(kuò)展了Customer類(lèi),因此它繼承了Customer類(lèi)的所有屬性和方法,但它的實(shí)現(xiàn)對(duì)于應(yīng)用程序是透明的。
    (2) 當(dāng)Hibernate創(chuàng)建Customer代理類(lèi)實(shí)例時(shí),僅僅初始化了它的OID屬性,其他屬性都為null,因此這個(gè)代理類(lèi)實(shí)例占用的內(nèi)存很少。
    (3) 當(dāng)應(yīng)用程序第一次訪問(wèn)Customer代理類(lèi)實(shí)例時(shí)(例如調(diào)用customer.getXXX()或customer.setXXX()方法),Hibernate會(huì)初始化代理類(lèi)實(shí)例,在初始化過(guò)程中執(zhí)行select語(yǔ)句,真正從數(shù)據(jù)庫(kù)中加載Customer對(duì)象的所有數(shù)據(jù)。但有個(gè)例外,那就是當(dāng)應(yīng)用程序訪問(wèn)Customer代理類(lèi)實(shí)例的getId()方法時(shí),Hibernate不會(huì)初始化代理類(lèi)實(shí)例,因?yàn)樵趧?chuàng)建代理類(lèi)實(shí)例時(shí)OID就存在了,不必到數(shù)據(jù)庫(kù)中去查詢。

    提示:Hibernate采用CGLIB工具來(lái)生成持久化類(lèi)的代理類(lèi)。CGLIB是一個(gè)功能強(qiáng)大的Java字節(jié)碼生成工具,它能夠在程序運(yùn)行時(shí)動(dòng)態(tài)生成擴(kuò)展Java類(lèi)或者實(shí)現(xiàn)Java接口的代理類(lèi)。關(guān)于CGLIB的更多知識(shí),請(qǐng)參考:http://cglib.sourceforge.net/。

    以下代碼先通過(guò)Session的load()方法加載Customer對(duì)象,然后訪問(wèn)它的name屬性:

    tx = session.beginTransaction();
    Customer customer=(Customer)session.load(Customer.class,new Long(1));
    customer.getName();
    tx.commit();

    在運(yùn)行session.load()方法時(shí)Hibernate不執(zhí)行任何select語(yǔ)句,僅僅返回Customer類(lèi)的代理類(lèi)的實(shí)例,它的OID為1,這是由load()方法的第二個(gè)參數(shù)指定的。當(dāng)應(yīng)用程序調(diào)用customer.getName()方法時(shí),Hibernate會(huì)初始化Customer代理類(lèi)實(shí)例,從數(shù)據(jù)庫(kù)中加載Customer對(duì)象的數(shù)據(jù),執(zhí)行以下select語(yǔ)句:

    select * from CUSTOMERS where ID=1;
    select * from ORDERS where CUSTOMER_ID=1;

    當(dāng)<class>元素的lazy屬性為true,會(huì)影響Session的load()方法的各種運(yùn)行時(shí)行為,下面舉例說(shuō)明。

    1.如果加載的Customer對(duì)象在數(shù)據(jù)庫(kù)中不存在,Session的load()方法不會(huì)拋出異常,只有當(dāng)運(yùn)行customer.getName()方法時(shí)才會(huì)拋出以下異常:

    ERROR LazyInitializer:63 - Exception initializing proxy
    net.sf.hibernate.ObjectNotFoundException: No row with the given identifier exists: 1, of class:
    mypack.Customer

    2.如果在整個(gè)Session范圍內(nèi),應(yīng)用程序沒(méi)有訪問(wèn)過(guò)Customer對(duì)象,那么Customer代理類(lèi)的實(shí)例一直不會(huì)被初始化,Hibernate不會(huì)執(zhí)行任何select語(yǔ)句。以下代碼試圖在關(guān)閉Session后訪問(wèn)Customer游離對(duì)象:

    tx = session.beginTransaction();
    Customer customer=(Customer)session.load(Customer.class,new Long(1));
    tx.commit();
    session.close();
    customer.getName();

    由于引用變量customer引用的Customer代理類(lèi)的實(shí)例在Session范圍內(nèi)始終沒(méi)有被初始化,因此在執(zhí)行customer.getName()方法時(shí),Hibernate會(huì)拋出以下異常:

    ERROR LazyInitializer:63 - Exception initializing proxy
    net.sf.hibernate.HibernateException: Could not initialize proxy - the owning Session was closed

    由此可見(jiàn),Customer代理類(lèi)的實(shí)例只有在當(dāng)前Session范圍內(nèi)才能被初始化。

    3.net.sf.hibernate.Hibernate類(lèi)的initialize()靜態(tài)方法用于在Session范圍內(nèi)顯式初始化代理類(lèi)實(shí)例,isInitialized()方法用于判斷代理類(lèi)實(shí)例是否已經(jīng)被初始化。例如:

    tx = session.beginTransaction();
    Customer customer=(Customer)session.load(Customer.class,new Long(1));
    if(!Hibernate.isInitialized(customer))
    Hibernate.initialize(customer);
    tx.commit();
    session.close();
    customer.getName();

    以上代碼在Session范圍內(nèi)通過(guò)Hibernate類(lèi)的initialize()方法顯式初始化了Customer代理類(lèi)實(shí)例,因此當(dāng)Session關(guān)閉后,可以正常訪問(wèn)Customer游離對(duì)象。

    4.當(dāng)應(yīng)用程序訪問(wèn)代理類(lèi)實(shí)例的getId()方法時(shí),不會(huì)觸發(fā)Hibernate初始化代理類(lèi)實(shí)例的行為,例如:

    tx = session.beginTransaction();
    Customer customer=(Customer)session.load(Customer.class,new Long(1));
    customer.getId();
    tx.commit();
    session.close();
    customer.getName();

    當(dāng)應(yīng)用程序訪問(wèn)customer.getId()方法時(shí),該方法直接返回Customer代理類(lèi)實(shí)例的OID值,無(wú)需查詢數(shù)據(jù)庫(kù)。由于引用變量customer始終引用的是沒(méi)有被初始化的Customer代理類(lèi)實(shí)例,因此當(dāng)Session關(guān)閉后再執(zhí)行customer.getName()方法,Hibernate會(huì)拋出以下異常:

    ERROR LazyInitializer:63 - Exception initializing proxy
    net.sf.hibernate.HibernateException: Could not initialize proxy - the owning Session was closed

    posted @ 2006-02-09 16:39 java之海 閱讀(195) | 評(píng)論 (0)編輯 收藏
    主站蜘蛛池模板: 亚洲成色www久久网站夜月| 久久久无码精品亚洲日韩按摩| 亚洲精品线在线观看| 亚洲首页国产精品丝袜| 成人一级免费视频| 亚洲成人免费在线观看| 一区二区三区亚洲视频| 久久精品国产亚洲AV无码偷窥| 美女羞羞免费视频网站| 99在线在线视频免费视频观看| 在线免费观看韩国a视频| 亚洲AV无码一区东京热久久| 亚洲色大情网站www| 在线播放免费人成毛片乱码| 欧洲美熟女乱又伦免费视频| 久久久久亚洲精品成人网小说| 亚洲av中文无码字幕色不卡| 小日子的在线观看免费| 亚洲国产精品成人网址天堂| 亚洲性色高清完整版在线观看| 一级做a爱过程免费视频高清| 91精品免费国产高清在线| 亚洲最大AV网站在线观看| 亚洲人成网站在线在线观看| 性无码免费一区二区三区在线| 亚洲乱码国产一区网址| 亚洲色成人WWW永久在线观看| 国产好大好硬好爽免费不卡| 免费夜色污私人影院在线观看| 亚洲区视频在线观看| a级黄色毛片免费播放视频| 国产成人在线免费观看| 亚洲另类小说图片| 成人无码a级毛片免费| 免费大片在线观看网站| 亚洲五月丁香综合视频| 99久久免费看国产精品| 亚洲日韩乱码中文无码蜜桃臀网站| 亚洲Av永久无码精品一区二区| 亚洲精品视频在线观看免费| 国产亚洲成AV人片在线观黄桃|