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

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

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

    posts - 120,  comments - 19,  trackbacks - 0
     

    前幾天不是一個同事使用OpenSessionInView pattern時,遇到Hibernate 3的mappinglazy="true"的問題,也不會想到它
    struts啟動spring的WebApplicationContext
    spring有三種啟動方式,使用ContextLoaderServlet,ContextLoaderListener和ContextLoaderPlugIn.
    看一下ContextLoaderListener的源碼,這是一個ServletContextListener
    /**
    ? * Initialize the root web application context.
    ? */
    ?public void contextInitialized(ServletContextEvent event) {
    ??this.contextLoader = createContextLoader();
    ??this.contextLoader.initWebApplicationContext(event.getServletContext());
    ?}
    ?
    ??/**
    ? * Create the ContextLoader to use. Can be overridden in subclasses.
    ? * @return the new ContextLoader
    ? */
    ?protected ContextLoader createContextLoader() {
    ??return new ContextLoader();
    ?}
    ?contextLoader的源碼
    ?public WebApplicationContext initWebApplicationContext(ServletContext servletContext)
    ???throws BeansException {

    ??long startTime = System.currentTimeMillis();
    ??if (logger.isInfoEnabled()) {
    ???logger.info("Root WebApplicationContext: initialization started");
    ??}
    ??servletContext.log("Loading Spring root WebApplicationContext");

    ??try {
    ???// Determine parent for root web application context, if any.
    ???ApplicationContext parent = loadParentContext(servletContext);

    ???WebApplicationContext wac = createWebApplicationContext(servletContext, parent);
    ???servletContext.setAttribute(
    ?????WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac);

    ???if (logger.isInfoEnabled()) {
    ????logger.info("Using context class [" + wac.getClass().getName() +
    ??????"] for root WebApplicationContext");
    ???}
    ???if (logger.isDebugEnabled()) {
    ????logger.debug("Published root WebApplicationContext [" + wac +
    ??????"] as ServletContext attribute with name [" +
    ??????WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE + "]");
    ???}

    ???if (logger.isInfoEnabled()) {
    ????long elapsedTime = System.currentTimeMillis() - startTime;
    ????logger.info("Root WebApplicationContext: initialization completed in " + elapsedTime + " ms");
    ???}

    ???return wac;
    ??}
    ??catch (RuntimeException ex) {
    ???logger.error("Context initialization failed", ex);
    ???servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ex);
    ???throw ex;
    ??}
    ??catch (Error err) {
    ???logger.error("Context initialization failed", err);
    ???servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, err);
    ???throw err;
    ??}
    ?}
    ?注意WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,這里面放了WebApplicationContext,需要使用時從ServletContext取出
    ?可以使用WebApplicationContextUtils得到WebApplicationContext
    ?public static WebApplicationContext getWebApplicationContext(ServletContext sc) {
    ??Object attr = sc.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
    ??if (attr == null) {
    ???return null;
    ??}
    ??if (attr instanceof RuntimeException) {
    ???throw (RuntimeException) attr;
    ??}
    ??if (attr instanceof Error) {
    ???throw (Error) attr;
    ??}
    ??if (!(attr instanceof WebApplicationContext)) {
    ???throw new IllegalStateException("Root context attribute is not of type WebApplicationContext: " + attr);
    ??}
    ??return (WebApplicationContext) attr;
    ?}
    ?關鍵的問題在于struts如何啟動的spring的,ContextLoaderPlugIn的源碼
    ?
    ?// Publish the context as a servlet context attribute.
    ??String attrName = getServletContextAttributeName();
    ??getServletContext().setAttribute(attrName, wac);
    ?
    ?public String getServletContextAttributeName() {
    ??return SERVLET_CONTEXT_PREFIX + getModulePrefix();
    ?}
    ?不同加載的Key竟然不同,原因就是WebApplicationContext放在那里的問題,可spring調用的時候會根據WebApplicationContext里面定義的那個名字去找的,問題出在這里


    ?在struts-config.xml中配置
    ??? <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    ????? <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />
    ??? </plug-in>

    ??? <controller>
    ??????? <set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor" />
    ??? </controller>
    ?原理是這樣的,Struts雖然只能有一個ActionServlet實例,但是對于不同的子應用分別能有自己的RequestProcessor實例每個RequestProcessor實例分別對應不同的struts配置文件。
    ?? 子應用的ProcessorClass類必須重寫一般就是繼承RequestProcessor類,然后再其配置文件的controller元素中的<processorClass>屬性中作出修改。那么當
    ? getRequestProcessor(getModuleConfig(request)).process(request,response);就能根據request選擇相應的moduleconfig,再根據其<processorClass>屬性選擇相應的RequestProcessor子類來處理相應的請求了。

    posted @ 2006-08-22 16:14 阿成 閱讀(343) | 評論 (0)編輯 收藏
    Tomcat的class加載的優先順序一覽

    1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件。

    2.環境變量CLASSPATH中的jar和class文件。

    3.$CATALINA_HOME/common/classes下的class文件。

    4.$CATALINA_HOME/commons/endorsed下的jar文件。

    5.$CATALINA_HOME/commons/i18n下的jar文件。

    6.$CATALINA_HOME/common/lib?下的jar文件。
    (JDBC驅動之類的jar文件可以放在這里,這樣就可以避免在server.xml配置好數據源卻出現找不到JDBC?D
    posted @ 2006-08-22 16:11 阿成 閱讀(230) | 評論 (0)編輯 收藏
    http://www.databaseanswers.org/data_models/index.htm
    posted @ 2006-08-22 09:30 阿成 閱讀(294) | 評論 (0)編輯 收藏
         摘要: 1. ???? 關于 hibernate 緩存的問題:...  閱讀全文
    posted @ 2006-08-22 09:23 阿成 閱讀(393) | 評論 (0)編輯 收藏
    struts使用日期包括將string自動轉化為日期fill到form中,以及將form中的日期按照指定格式顯示在html的textfield中。首先講第一種情況的解決方法:

    創建如下類:

    import?java.util.*;
    import?org.apache.commons.beanutils.*;
    import?java.text.SimpleDateFormat;

    public?class?DateConvert?implements?Converter
    {
    ??static?SimpleDateFormat?df?=?new?SimpleDateFormat("yyyy/MM/dd");
    ??public?DateConvert()
    ??{

    ??}
    ??public?Object?convert(Class?type,?Object?value)
    ??{
    ????
    ????if(value==null)return?null;
    ????if(((String)value).trim().length()==0)?return?null;

    ????if(value?instanceof?String)
    ????{
    ??????try
    ??????{
    ????????return?df.parse((String)value);
    ??????}
    ??????catch?(Exception?ex)
    ??????{
    ????????throw?new?ConversionException("輸入的日期類型不合乎yyyy/MM/dd"
    ??????????+?value.getClass());
    ??????}

    ????}
    ????else
    ????{
    ??????throw?new?ConversionException("輸入的不是字符類型"+value.getClass());
    ????}

    ??}
    }

    然后在你的系統某出使用如下(如web的init方法)
    ConvertUtils.register(new?DateConvert(),java.util.Date.class);
    參數用于表示DateConvert類負責處理java.util.Date類型的轉化

    第二種情況是如何顯示form中日期類型到html:text中,我用的辦法是修改struts的代碼,重新生成一個新的struts.jar
    org.apache.struts.taglib.html.BaseFieldTag的doStartTag的方法
    找到?if?(value?!=?null)?{results.append(ResponseUtils.filter(value))代碼行下面的內容,需要修改此處代碼,以便輸出日期類型
    如下:
    if?(value?!=?null)?{
    ????????????results.append(ResponseUtils.filter(value));
    ????????}?else?if?(redisplay?||?!"password".equals(type))?{
    ????????????Object?value?=?RequestUtils.lookup(pageContext,?name,?property,?null);
    ????????????//System.out.println("lijz?"+value);

    ????????????if(value?instanceof?java.util.Date)
    ????????????{
    ???????????????//System.out.println("date="+value);

    ???????????????if?(value?==?null)
    ???????????????????value?=?"";
    ????????else
    ????????{
    ??????????java.util.Date?d=?(java.util.Date)value;
    ??????????try
    ???????????{

    ????????????results.append(ResponseUtils.filter(df.format(d)));
    ??????????}
    ??????????catch(Exception?ex)
    ??????????{
    ????????????System.out.println("form?error:"+ex.getMessage());
    ??????????}
    ??????????}
    ????????????}
    ???????????else
    ???????????{
    ???????????????if?(value?==?null)
    ????????????????value?=?"";
    ????????????????results.append(ResponseUtils.filter(value.toString()));
    ???????????}
    ???????????
    ???????}
    ????????results.append("\"");
    ????????results.append(prepareEventHandlers());
    ????????results.append(prepareStyles());
    ????????results.append(getElementClose());

    ????????//?Print?this?field?to?our?output?writer

    ????????ResponseUtils.write(pageContext,?results.toString());

    ????????//?Continue?processing?this?page

    ????????return?(EVAL_BODY_TAG);??????
    ?
    ?重新編譯struts成struts.jar.放到你需要的項目中?

    作者Blog:http://blog.csdn.net/chensheng913/
    posted @ 2006-08-21 16:02 阿成 閱讀(243) | 評論 (0)編輯 收藏
    1、將com.regex.test轉換成com/regex/test
    用replaceAll轉換
    replaceAll中的第一個參數是一個正則表達示,不是普通的字符串組合

    replaceAll(".", "/") <===>Pattern.compile(".").matcher(str).replaceAll("/")

    "."需加轉義符,要寫成"\\.",如replaceAll("\\.", "/") 即可。
    posted @ 2006-08-21 10:02 阿成 閱讀(232) | 評論 (0)編輯 收藏
    幾乎每個企業都需要技術人員的支持,生產制造型企業需要現場生產控制和工藝流程方面的技術人才;IT等高科技行業需要大量軟件研發和設備維護的硬件工程師;房地產、建筑工程領域需要建筑設計師、土木工程師和施工技術人員。此外,不論是國企、民營企業還是外資公司,都需要大量的基礎技術工人。甚至很多在豪華寫字樓office內工作的白領,從事的工作都是和技術相關的。

      不過,一個嚴峻的現實是,大量的技術類人員對自己的職業定位和職業生涯規劃顯得非常迷茫和困惑。中國有句古話:勞心者治人,勞力者治于人。與管理類崗位相比,技術人員往往被人看低一等,他們雖然從事著非常重要、繁瑣的技術性工作,但更多的是扮演著幕后英雄的角色。在社會地位、經濟收入方面與分光無限的各級管理層普遍存在差距,這一現實造就了技術人員的巨大心理落差。第二個造成職業規劃困惑的原因是部分技術性工作的局限性。拿IT行業來說,由于技術和知識更新的速度太快,軟件開放人員普遍被認為是吃“青春飯”的職位,誰學習的更快、誰的精力更旺盛、誰更能熬夜,誰就更有競爭力,因為這時經驗已經不再重要。如果超過35歲還從事軟件開發的話,將很難在本職崗位取得突破。

      那么,對于技術類人員來說,難道他們的職業發展前景真的如此黯淡?事實當然不會如此悲觀,做技術工作同樣有著非常廣闊的空間,當然,關鍵一點你要令自己的視野更開闊些,從長遠的角度來看待這個問題。根據我的經驗,技術人員的職業方向可以有以下幾個選擇:

      方向一、成為項目經理

      對于很多從事技術方面工作的人員來說,發展成為項目經理是一個相當好的工作。項目管理工作既需要扎實的技術背景支持,又涉及多方面的管理工作,最適合那些技術出身但又不甘于只做技術工作的人員。成為項目經理,一方面可以充分發揮技術人員的專業優勢,同時又可在團隊管理、協調各方資源、內外部溝通等工作中體驗和發揮作為管理者的角色和作用,從而讓自身價值更為充分的實現和得到認可。優秀的項目管理人才,也是今后很長時期內的一個熱門職業方向。

      方向二、成為行業資深專家

      如果的確非常喜愛技術工作,而不擅長和喜歡與人溝通,則可以完全專注于自身的領域,以發展成為行業資深專家為方向和目標,當然,這一發展過程可能會比較漫長,任何一個領域的頂尖技術人才都需要長期的行業經驗的累積和個人孜孜不倦的投入。不過這類人才的一個優勢是越老越吃香,當別人隨著年齡的逐步增長而開始擔心飯碗問題時,你則漸入佳境,開始進入職業發展的黃金時期。

      方向三、成為研發經理或技術總監

      事實上,在某些行業和企業,技術研發人員的地位是非常高的。譬如在微軟、諾基亞、華為等IT產業,技術的支持和研發的速度,成為企業利潤增長的最主要來源,在這些行業,技術研發部門就是企業的主戰場。在不少國企和政府部門,也非常重視科技和技術工作,例如,我所知道的廣州市市政園林局,就設有總工程師、副總工程師等技術職位,其中總工程師的職務級別相當于副局級,在這種氛圍影響下,技術崗位人才和行政領導同樣受人尊敬。所以,在一個尊重和重視技術工作的行業和企業中,發展成為研發經理、技術總監或總工程師都是一個很好的選擇。

      方向四、做技術型銷售和服務

      技術工作的領域其實非常廣泛,如果感覺純技術工作發展潛力不大,可以考慮轉向做銷售或技術支持方面。華為、中興等通信技術公司的銷售人員,很少是不具有專業技術背景的;甲骨文等軟件巨頭的市場推廣,第一步常常是從銷售工程師拜訪客戶開始的。這類高價值、高科技的產品銷售推廣,非常需要具有豐富技術經驗的銷售人員。

      技術人員轉向售后服務,也是非常有前途的。我認識的一個朋友,大學是施工機械專業,畢業后一直在市政工程行業做非開挖頂管施工,在幾年的工作中積累了豐富的地下頂進設備的應用和維修經驗,一個合適的機會跳槽到著名的頂管設備生產商-德國海瑞克公司,成為其售后服務工程師,工作上得心應手,收入也有了數倍的增長。

      方向五、轉向管理崗位

      總有一些人,雖然是理工科出身、從事著技術崗位工作,但他們似乎天生就是具有管理天賦的人。這些人會在工作中逐步展現出管理潛質和優秀的領導能力,他們往往更喜歡跟人打交道,更喜歡與外界溝通。在這種條件下,以技術經驗為基礎和依托,適當補充學習些管理方面的知識,例如可以在職攻讀MBA,假以時日,完全可以成長為出色的職業經理人。

      方向六、高級技術操作人員

      剛才所談的職業發展方向,適用群體多為高校理工專業出身的人士,但對于數量眾多的中等專科學校、技校畢業的一線技術工人來說,成為行業技術專家或研發總監的機會顯然非常微小。這一群體的職業人士,最佳的技術發展路線是立足本職崗位,成為高級操作型技術人員。

      廣州市2006年出臺的各類崗位工資指導價格中,高級技師就業的工資比博士還要高出500元。出現這一現象的原因很簡單,從全國層面來說,產業工人數量雖然巨大,但高級技工的比例卻非常小,“高級技工”的缺乏已經成為制約許多企業發展的“瓶頸”。但隨著政策環境、企業認識角度和培育機制方面的不斷改善,這一現象將逐步得到改變,所以成為中高級技師將是一個非常有前途的職業發展方向。

      最后,我再次拿IT行業為例來具體談談技術人員的職業軌跡。

      IT(Information Technology)行業的分類相當復雜,我這里僅僅分析最典型的三個部分:

      第一部分是軟件開發,通俗來說就是編程。實際上我認為真正的軟件開發人員和制鞋工廠中的工人處在一個地位,是企業產品的最終生產者(當然這里沒有貶義)。

      第二個部分是MIS: Management Information Service/System(管理信息系統),主要負責基礎IT建設、網絡、通訊、軟硬件支持、簡單開發等職能,為公司其他部門提供IT基礎服務。

      第三部分是ERP: Enterprise Resource Planning(企業資源計劃系統),主要涉及企業管理類軟件實施、維護、管理。通過是引入信息化手段在企業現實的實現企業的資源管理,協調企業各方面的生產運作,它對業務的規范和企業的管理機制有很大的依賴。

      讓我們來分別看看這三部分人員的職業發展空間:

      1. 開發人員

      我的觀點是,在中小企業做純粹的軟件開發很可能走上一條不歸路,長期從事開發的人一般處世能力不足,升任管理人員的機會不大。而還有一個更重要的問題是中國目前開發行業的環境很不好,正如我之前談到的基本是在吃青春飯,30往后就很難做下去了。而在美國40歲的開發人員是正吃香的年齡。雖然可能業務越來越精,但可能會離IT越來越遠,向純藍領工人發展。

      如果真的要做開發,應該找一個更好的平臺,最好是進入跨國企業或國內龍頭企業。如果數據方面的技術很強,可以考慮轉向互聯網搜索方向;如果在電子和通信設備方面有優勢,可以從簡單的程序開發轉向通信產品的開發。

      2. MIS人員

      MIS內容廣泛,可從事的職業很多:網管、技術支持等,而且通過努力可以得到提升成為小小的主管(當然要有自身的素質),進而成為MIS Manager,但做到MIS Manager基本也就到頭了,不過倒是可以考慮轉到不同的行業或企業做MIS。

      同樣是做IT服務,在不同公司內IT部門的地位還是非常巨大的。就我所了解的,雅芳(中國)公司的IT部門就有100多人,在公司總部的各職能部門中的地位相當高;而南方航空公司的IT部門竟然達到800多人,這個規模已經遠遠超過一般的IT公司,其IT部門的總裁也是公司決策層的重要成員。所以,在這些公司內做IT技術支持工作,既避免了純編程式的軟件開發人員遇到的“人老珠黃”的被動局面,也不必擔心IT產業泡沫破滅而產生的生存危機。

      3. ERP類人員

      從事企業管理類軟件的人員一般起點比較高(公司的起點就比較高),要求對財務、生產、銷售等流程都有清楚地認識,從業人員不一定為IT出身,而有可能是財務人員或理工科人員等轉行而來。IT的迅速發展和企業經營領域的不斷拓展,為ERP的推廣和發展創造了良好的發展空間。事實上,一個從事企業管理類軟件的技術人員完全可以勝任一個企業的管理者,在這一領域技術人員的前景可以說是非常廣闊的。

      我認識的一位朋友,本科讀的是工業裝備控制專業,畢業后一直從事ERP方面的應用推廣和管理咨詢,雖然他對純粹的IT技術了解并不是特別深刻,但在ERP系統在企業中的應用方面經驗非常豐富,在別人眼中他更像是一名管理咨詢師,五年下來已經是這一領域的專家級人物,在個人收入方面也非常可觀。
    posted @ 2006-08-21 08:53 阿成 閱讀(197) | 評論 (0)編輯 收藏

    Strategy策略模式是屬于設計模式中 對象行為型模式,主要是定義一系列的算法,把這些算法一個個封裝成單獨的類.

    Stratrgy應用比較廣泛,比如, 公司經營業務變化圖, 可能有兩種實現方式,一個是線條曲線,一個是框圖(bar),這是兩種算法,可以使用Strategy實現.

    這里以字符串替代為例, 有一個文件,我們需要讀取后,希望替代其中相應的變量,然后輸出.關于替代其中變量的方法可能有多種方法,這取決于用戶的要求,所以我們要準備幾套變量字符替代方案.

    ?

    首先,我們建立一個抽象類RepTempRule 定義一些公用變量和方法:

    public abstract class RepTempRule{

    protected String oldString="";
    public void setOldString(String oldString){
      this.oldString=oldString;
    }

    protected String newString="";
    public String getNewString(){
      return newString;
    }



    public abstract void replace() throws Exception;


    }

    在RepTempRule中 有一個抽象方法abstract需要繼承明確,這個replace里其實是替代的具體方法.
    我們現在有兩個字符替代方案,
    1.將文本中aaa替代成bbb;
    2.將文本中aaa替代成ccc;

    對應的類分別是RepTempRuleOne RepTempRuleTwo

    public class RepTempRuleOne extends RepTempRule{


    public void replace() throws Exception{

      //replaceFirst是jdk1.4新特性
      newString=oldString.replaceFirst("aaa", "bbbb")
      System.out.println("this is replace one");
      
    }


    }

    public class RepTempRuleTwo extends RepTempRule{


    public void replace() throws Exception{

      newString=oldString.replaceFirst("aaa", "ccc")
      System.out.println("this is replace Two");
      
    }


    }

    第二步:我們要建立一個算法解決類,用來提供客戶端可以自由選擇算法。

    public class RepTempRuleSolve {

      private RepTempRule strategy;

      public RepTempRuleSolve(RepTempRule rule){
        this.strategy=rule;
      }

      public String getNewContext(Site site,String oldString) {
        return strategy.replace(site,oldString);
      }

      public void changeAlgorithm(RepTempRule newAlgorithm) {
        strategy = newAlgorithm;
      }

    }

    ?

    ?

    調用如下:

    public class test{

    ......

      public void testReplace(){

      //使用第一套替代方案
      RepTempRuleSolve solver=new RepTempRuleSolve(new RepTempRuleSimple());
      solver.getNewContext(site,context);

      //使用第二套

      solver=new RepTempRuleSolve(new RepTempRuleTwo());
      solver.getNewContext(site,context);

      }

    .....

    }

    我們達到了在運行期間,可以自由切換算法的目的。

    實際整個Strategy的核心部分就是抽象類的使用,使用Strategy模式可以在用戶需要變化時,修改量很少,而且快速.

    Strategy和Factory有一定的類似,Strategy相對簡單容易理解,并且可以在運行時刻自由切換。Factory重點是用來創建對象。

    Strategy適合下列場合:

    1.以不同的格式保存文件;

    2.以不同的算法壓縮文件;

    3.以不同的算法截獲圖象;

    4.以不同的格式輸出同樣數據的圖形,比如曲線 或框圖bar等

    posted @ 2006-08-18 09:09 阿成 閱讀(278) | 評論 (0)編輯 收藏
    一、表單驗證的流程

    hello.jsp 網頁上,不輸入姓名,直接單擊【 Submit 按鈕,會看到如圖 2-6 所示的網頁。

    2-6? 表單驗證失敗的 hello.jsp 網頁

    當客戶提交 HelloForm 表單時, 請求路徑為 /HelloWorld.do ”:

    <html:form action="/HelloWorld.do" focus="userName" >

    服務器端執行表單驗證流程如下。

    1 Servlet 容器在 web.xml 文件中尋找 <url-pattern> 屬性為“ *.do ”的 <servlet-mapping> 元素:

    <servlet-mapping>

    <servlet-name>action</servlet-name>

    <url-pattern>*.do</url-pattern>

    </servlet-mapping>

    2 Servlet 容器依據以上 <servlet-mapping> 元素的 <servlet-name> 屬性“ action ”,在 web.xml 文件中尋找匹配的 <servlet> 元素:

    <servlet>

    <servlet-name>action</servlet-name>

    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

    </servlet>

    3 Servlet 容器把請求轉發給以上 <servlet> 元素指定的 ActionServlet ActionServlet 依據用戶請求路徑 /HelloWorld.do ”, Struts 配置文件中檢索 path 屬性為 /HelloWorld <action> 元素

    <action??? path????? = "/HelloWorld"

    ????????? type????? = "hello.HelloAction"

    ????????? name????? = "HelloForm"

    ??? ??????scope???? = "request"

    ????????? validate? = "true"

    ? ????????input???? = "/hello.jsp"

    ?>

    ??????? <forward name="SayHello" path="/hello.jsp" />

    ?</action>

    ?

    更確切地說, ActionServlet 此時檢索的是 ActionMapping 對象,而不是直接訪問 Struts 配置文件中的 <action> 元素。因為 ActionServlet 初始化的時候,會加載 Struts 配置文件,把各種配置信息保存在相應的配置類的實例中,例如 <action> 元素的配置信息存放在 ActionMapping 對象中。



    4 ActionServlet 根據 <action> 元素的 name 屬性,創建一個 HelloForm 對象,把客戶提交的表單數據傳給 HelloForm 對象,再把 HelloForm 對象保存在 <action> 元素的 scope 屬性指定的 request 范圍內。

    5 )由于 <action> 元素的 validate 屬性為 true ActionServlet 調用 HelloForm 對象的 validate() 方法執行表單驗證:

    public ActionErrors validate(ActionMapping mapping,

    ???????????????????????????????? HttpServletRequest request) {

    ???????? ?? ActionErrors errors = new ActionErrors();

    ????????????if ((userName == null) || (userName.length() < 1))

    ??????? ????errors.add("username", new ActionMessage("hello.no.username.error"));

    ????????????return errors;

    }

    6 HelloForm 對象的 validate() 方法返回一個 ActionErrors 對象,里面包含一個 ActionMessage 對象,這個 ActionMessage 對象中封裝了錯誤消息,消息 key 為“ hello.no.username.error Resource Bundle 中與值匹配的消息文本為:

    hello.no.username.error=Please enter a <i>UserName</i> to say hello to!

    7 ActionServlet HelloForm validate() 方法返回的 ActionErrors 對象保存在 request 范圍內,然后根據 <action> 元素的 input 屬性,把客戶請求轉發給 hello.jsp

    8 hello.jsp <html:errors> 標簽從 request 范圍內讀取 ActionErrors 對象,再從 ActionErrors 對象中讀取 ActionMessage 對象,把它包含的錯誤消息顯示在網頁上。

    二、 邏輯驗證失敗的流程

    接下來在 hello.jsp HTML 表單中輸入姓名“ Monster ”,然后單擊【 Submit 按鈕。當服務器端響應客戶請求時,驗證流程如下。

    1 )表單驗證 的流程( 1 )~( 4 )。

    2 ActionServlet 調用 HelloForm 對象的 validate() 方法,這次 validate() 方法返回的 ActionErrors 對象中不包含任何 ActionMessage 對象,表示表單驗證成功。

    3 ActionServlet 查找 HelloAction 實例是否存在,如果不存在就創建一個實例。然后調用 HelloAction execute() 方法。

    4 HelloAction execute() 方法先進行邏輯驗證,由于沒有通過邏輯驗證,就創建一個 ActionMessage 對象,這個 ActionMessage 對象封裝了錯誤消息,消息 key 為“ hello.dont.talk.to.monster ”,在 Resource Bundle 中與值匹配的消息文本為:

    hello.dont.talk.to.monster=We don't want to say hello to Monster!!!

    execute() 方法把 ActionMessage 對象保存在 ActionMessages 對象中,再把 ActionMessages 對象存放在 request 范圍內。最后返回一個 ActionForward 對象,該對象包含的請求轉發路徑為 <action> 元素的 input 屬性指定的 hello.jsp

    以下是 execute() 方法中進行邏輯驗證的代碼:

    ActionMessages errors = new ActionMessages();

    String userName = (String)((HelloForm) form).getUserName();

    String badUserName = "Monster";

    ?

    if (userName.equalsIgnoreCase(badUserName)) {

    ???? errors.add("username", new ActionMessage("hello.dont.talk.to.monster", badUserName ));

    ???? saveErrors(request, errors);

    ???? return (new ActionForward(mapping.getInput()));

    }

    5 ActionServlet 依據 HelloAction 返回的 ActionForward 對象,再把請求轉發給 hello.jsp

    6 hello.jsp <html:errors> 標簽從 request 范圍內讀取 ActionMessages 對象,再從 ActionMessages 對象中讀取 ActionMessage 對象,把它包含的錯誤消息顯示在網頁上, 如圖 所示。

    邏輯驗證失敗時的 hello.jsp 網頁

    、邏輯驗證成功的流程

    接下來,在 hello.jsp HTML 表單中輸入姓名“ Weiqin ”,然后單擊【 Submit 按鈕。當服務器端響應客戶請求時,流程如下。

    1 )重復 的流程( 1 )~( 3 )。

    2 HelloAction execute() 方法先執行邏輯驗證,這次通過了驗證,然后執行相關的業務邏輯,最后調用 ActionMapping.findForward() 方法,參數為 SayHello ”:

    // Forward control to the specified success URI

    return (mapping.findForward("SayHello"));

    3 ActionMapping.findForward() 方法從 <action> 元素中尋找 name 屬性為 SayHello ”的 <forward> 子元素,然后返回與之對應的 ActionForward 對象,它代表的請求轉發路徑為“ /hello.jsp ”。

    更確切地說, ActionMapping 從本身包含的 HashMap 中查找 name 屬性為 SayHello ActionForward 對象。在 ActionServlet 初始化時會加載 Struts 配置文件,把 <action> 元素的配置信息存放在 ActionMapping 對象中。 <action> 元素中可以包含多個 <forward> 子元素,每個 <forward> 子元素的配置信息存放在一個 ActionForward 對象中,這些 ActionForward 對象存放在 ActionMapping 對象的 HashMap 中。

    4 HelloAction execute() 方法 然后把 ActionForward 對象返回給 ActionServlet ActionServlet 再把客戶請求轉發給 hello.jsp

    5 hello.jsp <bean:message> 標簽從 Resource Bundle 中讀取文本,把它們輸出到網頁上,最后生成 動態網頁,如圖 所示。

    ? 通過數據驗證的 hello.jsp 網頁

    posted @ 2006-08-17 20:22 阿成 閱讀(1906) | 評論 (0)編輯 收藏
    1、JSP頁面編碼
    <%@ page contentType="text/html;charset=........"%>
    <%@ page language="java" pageEncoding="........"%>
    pageEncoding:The encoding used for the JSP page file, as well as
    the response charset if no charset is specified by contentType.

    If this attribute is omitted, but a charset is specified for contentType,
    that charset is also used of the page; if contentType doesn't specify a
    charset, ISO-8859-1 is used for a regular JSP page, and UTF-8 is used
    for a JSP Document.
    posted @ 2006-08-17 10:09 阿成 閱讀(364) | 評論 (0)編輯 收藏
    僅列出標題
    共10頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
    主站蜘蛛池模板: 成人电影在线免费观看| 成人免费网站视频www| 久久精品视频免费播放| 免费人成网站在线观看不卡| 亚洲色婷婷六月亚洲婷婷6月| 国产男女爽爽爽免费视频| 2021国内精品久久久久精免费| 日韩a级毛片免费视频| 亚洲日韩图片专区第1页| 久久成人免费电影| 亚洲人成网站影音先锋播放| 免费在线视频你懂的| 亚洲人片在线观看天堂无码| 免费观看国产小粉嫩喷水| 草久免费在线观看网站| 国产亚洲精品国产| 国产综合激情在线亚洲第一页 | 9久热这里只有精品免费| 国产精品亚洲片在线| 久久综合给合久久国产免费| 亚洲精品无码专区2| 怡红院免费的全部视频| 免费jjzz在在线播放国产| 亚洲av无码专区在线| 黄网站色视频免费在线观看的a站最新| 亚洲AV午夜成人影院老师机影院| 污污污视频在线免费观看| 亚洲午夜福利717| 韩国免费一级成人毛片| 亚洲视频在线观看免费| 日本在线高清免费爱做网站| 亚洲AV无码一区二区三区电影 | 国产亚洲综合一区柠檬导航| 巨波霸乳在线永久免费视频| 国产精品亚洲AV三区| 狼友av永久网站免费观看| 一级毛片免费在线观看网站| 亚洲成人免费在线| 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 国产AV旡码专区亚洲AV苍井空| 亚洲第一黄片大全|