亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

在Struts框架下使用時間類型

2019-11-18 15:55:53
字體:
來源:轉載
供稿:網友

  使用時間類型?這誰不會,不就是java.util下的幾個類嗎,在不加上java.sql和java.text下的幾個類,這會有什么問題嗎?Struts要是連時間都處理不了,那還能干嘛?  在實際應用中,我就發現Struts確實連有些簡單的時間都處理不了(不知是我使用的方法不對還是Struts確實沒有考慮到)。順便你也能了解Struts是怎么把form里的請求參數populate到ActionForm里面的。
  
  今天下午同事告訴我把有java.util.Date類型屬性的類存入數據庫時出錯,把這個屬性刪除就沒有問題了。當時我就想到是RequestPRocessor在processPopulate()時出錯了,因此在它的這個方法設了斷點并跟蹤了進去。當然,它最先要調用ActionForm的reset()方法,然后調用實際處理populate(將請求參數傳給ActionForm)的RequestUtils.populate()方法。RequestUtils的這個靜態方法最先是處理Multipart的(即文件上傳等多部分)的方法,然后將所有的請求都放在叫properties的HashMap里并循環處理它:
      names = request.getParameterNames();
      while (names.hasMoreElements()) {
        String name = (String) names.nextElement();
        String stripped = name;
        if (prefix != null) {
          if (!stripped.startsWith(prefix)) {
            continue;
          }
          stripped = stripped.substring(prefix.length());
        }
        if (suffix != null) {
          if (!stripped.endsWith(suffix)) {
            continue;
          }
          stripped = stripped.substring(0, stripped.length() - suffix.length());
        }
        if (isMultipart) {
          properties.put(stripped, multipartParameters.get(name));
        } else {
          properties.put(stripped, request.getParameterValues(name));
        }
      }
  
  實際處理它們的是下面的:BeanUtils.populate(bean, properties); 其中bean就是接受數據的ActionForm,而properties里面則是所有的請求的鍵-值對(鍵和值都是字符串,http協議的特點)。
  
  再看看BeanUtils的靜態(類)方法populate是怎么處理的:
      // Loop through the property name/value pairs to be set
      Iterator names = properties.keySet().iterator();
      while (names.hasNext()) {
  
        // Identify the property name and value(s) to be assigned
        String name = (String) names.next();
        if (name == null) {
          continue;
        }
        Object value = properties.get(name);
  
        // Perform the assignment for this property
        setProperty(bean, name, value);
  
      }
  它是循環所有的請求參數,把實際的工作又交給了setProperty方法。呵呵,弄了半天,這幫人原來都是代理。
  
  這個方法還是代理嗎?計算了一下它有180行的代碼。這么長應該是個實干家了吧,錯!千萬不要被有些人的外表欺騙了!有些人一天上班16個小時,可夠敬業的,可有8小時在打CS。這個類就是:一上來20多行都在一個if (log.isTraceEnabled()){}里面。
  
  log在這說明一下。Struts中使用的是Jakarta Commons Logging的包,它使用的優先級是:Log4j(4念four似乎比較有意義,大概是Logger For Java的意思,我聽有的人年Log si J,感覺很別扭,呵呵),Java 1.4 Logging API,Simple Logging。功能是依次減弱。
  
  建議在寫Action 的execute()或被execute()調用的業務方法中使用Commons Logging 來代替System.out.println()--當要你把成百上千的System.out.println()去掉的時候你就會覺得Commons Logging是個多好的東東了。它的用法是:
   import org.apache.commons.logging.Log;
   import org.apache.commons.logging.LogFactory;
      private/protected static Log log = LogFactory.getLog(DispatchAction.class);
  假如你用的是DispatchAction,那你就不要自己定義Log的實例了,因為它已經有一個protected的Log實例,直接使用即可。
  
  使用方法是:
      if (log.isInfoEnabled()) {
         log.Info("some information.");
      }
  Logging把消息分為6種級別,debug,error,fatal,info,trace,warn。比如,你想記錄一條消息,它只是為了給用戶一個警告,則可以使用warn。為什么在每個log.Info()前做一次判定呢?難道假如log級別不答應Info,log.Info()仍然能Info嗎?當然不是。它的作用是提高效率。
  
  比如有個消息是計算前一萬個自然數的和(這種消息可能少見)。用直接log.Info()
      int sum=0;
      for(int i=0;i<10000;i++){
       sum+=i;
      }
      log.Info("the sum of form 1 to 10000 is : "_sum);
  假如log.Info是不答應的,那求10000個數的和就白求的。當然假如你的計算機很快或和高斯一樣聰明,直接log.Info()也每什么問題。
     
  閑話少說,回到180多行的BeanUtils.setProperty()方法。這個方法先是處理nested屬性,也就是xxx.xxx的請求參數。我們只看看處理簡單屬性的必須過程。下面這端代碼有點長,但它只做了一件事:將字符串的請求參數轉成ActionForm的類型。比如:你在ActionForm里有個Integer userAge;然后HTTP請求參數里可能會有http://localhost:8080/xxx.do?userAge=21。傳人的是字符串,目標是專程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 (type.isArray() && (index < 0)) { // Scalar value into array
        if (value == null) {
          String values[] = new String[1];
          values[0] = (String) value;
          newValue = ConvertUtils.convert((String[]) values, type);
        } else if (value instanceof String) {
          String values[] = new String[1];
          values[0] = (String) value;
          newValue = ConvertUtils.convert((String[]) values, type);
        } else if (value instanceof String[]) {
          newValue = ConvertUtils.convert((String[]) value, type);
        } else {
          newValue = value;
        }
      } else if (type.isArray()) {     // Indexed value into array
        if (value instanceof String) {
          newValue = ConvertUtils.convert((String) value,
                          type.getComponentType());
        } else if (value instanceof String[]) {
          newValue = ConvertUtils.convert(((String[]) value)[0],
                          type.getComponentType());
        } else {
          newValue = value;
        }
      } else {               // Value into scalar
        if ((value instanceof String) (value == null)) {
          newValue = ConvertUtils.convert((String) value, type);
        } else if (value instanceof String[]) {
          newValue = ConvertUtils.convert(((String[]) value)[0],
                          type);
        } else if (ConvertUtils.lookup(value.getClass()) != null) {
          newValue = ConvertUtils.convert(value.toString(), type);// Here is my program's break point
        } else {
          newValue = value;
        }
      }
  
  最后是:調用PropertyUtils的一些方法設置值。下面代碼的第一種情況是有索引的,即你在請求參數里傳了field[0]=123之類的參數,第二種是Map類型的,傳的是map(key)=value之類的參數,最一般的就是調用第三個方法。
        if (index >= 0) {
          PropertyUtils.setIndexedProperty(target, propName,
                           index, newValue);
        } else if (key != null) {
          PropertyUtils.setMappedProperty(target, propName,

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成人aaa| 国产99久久精品一区二区 夜夜躁日日躁| 日韩中文字幕精品视频| 这里精品视频免费| 久久久欧美一区二区| 国产美女久久久| 久久精品视频va| 亚洲国产精品va在线观看黑人| 亚洲欧美中文日韩在线| 亚洲欧美色婷婷| 亚洲a在线播放| 中文字幕精品久久久久| 日韩国产欧美精品在线| 国产91网红主播在线观看| 亚洲国产中文字幕久久网| 91久久在线播放| 久久久久久久久久婷婷| 亚洲日本欧美中文幕| 亚洲国产精品国自产拍av秋霞| 亚洲乱码国产乱码精品精天堂| 日韩经典中文字幕| 亚洲另类激情图| 国产网站欧美日韩免费精品在线观看| 奇米影视亚洲狠狠色| 日韩电视剧在线观看免费网站| 国产精品日日做人人爱| 热99精品只有里视频精品| 精品国产鲁一鲁一区二区张丽| 亚洲国产成人精品女人久久久| 欧美日韩国产一区二区三区| 久久成人精品电影| 在线免费看av不卡| 亚洲xxxx做受欧美| 亚洲成人久久一区| 91视频8mav| 国产精品吴梦梦| 久久久久久中文字幕| 国产成人啪精品视频免费网| 日韩www在线| 欧洲s码亚洲m码精品一区| 九九九久久久久久| 欧美三级欧美成人高清www| 欧美日韩在线免费观看| 中文字幕国产亚洲2019| 久久久久久午夜| 国产69精品久久久| 欧美极品少妇xxxxx| 久久精品人人爽| 中文字幕不卡在线视频极品| 久久久久国产一区二区三区| 日韩欧美国产黄色| 亚洲精品影视在线观看| 欧美电影免费观看| 国内精品久久影院| 九九热精品视频在线播放| 国产精品国产三级国产aⅴ9色| 久久久久久亚洲精品不卡| 国内免费久久久久久久久久久| 5566日本婷婷色中文字幕97| 亚洲第一级黄色片| 蜜月aⅴ免费一区二区三区| 97视频在线观看免费| 欧美裸体男粗大视频在线观看| 在线观看免费高清视频97| 亚洲国产成人91精品| 久久久久久免费精品| 日韩成人av网址| 久久99精品久久久久久噜噜| 欧美性猛交99久久久久99按摩| 蜜臀久久99精品久久久久久宅男| 亚洲福利视频网站| 久久精品2019中文字幕| 欧美高清视频免费观看| 久久国产精品首页| 97久久伊人激情网| 亚洲美女av电影| 国产精品久久久久久久久久小说| 欧美亚洲视频在线观看| 欧美日韩国产精品一区二区不卡中文| 国产精品美女www| 日韩美女在线观看| 国a精品视频大全| 亚洲激情在线观看| 奇米成人av国产一区二区三区| 成人有码视频在线播放| 国产精品久久久亚洲| 欧美一级在线亚洲天堂| 青青久久aⅴ北条麻妃| 国产在线高清精品| 97国产精品视频人人做人人爱| 国产福利精品在线| 亚洲精品少妇网址| 韩国美女主播一区| 欧美精品久久久久久久久久| 一区二区福利视频| 国产精品一区二区久久久久| 国产有码在线一区二区视频| 91在线高清免费观看| 中文字幕精品www乱入免费视频| 国语自产在线不卡| 国产精品白丝jk喷水视频一区| 伊人久久久久久久久久久久久| 欧美在线www| 91九色视频在线| 国产91精品黑色丝袜高跟鞋| www.xxxx精品| 日韩精品中文在线观看| 国产美女高潮久久白浆| 国产精品欧美日韩久久| 国外成人免费在线播放| 日韩在线观看成人| 国产视频自拍一区| 欧美日韩国产精品一区| 亚洲欧美日韩精品| 欧美极品少妇xxxxⅹ裸体艺术| 国产精品免费久久久久久| 欧美高清在线视频观看不卡| 欧美成人精品激情在线观看| 2019国产精品自在线拍国产不卡| 国产精品高清免费在线观看| 亚洲最新av网址| 国产日韩欧美在线播放| 欧美色欧美亚洲高清在线视频| 日韩精品在线电影| 国产亚洲精品美女| 久久香蕉国产线看观看av| 日韩精品欧美国产精品忘忧草| 欧洲成人在线观看| 日韩av在线免费观看| 国产精品一区二区女厕厕| 久久久亚洲影院你懂的| 亚洲欧洲视频在线| 国产精品日韩欧美综合| 日韩精品中文字幕久久臀| 538国产精品一区二区在线| 精品视频久久久久久久| 欧美一级淫片videoshd| 中文字幕久久精品| 久久天天躁狠狠躁老女人| 欧美精品久久久久久久久| 美女啪啪无遮挡免费久久网站| 91精品啪在线观看麻豆免费| 国产在线视频欧美| 欧美日韩一区二区免费在线观看| 欧美激情女人20p| 国产欧美日韩精品在线观看| 成人免费淫片aa视频免费| 国产欧美日韩中文| 热99久久精品| 亚洲国产精品va在线看黑人动漫| 国产精品最新在线观看| 欧美最猛性xxxxx亚洲精品| 欧美日韩国产一区二区三区| 欧美亚洲国产日韩2020| 亚洲石原莉奈一区二区在线观看| 亚洲精品国产拍免费91在线| 中文字幕一区电影| 欧美日韩高清在线观看| 国产成人激情视频| 97**国产露脸精品国产| 国产欧美日韩专区发布| 国产精品精品视频一区二区三区| 亚洲国产精品久久久久秋霞蜜臀| 国产欧美一区二区三区久久人妖|