熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

在Struts框架下使用時間類型

2013-11-23 20:39:09  來源: Java開源技術 

  使用時間類型?這誰不會不就是javautil下的幾個類嗎在不加上javasql和javatext下的幾個類這會有什麼問題嗎?Struts要是連時間都處理不了那還能干嘛?  在實際應用中我就發現Struts確實連有些簡單的時間都處理不了(不知是我使用的方法不對還是Struts確實沒有考慮到)順便你也能了解Struts是怎麼把form裡的請求參數populate到ActionForm裡面的
  
  今天下午同事告訴我把有javautilDate類型屬性的類存入數據庫時出錯把這個屬性刪除就沒有問題了當時我就想到是RequestProcessor在processPopulate()時出錯了因此在它的這個方法設了斷點並跟蹤了進去當然它最先要調用ActionForm的reset()方法然後調用實際處理populate(將請求參數傳給ActionForm)的RequestUtilspopulate()方法RequestUtils的這個靜態方法最先是處理Multipart的(即文件上傳等多部分)的方法然後將所有的請求都放在叫properties的HashMap裡並循環處理它
      names = requestgetParameterNames();
      while (nameshasMoreElements()) {
        String name = (String) namesnextElement();
        String stripped = name;
        if (prefix != null) {
          if (!strippedstartsWith(prefix)) {
            continue;
          }
          stripped = strippedsubstring(prefixlength());
        }
        if (suffix != null) {
          if (!strippedendsWith(suffix)) {
            continue;
          }
          stripped = strippedsubstring( strippedlength() suffixlength());
        }
        if (isMultipart) {
          propertiesput(stripped multipartParametersget(name));
        } else {
          propertiesput(stripped requestgetParameterValues(name));
        }
      }
  
  實際處理它們的是下面的BeanUtilspopulate(bean properties); 其中bean就是接受數據的ActionForm而properties裡面則是所有的請求的鍵-值對(鍵和值都是字符串http協議的特點)
  
  再看看BeanUtils的靜態(類)方法populate是怎麼處理的
      // Loop through the property name/value pairs to be set
      Iterator names = propertieskeySet(erator();
      while (nameshasNext()) {
  
        // Identify the property name and value(s) to be assigned
        String name = (String) namesnext();
        if (name == null) {
          continue;
        }
        Object value = propertiesget(name);
  
        // Perform the assignment for this property
        setProperty(bean name value);
  
      }
  它是循環所有的請求參數把實際的工作又交給了setProperty方法呵呵弄了半天這幫人原來都是代理
  
  這個方法還是代理嗎?計算了一下它有行的代碼這麼長應該是個實干家了吧錯!千萬不要被有些人的外表欺騙了!有些人一天上班個小時可夠敬業的可有小時在打CS這個類就是一上來多行都在一個if (logisTraceEnabled()){}裡面
  
  log在這說明一下Struts中使用的是Jakarta Commons Logging的包它使用的優先級是Logj(念four好像比較有意義大概是Logger For Java的意思我聽有的人年Log si J感覺很別扭呵呵)Java Logging APISimple Logging功能是依次減弱
  
  建議在寫Action 的execute()或被execute()調用的業務方法中使用Commons Logging 來代替Systemoutprintln()--當要你把成百上千的Systemoutprintln()去掉的時候你就會覺得Commons Logging是個多好的東東了它的用法是
   import monsloggingLog;
   import monsloggingLogFactory;
      private/protected static Log log = LogFactorygetLog(DispatchActionclass);
  如果你用的是DispatchAction那你就不要自己定義Log的實例了因為它已經有一個protected的Log實例直接使用即可
  
  使用方法是
      if (logisInfoEnabled()) {
         logInfo(some information);
      }
  Logging把消息分為種級別debugerrorfatalinfotracewarn比如你想記錄一條消息它只是為了給用戶一個警告則可以使用warn為什麼在每個logInfo()前做一次判斷呢?難道如果log級別不允許InfologInfo()仍然能Info嗎?當然不是它的作用是提高效率
  
  比如有個消息是計算前一萬個自然數的和(這種消息可能少見)用直接logInfo()
      int sum=;
      for(int i=;i<;i++){
       sum+=i;
      }
      logInfo(the sum of form to is : _sum);
  如果logInfo是不允許的那求個數的和就白求的當然如果你的計算機很快或和高斯一樣聰明直接logInfo()也每什麼問題
     
  閒話少說回到多行的BeanUtilssetProperty()方法這個方法先是處理nested屬性也就是xxxxxx的請求參數我們只看看處理簡單屬性的必須過程下面這端代碼有點長但它只做了一件事將字符串的請求參數轉成ActionForm的類型比如你在ActionForm裡有個Integer userAge然後HTTP請求參數裡可能會有傳人的是字符串目標是專程Integer
  
  首先它當然會根據userAge這個字符串查找相應的ActionForm如果這個ActionForm有個屬性也叫userAge然後就會把這個userAge的類型存到type裡type的定義是Class type = null; 得到type的代碼很長這是因為要它考慮很多情況例如DynaActionForm
     // Convert the specified value to the required type
      Object newValue = null;
      if (typeisArray() && (index < )) { // Scalar value into array
        if (value == null) {
          String values[] = new String[];
          values[] = (String) value;
          newValue = nvert((String[]) values type);
        } else if (value instanceof String) {
          String values[] = new String[];
          values[] = (String) value;
          newValue = nvert((String[]) values type);
        } else if (value instanceof String[]) {
          newValue = nvert((String[]) value type);
        } else {
          newValue = value;
        }
      } else if (typeisArray()) {     // Indexed value into array
        if (value instanceof String) {
          newValue = nvert((String) value
                          typegetComponentType());
        } else if (value instanceof String[]) {
          newValue = nvert(((String[]) value)[]
                          typegetComponentType());
        } else {
          newValue = value;
        }
      } else {               // Value into scalar
        if ((value instanceof String) || (value == null)) {
          newValue = nvert((String) value type);
        } else if (value instanceof String[]) {
          newValue = nvert(((String[]) value)[]
                          type);
        } else if (ConvertUtilslookup(valuegetClass()) != null) {
          newValue = nvert(valuetoString() type);// Here is my programs break point
        } else {
          newValue = value;
        }
      }
  
  最後是調用PropertyUtils的一些方法設置值下面代碼的第一種情況是有索引的即你在請求參數裡傳了field[]=之類的參數第二種是Map類型的傳的是map(key)=value之類的參數最一般的就是調用第三個方法
        if (index >= ) {
          PropertyUtilssetIndexedProperty(target propName
                           index newValue);
        } else if (key != null) {
          PropertyUtilssetMappedProperty(target propName

From:http://tw.wingwit.com/Article/program/Java/ky/201311/28836.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.