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

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

基于 J2EE 體系實現多層結構 Blog 平臺(3)

2019-11-18 12:28:12
字體:
來源:轉載
供稿:網友

  十二、生成縮略圖
  當用戶上傳了圖片后,必須生成縮略圖以便用戶能快速瀏覽。我們不需借助第三方軟件,JDK標準庫就包含了圖像處理的API。我們把一張圖片按比例縮放到120X120大小,以下是要害代碼:
  
  public static void createPReviewImage(String srcFile, String destFile) {
    try {
      File fi = new File(srcFile); // src
      File fo = new File(destFile); // dest
      BufferedImage bis = ImageIO.read(fi);
  
      int w = bis.getWidth();
      int h = bis.getHeight();
      double scale = (double)w/h;
      int nw = IMAGE_SIZE; // final int IMAGE_SIZE = 120;
      int nh = (nw * h) / w;
      if( nh>IMAGE_SIZE ) {
        nh = IMAGE_SIZE;
        nw = (nh * w) / h;
      }
      double sx = (double)nw / w;
      double sy = (double)nh / h;
  
      transform.setToScale(sx,sy);
      AffineTransformOp ato = new AffineTransformOp(transform, null);
      BufferedImage bid = new BufferedImage(nw, nh, BufferedImage.TYPE_3BYTE_BGR);
      ato.filter(bis,bid);
      ImageIO.write(bid, "jpeg", fo);
    } catch(Exception e) {
      e.printStackTrace();
      throw new RuntimeException("Failed in create preview image. Error: " + e.getMessage());
    }
  }
  
  十三、實現rss
  RSS是一個標準的xml文件,Rss閱讀器可以讀取這個XML文件獲得文章的信息,使用戶可以通過Rss閱讀器而非瀏覽器閱讀Blog,我們只要動態生成這個XML文件便可以了。RSSLibJ是一個專門讀取和生成RSS的小巧實用的java庫,大小僅25k,可以從http://sourceforge.net/projects/rsslibj/下載rsslibj-1_0RC2.jar和它需要的EXMLjar兩個文件,然后復制到web/WEB-INF/lib/下。
  
  使用RSSLibJ異常簡單,我們先設置好HttpServletResponse的Header,然后通過RSSLibJ輸出XML即可:
  
  Channel channel = new Channel();
  channel.setDescription(account.getDescription());
  baseUrl = baseUrl.substring(0, n);
  channel.setLink("http://server-name/home.c?accountId=" + accountId);
  channel.setTitle(account.getTitle());
  List articles = facade.getArticles(accountId, account.getMaXPerPage(), 1);
  Iterator it = articles.iterator();
  while(it.hasNext()) {
    Article article = (Article)it.next();
    channel.addItem("http://server-name/article.c?articleId=" + article.getArticleId(),
      article.getSummary(), article.getTitle()
    );
  }
  // 輸出xml:
  response.setContentType("text/xml");
  PrintWriter pw = response.getWriter();
  pw.print(channel.getFeed("rss"));
  pw.close();
  
  十四、實現全文搜索
  全文搜索能大大方便用戶快速找到他們希望的文章,為blog增加一個全文搜索功能是非常必要的。然而,全文搜索不等于SQL的LIKE語句,因為關系數據庫的設計并不是為全文搜索設計的,數據庫索引對全文搜索無效,在一個幾百萬條記錄中檢索LIKE '%A%'可能會耗時幾分鐘,這是不可接受的。幸運的是,我們能使用免費并且開源的純Java實現的LUCene全文搜索引擎,Lucene可以非常輕易地集成到我們的blog中。
  
  Lucene不提供直接對文件,數據庫的索引,只提供一個高性能的引擎,但接口卻出人意料地簡單。我們只需要關心以下幾個簡單的接口:
  
  Document:代表Lucene數據庫的一條記錄,也代表搜索的一條結果。
  
  Field:一個Document包含一個或多個Field,類似關系數據庫的字段。
  
  IndexWriter:用于創建新的索引,也就是向數據庫添加新的可搜索的大段字符串。
  
  Analyzer:將字符串拆分成單詞(Token),不同的文本對應不同的Analyzer,如HtmlAnalyzer,PDFAnalyzer。
  
  Query:封裝一個查詢,用于解析用戶輸入。例如,將“bea blog”解析為“同時包含bea和blog的文章”。
  
  Searcher:搜索一個Query,結果將以Hits返回。
  
  Hits:封裝一個搜索結果,包含Document集合,能非常輕易地輸出結果。
  
  下一步,我們需要為Article表的content字段建立全文索引。首先為Lucene新建一個數據庫,請注重這個數據庫是Lucene專用的,我們不能也不必知道它的內部結構。Lucene的每個數據庫對應一個目錄,只需要指定目錄即可:
  
  String indexDir = "C:/search/blog";
  IndexWriter indexWriter = new IndexWriter(indexDir, new StandardAnalyzer(), true);
  indexWriter.close();
  
  然后添加文章,讓Lucene對其索引:
  
  String title = "文章標題"
  // 從數據庫讀取
  String content = "文章內容"
  // 從數據庫讀取
  // 打開索引:
  IndexWriter indexWriter = new IndexWriter(indexDir, new StandardAnalyzer(), false);
  // 添加一個新記錄:
  Document doc = new Document();
  doc.add(Field.KeyWord("title", title));
  doc.add(Field.Text("content", content));
  // 建立索引:
  indexWriter.addDocument(doc);
  // 關閉:
  indexWriter.close();
  
  要搜索文章非常簡單,然后添加文章,讓對其索引:
  
  String title = "文章標題" // 從數據庫讀取
  String content = "文章內容" // 從數據庫讀取
  // 打開索引:
  IndexWriter indexWriter = new IndexWriter(indexDir, new StandardAnalyzer(), false);
  // 添加一個新記錄:
  Document doc = new Document();
  doc.add(Field.Keyword("title", title));
  doc.add(Field.Text("content", content));
  // 建立索引:
  indexWriter.addDocument(doc);
  // 關閉:
  indexWriter.close();
  
  要搜索文章:
  
  Searcher searcher = new IndexSearcher(dir);
  Query query = QueryParser.parse(keyword, "content", new StandardAnalyzer());
  Hits hits = searcher.search(query);
  if(hits != null){
    for(int i = 0;i < hits.length(); i++){
      Document doc = hits.doc(i);
      System.out.println("found in " + doc.get("title"));
      System.out.println(doc.get("content"));
    }
  }
  searcher.close();
  
  我們設計一個LuceneSearcher類封裝全文搜索功能,由于必須鎖定數據庫所在目錄,我們把數據庫設定在/WEB-INF/search/下,確保用戶不能訪問,并且在配置文件中初始化目錄:
  
  <bean id="luceneSearcher" class="org.crystalblog.search.LuceneSearcher">
    <property name="Directory">
      <value>/WEB-INF/search/</value>
    </property>
  </bean>
  
  十五、發送Email
  Blog用戶可以讓系統將來訪用戶的留言發送到注冊的Email地址,為了避免使用SMTP發信服務器,我們自己手動編寫一個SendMail組件,直接通過SMTP協議將Email發送到用戶信箱。
  
  SendMail組件只需配置好DNS服務器的IP地址,即可向指定的Email信箱發送郵件。并且,SendMail使用緩沖隊列和多線程在后臺發送Email,不會中斷正常的Web服務。具體代碼請看SendMail.java。
  
  十六、測試
  服務器配置為:P4 1.4G,512M DDR,100M Ethernet,Windows xp Professional SP2。
  
  測試服務器分別為WebLogic Server 8.1,Tomcat 4.1/5.0,Resin 2.1.1。
  
  測試數據庫為MS SQL Server 2000 SP3。
  
  十七、中文支持
  測試發現,中文不能在頁面中正常顯示,為了支持中文,首先在web.xml加入Filter,用于將輸入編碼設置為gb2312:
  
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.crystalblog.web.filter.EncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>gb2312</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  然后用文本工具搜索所有的.htm,.html,.properties文件,將“iso-8859-1”替換為“gb2312”,現在頁面中文已經能正常顯示,但是Lucene仍不能正常解析中文,原因是標準的StandardA?nalyzer只能解析英文,可以從網上下載一個支持中文的Analyzer。
  
  十八、總結
  Spring的確是一個優秀的J2EE框架,通過Spring強大的集成和配置能力,我們能輕松設計出靈活的多層J2EE應用而無需復雜的EJB組件支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品日韩丝袜精品| 欧美性色19p| 国产免费一区二区三区在线能观看| 亚洲欧洲视频在线| 日韩欧美中文第一页| 日韩av电影院| 久久久久久香蕉网| 91av网站在线播放| 色爱精品视频一区| 国产精品久久久av| 欧美日产国产成人免费图片| 成人激情黄色网| 国产日韩欧美在线观看| 欧美巨猛xxxx猛交黑人97人| 日韩av电影在线播放| 91麻豆国产精品| 影音先锋日韩有码| 欧美xxxx14xxxxx性爽| 亚洲欧美国产日韩中文字幕| 91av在线播放| 精品亚洲一区二区三区在线观看| 色婷婷av一区二区三区在线观看| 亚洲激情电影中文字幕| 日本精品免费一区二区三区| 欧美日韩亚洲天堂| 久久久久久久国产| 久久久亚洲精选| 亚洲91av视频| 欧美日韩亚洲精品内裤| 国产精品久久久久久久久久久久| 欧美区在线播放| 日韩精品在线视频| 日韩精品免费在线观看| 欧美性xxxxx| 中文字幕综合一区| 亚洲第一av在线| 国产亚洲人成网站在线观看| 久久久久久久久综合| 一区二区欧美在线| 亚洲欧洲xxxx| 日韩日本欧美亚洲| 亚洲a在线播放| 51视频国产精品一区二区| 久久久久久国产| 欧美性xxxx极品高清hd直播| 亚洲第一色在线| 国产精品成人免费电影| 亚洲色图在线观看| 一区二区三区动漫| 日韩中文字幕在线视频播放| 中文字幕av一区二区| 国产97在线视频| 超在线视频97| 国产精品h片在线播放| 韩国精品美女www爽爽爽视频| 久久亚洲精品网站| 久久精品91久久久久久再现| 人九九综合九九宗合| 国产女同一区二区| 精品国产一区av| 亚洲激情视频网站| 日韩精品欧美国产精品忘忧草| 国产成人亚洲综合91| 综合av色偷偷网| 精品国产乱码久久久久久天美| 精品亚洲夜色av98在线观看| 日韩免费观看在线观看| 国产精品久久久久77777| 国产精品国产福利国产秒拍| 日韩在线小视频| 国产成人精品a视频一区www| 美女视频久久黄| 欧美亚洲成人网| 日韩有码视频在线| 久久国产视频网站| 亚洲精品国产欧美| 成人羞羞国产免费| 国产在线精品一区免费香蕉| 欧美激情第99页| 国产精品福利久久久| 日韩在线观看精品| 欧美激情精品久久久| 国产日韩精品在线播放| 国产网站欧美日韩免费精品在线观看| 亚洲精品成人久久电影| 中文字幕久久久| 91精品久久久久久久久久另类| 国产精品久久久| 欧美日韩激情美女| 国产香蕉精品视频一区二区三区| 国内精品久久久久| 国产亚洲精品日韩| 欧美精品在线网站| 欧美在线视频观看免费网站| 久久精品免费播放| 蜜臀久久99精品久久久无需会员| 成人免费看片视频| 国产午夜精品久久久| 国产日韩欧美视频在线| 国产日韩综合一区二区性色av| 色综久久综合桃花网| 久久天天躁狠狠躁夜夜躁2014| 国产精品wwww| 国产精品网站入口| 欧美午夜xxx| 欧美日韩中文字幕综合视频| 国产精品777| 日韩欧美高清在线视频| 97国产精品免费视频| 欧美精品久久久久久久久| 精品视频在线导航| 国产精品欧美日韩一区二区| 欧美美女15p| 国产日韩在线观看av| 亚洲国产精品人人爽夜夜爽| 在线看国产精品| 国产美女久久精品| 秋霞成人午夜鲁丝一区二区三区| 日韩有码片在线观看| 6080yy精品一区二区三区| 色综合久久久久久中文网| 尤物精品国产第一福利三区| 亚洲肉体裸体xxxx137| 日韩大陆欧美高清视频区| 亚洲综合最新在线| 一区二区三区回区在观看免费视频| 日韩欧美在线视频免费观看| 97精品视频在线| 精品久久久久久| 欧美第一黄网免费网站| 亚洲缚视频在线观看| 亚洲精品久久久久久久久久久久| 亚洲第一黄色网| 国自产精品手机在线观看视频| 国产亚洲a∨片在线观看| 亚洲www在线观看| 91成人福利在线| 日韩精品亚洲视频| 国产精品成人va在线观看| 成人字幕网zmw| 欧美黄色性视频| 久久在线免费观看视频| 91欧美精品成人综合在线观看| 日韩经典中文字幕在线观看| 亚洲男人7777| 欧美精品videosex牲欧美| 超碰97人人做人人爱少妇| 久久久亚洲影院| 日韩国产精品一区| 久久久伊人日本| 青青久久aⅴ北条麻妃| 色噜噜久久综合伊人一本| 欧美激情久久久| 国产精品丝袜白浆摸在线| 久久久精品电影| 伊人av综合网| 色妞久久福利网| 性色av一区二区三区红粉影视| 久久91亚洲精品中文字幕奶水| 欧美精品在线看| 亚洲第一页在线| 欧美电影第一页| 欧美一区二区三区精品电影| 国模叶桐国产精品一区|