現在的位置: 首頁 > 搜索技術 > 正文

(轉)SSH + Lucene + 分頁 + 排序 + 高亮 模擬簡單新聞網站搜索引擎

2014年10月26日 搜索技術 ⁄ 共 68306字 ⁄ 字型大小 評論關閉

 

 IDE使用的MyEclipse6.5,資料庫使用MySQL 5.0.37 , 另裝了Navicat for MySQL , jdk版本是6.0

    工程做完的效果圖如下,com.zly.indexManager中兩個類,分別創建索引和搜索索引,

    com.zly.test.entity中是使用的實體類,分別是NewsType(新聞類型),NewsItem(新聞具體條目),PageControl(分頁實體bean) , SearchResultBean(保存搜索結果的bean).

  

    

 

        瀏覽和搜索的前提是有據可查,沒有數據什麼都實現不了 , 我使用了Htmlparser通過抓取頁面信息的形式將新聞添加進資料庫 , 添加資料庫數據使用了hibernate3

        使用了Annotation的方式完成資料庫的映射。

         //NewsType(新聞類型)

Java代碼 複製代碼
  1. package com.zly.test.entity;   
  2.   
  3. import java.io.Serializable;   
  4.   
  5. import javax.persistence.Column;   
  6. import javax.persistence.Entity;   
  7. import javax.persistence.GeneratedValue;   
  8. import javax.persistence.GenerationType;   
  9. import javax.persistence.Id;   
  10. import javax.persistence.Table;   
  11. @Entity  
  12. @Table(name = "t_newsType")   
  13. public class NewsType implements Serializable {   
  14.   
  15.        
  16.     private static final long serialVersionUID = -5092622762025999122L;   
  17.        
  18.     private Integer id;   
  19.        
  20.     private String newsTypeName;   
  21.     @Column  
  22.     public String getNewsTypeName() {   
  23.         return newsTypeName;   
  24.     }   
  25.   
  26.     public void setNewsTypeName(String newsTypeName) {   
  27.         this.newsTypeName = newsTypeName;   
  28.     }   
  29.     @Id  
  30.     @GeneratedValue(strategy = GenerationType.AUTO)   
  31.     public Integer getId() {   
  32.         return id;   
  33.     }   
  34.   
  35.     public void setId(Integer id) {   
  36.         this.id = id;   
  37.     }   
  38.        
  39.        
  40. }  

 

   //NewsItem(新聞具體條目)

  

Java代碼 複製代碼
  1. package com.zly.test.entity;   
  2.   
  3. import java.io.Serializable;   
  4. import java.util.Date;   
  5.   
  6. import javax.persistence.Column;   
  7. import javax.persistence.Entity;   
  8. import javax.persistence.GeneratedValue;   
  9. import javax.persistence.GenerationType;   
  10. import javax.persistence.Id;   
  11. import javax.persistence.JoinColumn;   
  12. import javax.persistence.ManyToOne;   
  13. import javax.persistence.Table;   
  14. import javax.persistence.Temporal;   
  15. import javax.persistence.TemporalType;   
  16. @Entity  
  17. @Table(name = "t_newsItem")   
  18. public class NewsItem implements Serializable {   
  19.   
  20.        
  21.     private static final long serialVersionUID = -7532888546907495633L;   
  22.        
  23.     private Integer id ;    
  24.        
  25.     private String newsTitle ;   
  26.        
  27.     private String newsContent;   
  28.        
  29.     private Date publishTime;   
  30.        
  31.     private String resource;   
  32.        
  33.     private NewsType type;   
  34.        
  35.     private String editor;   
  36.     @Column  
  37.     public String getEditor() {   
  38.         return editor;   
  39.     }   
  40.   
  41.     public void setEditor(String editor) {   
  42.         this.editor = editor;   
  43.     }   
  44.     @ManyToOne  
  45.     @JoinColumn(name = "t_newsType_id")   
  46.     public NewsType getType() {   
  47.         return type;   
  48.     }   
  49.   
  50.     public void setType(NewsType type) {   
  51.         this.type = type;   
  52.     }   
  53.     @Id  
  54.     @GeneratedValue(strategy = GenerationType.AUTO)   
  55.     public Integer getId() {   
  56.         return id;   
  57.     }   
  58.   
  59.     public void setId(Integer id) {   
  60.         this.id = id;   
  61.     }   
  62.     @Column  
  63.     public String getNewsTitle() {   
  64.         return newsTitle;   
  65.     }   
  66.   
  67.     public void setNewsTitle(String newsTitle) {   
  68.         this.newsTitle = newsTitle;   
  69.     }   
  70.        
  71.        
  72.     @Temporal(value = TemporalType.TIMESTAMP)   
  73.     public Date getPublishTime() {   
  74.         return publishTime;   
  75.     }   
  76.   
  77.     public void setPublishTime(Date publishTime) {   
  78.         this.publishTime = publishTime;   
  79.     }   
  80.   
  81.     public String getResource() {   
  82.         return resource;   
  83.     }   
  84.   
  85.     public void setResource(String resource) {   
  86.         this.resource = resource;   
  87.     }   
  88.   
  89.     public String getNewsContent() {   
  90.         return newsContent;   
  91.     }   
  92.   
  93.     public void setNewsContent(String newsContent) {   
  94.         this.newsContent = newsContent;   
  95.     }   
  96.        
  97.        
  98. }  

 

    添加所有新聞類型的類放在了com.zly.test.newsFetch包下 , 具體代碼:

 

 

Java代碼 複製代碼
  1. package com.zly.test.newsfetch;   
  2.   
  3.   
  4. import java.text.DateFormat;   
  5. import java.text.SimpleDateFormat;   
  6. import java.util.Date;   
  7. import java.util.LinkedHashSet;   
  8. import java.util.Set;   
  9. import java.util.regex.Matcher;   
  10. import java.util.regex.Pattern;   
  11.   
  12. import org.hibernate.Session;   
  13. import org.hibernate.SessionFactory;   
  14. import org.hibernate.cfg.AnnotationConfiguration;   
  15. import org.hibernate.cfg.Configuration;   
  16. import org.htmlparser.Parser;   
  17. import org.htmlparser.Tag;   
  18. import org.htmlparser.filters.NodeClassFilter;   
  19. import org.htmlparser.tags.Div;   
  20. import org.htmlparser.tags.LinkTag;   
  21. import org.htmlparser.util.NodeList;   
  22. import org.htmlparser.visitors.NodeVisitor;   
  23.   
  24. import com.zly.test.entity.NewsItem;   
  25. import com.zly.test.entity.NewsType;   
  26.   
  27. public class GetNews {   
  28.     public static void main(String[] args) throws Exception {   
  29.         //插入數據新聞類型   
  30.         //insertAllTypes();   
  31.            
  32.         //插入所有新聞數據   
  33.            
  34.         //國內新聞   
  35.         //insertNewsItems("http://www.chinanews.com.cn/scroll-news/gn/2009/05" ,"/news.shtml" ,1);   
  36.         //國際新聞   
  37.         //insertNewsItems("http://www.chinanews.com.cn/scroll-news/gj/2009/05" ,"/news.shtml" ,2);   
  38.         //社會新聞   
  39.         //insertNewsItems("http://www.chinanews.com.cn/scroll-news/sh/2009/05" ,"/news.shtml" ,3);   
  40.         //港澳新聞   
  41.         //insertNewsItems("http://www.chinanews.com.cn/scroll-news/ga/2009/05" ,"/news.shtml" ,4);         
  42.         //台灣新聞   
  43.         //insertNewsItems("http://www.chinanews.com.cn/scroll-news/tw/2009/05" ,"/news.shtml" ,5);         
  44.         //華人新聞   
  45.         //insertNewsItems("http://www.chinanews.com.cn/scroll-news/hr/2009/05" ,"/news.shtml" ,6);         
  46.         //經濟新聞   
  47.         //insertNewsItems("http://www.chinanews.com.cn/scroll-news/cj/2009/05" ,"/news.shtml" ,7);         
  48.         //文化新聞   
  49.         //insertNewsItems("http://www.chinanews.com.cn/scroll-news/wh/2009/05" ,"/news.shtml" ,8);         
  50.         //娛樂新聞   
  51.         //insertNewsItems("http://www.chinanews.com.cn/scroll-news/yl/2009/05" ,"/news.shtml" ,9);         
  52.         //體育新聞   
  53.         //insertNewsItems("http://www.chinanews.com.cn/scroll-news/ty/2009/05" ,"/news.shtml" ,10);        
  54.         //教育新聞   
  55.         //insertNewsItems("http://www.chinanews.com.cn/scroll-news/edu/2009/05" ,"/news.shtml" ,11);           
  56.         //健康新聞   
  57.         //insertNewsItems("http://www.chinanews.com.cn/scroll-news/jk/2009/05" ,"/news.shtml" ,12);        
  58.         //生活新聞   
  59.         //insertNewsItems("http://www.chinanews.com.cn/scroll-news/life/2009/05" ,"/news.shtml" ,13);          
  60.         //IT新聞   
  61.         //insertNewsItems("http://www.chinanews.com.cn/scroll-news/it/2009/05" ,"/news.shtml" ,14);        
  62.     }   
  63.     public static void insertAllTypes() {   
  64.         Configuration cfg = new AnnotationConfiguration().configure();   
  65.         SessionFactory factory = cfg.buildSessionFactory();   
  66.         Session session = factory.openSession();   
  67.         String str = new String("國內 國際 社會 港澳 台灣 華人 經濟 文化 娛樂 體育 教育 健康 生活 IT");   
  68.         String[] typesStr = str.split(" ");   
  69.         NewsType[] types = new NewsType[typesStr.length];   
  70.         session.beginTransaction();   
  71.         for (int i = 0; i < typesStr.length; i++) {   
  72.             types[i] = new NewsType();   
  73.             types[i].setNewsTypeName(typesStr[i]);   
  74.             session.save(types[i]);   
  75.         }   
  76.         session.getTransaction().commit();   
  77.         session.close();   
  78.     }   
  79.        
  80.     //處理5.1 - 5.5 所有的具體類型的新聞   
  81.        
  82.     public static void insertNewsItems(String before , String after , int type) throws Exception {   
  83.         Configuration cfg = new AnnotationConfiguration().configure();   
  84.         SessionFactory factory = cfg.buildSessionFactory();   
  85.         Session session = factory.openSession();   
  86.         //得到當前新聞所屬類別   
  87.         NewsType newsType = (NewsType) session.get(NewsType.class, type);   
  88.         final Set<NewsItem> set = new LinkedHashSet<NewsItem>();   
  89.         //獲取5月1日-5月5日的新聞   
  90.         for (int i = 1; i <= 5; i++) {   
  91.             String src = before;   
  92.             if(i < 10) {   
  93.                 src = src + "0" + i;   
  94.             }else {   
  95.                 src = src + i ;    
  96.             }   
  97.             src = src + after;   
  98.             //使用htmlParser獲取每一條新聞的超鏈接   
  99.             Parser parser = new Parser(src);   
  100.             parser.setEncoding("gb2312");   
  101.             NodeList divList = parser.parse(new NodeClassFilter(Div.class));   
  102.             for (int j = 0; j < divList.size(); j++) {   
  103.                 Div div = (Div) divList.elementAt(j);   
  104.                 String divClass = div.getAttribute("id");   
  105.                 //取得id為news_list的div   
  106.                 if(divClass != null && divClass.equals("news_list")) {   
  107.                     div.accept(new NodeVisitor() {   
  108.                         //遍歷news_list裡面的所有超鏈接   
  109.                         public void visitTag(Tag tag) {   
  110.                             if(tag instanceof LinkTag) {   
  111.                                 String href = ((LinkTag)tag).getLink();   
  112.                                 if(!href.startsWith("http")) {   
  113.                                     href = "http://www.chinanews.com.cn" + href;   
  114.                                 }   
  115.                                 System.out.println(href);   
  116.                                 //找到超鏈接,將這個超鏈接所在的頁面進行處理,抓取新聞數據,並將其保存在Set中。   
  117.                                 try{   
  118.                                     insertOneNews(href , set);   
  119.                                 }catch(Exception e) {   
  120.                                     e.printStackTrace();   
  121.                                 }   
  122.                                    
  123.                             }   
  124.                         }   
  125.                     });   
  126.                 }   
  127.             }   
  128.         }   
  129.         //獲取新聞完成後,將所有NewsItem添加到資料庫   
  130.         session.beginTransaction();   
  131.         for (NewsItem newsItem : set) {   
  132.             newsItem.setType(newsType);   
  133.             session.save(newsItem);   
  134.         }   
  135.         session.getTransaction().commit();   
  136.         session.close();   
  137.     }   
  138.     //處理每一個具體的新聞超鏈接,得到NewsItem類   
  139.     public static void insertOneNews(String src , Set<NewsItem> set) throws Exception {   
  140.         Parser parser = new Parser(src);   
  141.         parser.setEncoding("gb2312");   
  142.         NodeList divList = parser.extractAllNodesThatMatch(new NodeClassFilter(Div.class));   
  143.         NewsItem newsItem = new NewsItem();   
  144.         String title = "";   
  145.         Date parse = null;   
  146.         String content = "";   
  147.         String editor = "";   
  148.         //遍歷網頁的div。將制定div裡面的信息設置到NewsItem實體類中   
  149.         for (int i = 0; i < divList.size(); i++) {   
  150.             Div div = (Div) divList.elementAt(i);   
  151.             String divString = div.getAttribute("class");   
  152.             if(divString != null) {   
  153.                 //設置標題   
  154.                 if(divString.equals("left_bt")) {   
  155.                     title = div.toPlainTextString();   
  156.                 }   
  157.                 //設置發布時間   
  158.                 if(divString.equals("left_time")) {   
  159.                     String publishStr = "";   
  160.                     Pattern pattern = Pattern.compile("[//d]{4}年[//d]{2}月[//d]{2}日 [//d]{2}:[//d]{2}");   
  161.                     Matcher matcher = pattern.matcher(div.toPlainTextString()) ;   
  162.                     if(matcher.find()) {   
  163.                         publishStr = matcher.group();   
  164.                     }   
  165.                     DateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");   
  166.                     parse = format.parse(publishStr);   
  167.                 }   
  168.                 //設置正文內容   
  169.                 if(divString.equals("left_zw")) {   
  170.                     content = div.toHtml();   
  171.                 }   
  172.                 //設置記者名稱   
  173.                 if(divString.equals("left_name")) {   
  174.                     editor = div.toPlainTextString().trim();   
  175.                     editor = editor.substring(editor.indexOf(":") + 1, editor.lastIndexOf("】"));   
  176.                 }   
  177.             }   
  178.                
  179.         }   
  180.         newsItem.setEditor(editor);   
  181.         newsItem.setNewsContent(content);   
  182.         newsItem.setNewsTitle(title);   
  183.         newsItem.setPublishTime(parse);   
  184.         //設置新聞來源   
  185.         newsItem.setResource("最快新聞網");   
  186.         //將新聞添加到set中   
  187.         set.add(newsItem);   
  188.     }   
  189. }  

 

 通過上面的代碼完成了所有的數據添加工作。

 

下面根據ssh的流程分別定製dao , manager , action

 

com.zly.test.dao包中是所有操作dao的抽象類和介面

 

我們直接看這些介面的實現

 

//NewsItemDaoHibernate  新聞實體類dao

 

 

 

Java代碼 複製代碼
  1. @SuppressWarnings("unchecked")   
  2.     //根據分頁得到具體頁的內容   
  3.     public List<com.zly.test.entity.NewsItem> getNewsItemByFirstResultAndMaxResult(   
  4.             final int firstResult, final int maxResult , final int type) {   
  5.         return (List<NewsItem>) this.getHibernateTemplate().execute(new HibernateCallback() {   
  6.             public Object doInHibernate(Session session)   
  7.                     throws HibernateException, SQLException {   
  8.                 return session.createQuery(" from NewsItem where type.id = '" + type + "'").setFirstResult(firstResult).setMaxResults(maxResult).list();   
  9.             }   
  10.         });   
  11.     }   
  12.     //得到數據總條數 , 以便計算總頁數   
  13.     public Long getItemCount(final int id) {   
  14.         return (Long) this.getHibernateTemplate().execute(new HibernateCallback(){   
  15.             public Object doInHibernate(Session session)   
  16.                     throws HibernateException, SQLException {   
  17.                 return session.createQuery("select count(*) from NewsItem where type.id = '" + id + "'").uniqueResult();   
  18.             }   
  19.         });   
  20.     }   
  21.     //顯示新聞數據頁面用到, 查詢具體新聞屬於哪個新聞類別   
  22.     public int getNewsType(final int id) {   
  23.         return (Integer) this.getHibernateTemplate().execute(new HibernateCallback() {   
  24.             public Object doInHibernate(Session session)   
  25.                     throws HibernateException, SQLException {   
  26.                 NewsItem newsItem = get(id);   
  27.                 NewsType type = newsItem.getType();   
  28.                 return type.getId();   
  29.             }   
  30.         });   
  31.     }  

 

   只用到了一個   NewsManagerImpl 

 

 

Java代碼 複製代碼
  1. package com.zly.test.service.impl;   
  2.   
  3. import java.util.List;   
  4.   
  5. import com.zly.test.dao.NewsItemDao;   
  6. import com.zly.test.entity.NewsItem;   
  7. import com.zly.test.service.NewsManager;   
  8.   
  9. public class NewsManagerImpl implements NewsManager {   
  10.     //新聞條目dao   
  11.     private NewsItemDao newsItemDao;   
  12.        
  13.     public NewsItemDao getNewsItemDao() {   
  14.         return newsItemDao;   
  15.     }   
  16.   
  17.     public void setNewsItemDao(NewsItemDao newsItemDao) {   
  18.         this.newsItemDao = newsItemDao;   
  19.     }   
  20.     //根據分頁得到內容   
  21.     public List<NewsItem> getNewsItemByFirstResultAndMaxResult(int firstResult,   
  22.             int maxResult , int type) {   
  23.         return newsItemDao.getNewsItemByFirstResultAndMaxResult(firstResult, maxResult ,  type);   
  24.     }   
  25.     //得到總記錄數,以便計算總頁數   
  26.     public Long getItemCounts(int id) {   
  27.         return newsItemDao.getItemCount(id);   
  28.     }   
  29.     //通過id得到具體新聞   
  30.     public NewsItem getNewsById(int id) {   
  31.         return newsItemDao.get(id);   
  32.     }   
  33.     //通過id得到所屬新聞類別的id   
  34.     public int getNewsType(int id) {   
  35.         return newsItemDao.getNewsType(id);    
  36.     }   
  37.   
  38. }  

 

 

在applicationContext-action.xml中配置action類別

Java代碼 複製代碼
  1. <bean class="com.zly.test.action.NewsAction" id="newsAction" scope="request">   
  2.         <property name="newsManager" ref="newsManager"></property>   
  3.         <property name="map" ref="map"></property>   
  4.         <property name="map1" ref="map1"></property>   
  5. </bean>  

 

其中定一個兩個map , 因為主頁的查看分類新聞的url是採用的這種形式<a href="newsAction.action?category=china" target="_blank">國內</a>   名字為map的Map中保存信息如下

 

Java代碼 複製代碼
  1. <bean id="map" class="java.util.HashMap">   
  2.    <constructor-arg>   
  3.     <map>   
  4.     <entry key="china" value="1###國內新聞" />   
  5.         <entry key="world" value="2###國際新聞" />   
  6.         <entry key="society" value="3###社會新聞" />   
  7.         <entry key="compatriot" value="4###港台新聞" />   
  8.         <entry key="taiwan" value="5###台灣新聞" />   
  9.         <entry key="huaren" value="6###華人新聞" />   
  10.         <entry key="economic" value="7###經濟新聞" />   
  11.         <entry key="wenhua" value="8###文化新聞" />   
  12.         <entry key="entertainment" value="9###娛樂新聞" />   
  13.         <entry key="sports" value="10###體育新聞" />   
  14.         <entry key="jiaoyu" value="11###教育新聞" />   
  15.         <entry key="jiankang" value="12###健康新聞" />   
  16.         <entry key="life" value="13###生活新聞" />   
  17.         <entry key="keji" value="14###科技新聞" />   
  18.     </map>   
  19.    </constructor-arg>   
  20. </bean>  

 

  key是?category後面的值 , value是兩部分 , 被###分割開 , 前面的數值是所屬新聞類別的id值, 後面的文字是其類別的文字。將其保存在map中,避免不停地查詢資料庫。

 

  分頁類PageControl的代碼如下:

 

Java代碼 複製代碼
  1. package com.zly.test.entity;   
  2.   
  3. import java.util.List;   
  4.   
  5.   
  6.   
  7.   
  8. public class PageControl {   
  9.        
  10.     private int curPage ; //當前是第幾頁    
  11.        
  12.     private int maxPage ; //一共有多少頁    
  13.        
  14.     private Long maxRowCount ; //一共有多少行    
  15.        
  16.     private int rowsPerPage = 8 ; //每頁有多少行    
  17.   
  18.     private List<?> data;//每頁的User   
  19.        
  20.     public int getCurPage() {   
  21.         return curPage;   
  22.     }   
  23.   
  24.     public void setCurPage(int curPage) {   
  25.         this.curPage = curPage;   
  26.     }   
  27.   
  28.     public int getMaxPage() {   
  29.         return maxPage;   
  30.     }   
  31.   
  32.     public void setMaxPage(int maxPage) {   
  33.         this.maxPage = maxPage;   
  34.     }   
  35.   
  36.     public List<?> getUserList() {   
  37.         return data;   
  38.     }   
  39.   
  40.     public void setUserList(List<?> data) {   
  41.         this.data = data;   
  42.     }   
  43.   
  44.     public Long getMaxRowCount() {   
  45.         return maxRowCount;   
  46.     }   
  47.   
  48.     public void setMaxRowCount(Long amaxRowCountxRowCount) {   
  49.         this.maxRowCount = amaxRowCountxRowCount;   
  50.     }   
  51.   
  52.     public int getRowsPerPage() {   
  53.         return rowsPerPage;   
  54.     }   
  55.   
  56.     public void setRowsPerPage(int rowsPerPage) {   
  57.         this.rowsPerPage = rowsPerPage;   
  58.     }   
  59.        
  60.     public void countMaxPage() {   //根據總行數計算總頁數     
  61.         if (this.maxRowCount % this.rowsPerPage ==0){   
  62.            this.maxPage = (int) (this.maxRowCount/this.rowsPerPage);   
  63.         }else{   
  64.            this.maxPage = (int) (this.maxRowCount/this.rowsPerPage + 1);           
  65.         }   
  66.     }   
  67.        
  68. }  

 

  被許多頁所包含的page.jsp代碼如下:

 

 

Java代碼 複製代碼
  1. <%@ page language="java"  contentType="text/html;charset=utf-8"  
  2.     pageEncoding="utf-8"%>   
  3. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>   
  4. <html>   
  5. <head>   
  6.     <script language="javascript">   
  7.         function jumping() {   
  8.             document.pageForm.submit();   
  9.             return true;   
  10.         }   
  11.         function gotoPage(pageNum) {   
  12.             document.pageForm.jumpPage.value = pageNum ;   
  13.             document.pageForm.submit();   
  14.             return true;   
  15.         }   
  16.     </script>   
  17. </head>   
  18. <body>   
  19.     <c:if test="${pageControl.maxPage != 1}">   
  20.         <form method="post" action="pageAction.action" name="pageForm">   
  21.   
  22.         <table>   
  23.             <tr>   
  24.                 <td>   
  25.                     每頁${pageControl.rowsPerPage}行   
  26.                 </td>   
  27.                 <td>   
  28.                     共${pageControl.maxRowCount }行   
  29.                 </td>   
  30.                 <td>   
  31.                     第${pageControl.curPage }頁   
  32.                 </td>   
  33.                 <td>   
  34.                     共${pageControl.maxPage }頁   
  35.                 </td>   
  36.                 <td>   
  37.                     <c:choose>   
  38.                         <c:when test="${pageControl.curPage == 1}">   
  39.                             首頁 上一頁   
  40.                         </c:when>   
  41.                            
  42.                         <c:otherwise>   
  43.                             <A HREF="javascript:gotoPage(1)">首頁</A>   
  44.                             <A HREF="javascript:gotoPage(${pageControl.curPage - 1} )">上一頁</A>     
  45.                         </c:otherwise>   
  46.                     </c:choose>   
  47.                        
  48.                        
  49.                     <c:choose>   
  50.                         <c:when test="${pageControl.curPage == pageControl.maxPage}">   
  51.                             下一頁 尾頁   
  52.                         </c:when>   
  53.                            
  54.                         <c:otherwise>   
  55.                             <A HREF="javascript:gotoPage(${pageControl.curPage + 1})">下一頁</A>   
  56.                             <A HREF="javascript:gotoPage(${pageControl.maxPage })">尾頁</A>   
  57.                         </c:otherwise>   
  58.                     </c:choose>   
  59.                     轉到第   
  60.                     <SELECT name="jumpPage" onchange="jumping()">   
  61.                                 <c:forEach var="i" begin="1" end="${pageControl.maxPage}" step="1">   
  62.                                     <c:choose>   
  63.                                         <c:when test="${i == pageControl.curPage}">   
  64.                                             <OPTION selected value="${i}">${i }</OPTION>   
  65.                                         </c:when>   
  66.                                         <c:otherwise>   
  67.                                             <OPTION value="${i}">${i}</OPTION>                     
  68.                                         </c:otherwise>   
  69.                                     </c:choose>   
  70.                                 </c:forEach>   
  71.                     </SELECT>   
  72.                     頁   
  73.                 </td>   
  74.             </tr>   
  75.         </table>   
  76.   
  77.     </form>   
  78.     </c:if>   
  79.        
  80. </body>   
  81. </html>  

 

   下面是struts.xml中關於頁面展示新聞的配置

 

  

Java代碼 複製代碼
  1. <action name="newsAction" class="newsAction" >   
  2.     <result type="redirect">pageAction.action</result>                     
  3. </action>   
  4.   
  5. <action name="pageAction" class="newsAction" method="pageAction">   
  6.     <result>/result.jsp</result>   
  7. </action>   
  8.   
  9. <action name="detailAction" class="newsAction" method="showDetail">   
  10.     <result>/detail.jsp</result>   
  11. </action>  

  

   NewsAction代碼如下:

  

Java代碼 複製代碼
  1. package com.zly.test.action;   
  2.   
  3. import java.util.List;   
  4. import java.util.Map;   
  5.   
  6. import com.zly.test.entity.NewsItem;   
  7. import com.zly.test.entity.PageControl;   
  8. import com.zly.test.service.NewsManager;   
  9.   
  10. public class NewsAction extends BaseAction {   
  11.   
  12.     private static final long serialVersionUID = 7780804627621048756L;   
  13.   
  14.     //對應分頁jsp中的跳轉到第幾頁   
  15.     private String jumpPage;   
  16.     //對應url?category的值   
  17.     private String category;   
  18.     //對新聞數據進行處理   
  19.     private NewsManager newsManager;   
  20.     //保存<entry key="china" value="1###國內新聞" />這樣的信息   
  21.     private Map<String , String> map;   
  22.     //保存<entry key="1" value="china###國內新聞" />這樣的信息   
  23.     private Map<String , String> map1;   
  24.        
  25.     public Map<String, String> getMap1() {   
  26.         return map1;   
  27.     }   
  28.   
  29.   
  30.     public void setMap1(Map<String, String> map1) {   
  31.         this.map1 = map1;   
  32.     }   
  33.   
  34.   
  35.     public Map<String, String> getMap() {   
  36.         return map;   
  37.     }   
  38.   
  39.   
  40.     public void setMap(Map<String, String> map) {   
  41.         this.map = map;   
  42.     }   
  43.   
  44.   
  45.     public String getJumpPage() {   
  46.         return jumpPage;   
  47.     }   
  48.   
  49.   
  50.     public void setJumpPage(String jumpPage) {   
  51.         this.jumpPage = jumpPage;   
  52.     }   
  53.   
  54.   
  55.        
  56.     public NewsManager getNewsManager() {   
  57.         return newsManager;   
  58.     }   
  59.   
  60.   
  61.     public void setNewsManager(NewsManager newsManager) {   
  62.         this.newsManager = newsManager;   
  63.     }   
  64.   
  65.     //處理newsAction.action?category=xxx   
  66.     public String execute() {   
  67.         //得到相應的    1###國內新聞   
  68.         String typeIdInfo = map.get(category);   
  69.         //這裡得到的是新聞類別id   
  70.         Integer typeId = Integer.parseInt(typeIdInfo.split("###")[0]);   
  71.         //這裡得到的是新聞類別字元串   
  72.         String typeString = typeIdInfo.split("###")[1];   
  73.         //將上面三個變數保存在session中,在jsp頁面中顯示   
  74.         this.getSession().setAttribute("category", category);   
  75.         this.getSession().setAttribute("typeString" , typeString);   
  76.         this.getSession().setAttribute("id", typeId);   
  77.         //跳轉到pageAction中,處理分頁   
  78.         return SUCCESS;   
  79.     }   
  80.        
  81.     public String pageAction() {   
  82.         //取出新聞類別id   
  83.         Integer id = (Integer) this.getSession().getAttribute("id");   
  84.         //查看是不是第一次來分頁,如果是,當前頁設置成第一個   
  85.         if(jumpPage == null) {   
  86.             jumpPage = "1";   
  87.         }   
  88.         //從request範圍內取出PageControl , 如為空,則第一次分頁,創建pageControl對象   
  89.         PageControl pageControl  = (PageControl) this.getRequest().getAttribute("pageControl");   
  90.         if(pageControl == null) {   
  91.             pageControl = new PageControl();   
  92.             //第一次的時候得到相應新聞類別所對應的記錄的總數   
  93.             pageControl.setMaxRowCount(newsManager.getItemCounts(id));   
  94.             //計算一共多少頁   
  95.             pageControl.countMaxPage();   
  96.         }   
  97.         //設置jumpPage的值為當前頁   
  98.         pageControl.setCurPage(Integer.parseInt(jumpPage));   
  99.         //計算出hibernate中firstResult的值   
  100.         int firstResult = (pageControl.getCurPage() - 1) * pageControl.getRowsPerPage() + 1;   
  101.         //設置hibernate中maxResult的值   
  102.         int maxResult = pageControl.getRowsPerPage();   
  103.         //利用hibernate得到當前頁的數據,並保存在pageControl分頁實體類中   
  104.         List<NewsItem> userList = newsManager.getNewsItemByFirstResultAndMaxResult(firstResult, maxResult , id);   
  105.         pageControl.setData(userList);   
  106.         //將分頁實體類保存在request範圍內。   
  107.         this.getRequest().setAttribute("pageControl", pageControl);   
  108.         //將頁面視圖跳轉到result.jsp   
  109.         return SUCCESS;   
  110.     }   
  111.        
  112.     public String showDetail() {   
  113.         //得到url中的?id=xxx   
  114.         String newsId = this.getRequest().getParameter("id");   
  115.         int id = Integer.parseInt(newsId);   
  116.         //使用hibernate得到具體id的新聞記錄   
  117.         NewsItem item = newsManager.getNewsById(id);   
  118.         //得到id記錄所對應的新聞類型的值   map1這種形式<entry key="1" value="china###國內新聞" />   
  119.         int typeId = newsManager.getNewsType(id);   
  120.         //得到china,添加到jsp頁面的<a href="newsAction?category=">裡面   
  121.         String category = map1.get("" + typeId).split("###")[0];   
  122.         //得到國內新聞,顯示在jsp頁面的多個位置   
  123.         String typeString = map1.get("" + typeId).split("###")[1];   
  124.         //將以上多個數據添加到request範圍內,以便顯示。   
  125.         this.getRequest().setAttribute("news", item);   
  126.         this.getRequest().setAttribute("category", category);   
  127.         this.getRequest().setAttribute("typeString", typeString);   
  128.         return SUCCESS;   
  129.     }   
  130.   
  131.   
  132.     public String getCategory() {   
  133.         return category;   
  134.     }   
  135.   
  136.   
  137.     public void setCategory(String category) {   
  138.         this.category = category;   
  139.     }   
  140.        
  141. }  

 

 

首頁頁面index.jsp,裡面有幾個分類超鏈接和搜索對話框

 

Java代碼 複製代碼
  1. <%@ page language="java"  pageEncoding="utf-8"%>   
  2.   
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">   
  4. <html>   
  5.      
  6.   <head>   
  7.     <title>最快新聞網</title>   
  8.     <link href="css/main.css" rel="stylesheet" type="text/css" />   
  9.   </head>   
  10.      
  11.   <body>   
  12.          <div id="mainlink">   
  13.                 <span><a href="index.jsp">最快新聞網</a></span><br /><br />   
  14.                 <a href="newsAction.action?category=china" target="_blank">國內</a> | <a href="newsAction.action?category=world" target="_blank">國際</a> | <a href="newsAction.action?category=society" target="_blank">社會</a> | <a href="newsAction.action?category=compatriot" target="_blank">港澳</a> | <a href="newsAction.action?category=taiwan" target="_blank">台灣</a> | <a href="newsAction.action?category=huaren" target="_blank">華人</a> | <a href="newsAction.action?category=economic" target="_blank">經濟</a> | <a href="newsAction.action?category=wenhua" target="_blank">文化</a> | <a href="newsAction.action?category=entertainment" target="_blank">娛樂</a> | <a href="newsAction.action?category=sports" target="_blank">體育</a> | <a href="newsAction.action?category=jiaoyu" target="_blank">教育</a> | <a href="newsAction.action?category=jiankang" target="_blank">健康</a> | <a href="newsAction.action?category=life" target="_blank">生活</a> | <a href="newsAction.action?category=keji" target="_blank">IT</a><br />   
  15.                 <form action="searchAction.action" method="post" target="_blank">   
  16.                     本站搜索:   
  17.                     <input type="text" name="searchParam" style="height:20px"/>   
  18.                     <select name="searchWhich">   
  19.                         <option value="title"/>標題   
  20.                         <option value="content"/>內容   
  21.                     </select>   
  22.                     <input type="submit" value="搜索" style="height:23px"/>   
  23.                 </form>               
  24.          </div>   
  25.   </body>   
  26. </html>  

 

 

 

  其表現形式如下:

新聞分頁展示頁面result.jsp代碼如下:

Html代碼 複製代碼
  1. <%@ page language="java" contentType="text/html;charset=utf-8"  
  2.     pageEncoding="utf-8"%>  
  3. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
  4. <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  6. <html>  
  7. <head>  
  8. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
  9. <title>${typeString} -- 最快新聞網</title>  
  10. </head>  
  11. <body>  
  12.     <jsp:include page="index.jsp"></jsp:include>  
  13.     <div id="content">  
  14.         <font color="red" size="5">${typeString}</font>  
  15.         <br /><br /><br /><br />  
  16.         <div id="newsListTitle" style="float:left;">  
  17.             <c:forEach items="${pageControl.data}" var="news">  
  18.                 <div style="margin-top: 20px;">  
  19.                     <span>  
  20.                         <a href="detailAction.action?id=${news.id }">${news.newsTitle }</a>  
  21.                     </span>  
  22.                     <br />  
  23.                 </div>  
  24.             </c:forEach>         
  25.         </div>  
  26.            
  27.         <div id="newsListTime">  
  28.             <c:forEach items="${pageControl.data}" var="news">  
  29.                 <div style="margin-top: 20px;">  
  30.                     <span>  
  31.                         <fmt:formatDate value="${news.publishTime}" pattern="MM-dd HH:mm"/>  
  32.                     </span>  
  33.                     <br />  
  34.                 </div>  
  35.             </c:forEach>  
  36.         </div>  
  37.         <br /><br /><br /><br />  
  38.         <%@ include file="page.jsp" %>  
  39.     </div>  
  40. </body>  
  41. </html>  

  顯示效果如下:

 

 

 

其中點擊具體超鏈接的效果圖如下:

 

 

 

任務1 到此完成,新聞顯示工作結束。下面是搜索引擎部分。

 

搜索的工具類放置在com.zly.indexManager包下面

 

說明,本程序使用了庖丁解牛中文分詞,用戶使用時需要中文字典,我的字典放在了c:/dic下面,使用庖丁還需要配置環境變數PAODING_DIC_HOME , 其值為c:/dic , (就是你的字典文件所在的目錄)

 

代碼如下:

 

創建索引類IndexCreateUtil

 

Java代碼 複製代碼
  1. package com.zly.indexManager;   
  2.   
  3. import java.io.File;   
  4. import java.text.DateFormat;   
  5. import java.text.SimpleDateFormat;   
  6. import java.util.List;   
  7.   
  8. import net.paoding.analysis.analyzer.PaodingAnalyzer;   
  9.   
  10. import org.apache.lucene.analysis.Analyzer;   
  11. import org.apache.lucene.document.Document;   
  12. import org.apache.lucene.document.Field;   
  13. import org.apache.lucene.index.IndexWriter;   
  14. import org.hibernate.SessionFactory;   
  15. import org.hibernate.cfg.AnnotationConfiguration;   
  16. import org.hibernate.cfg.Configuration;   
  17. import org.hibernate.Session;   
  18. import org.htmlparser.Parser;   
  19.   
  20. import com.zly.test.entity.NewsItem;   
  21.   
  22. public class IndexCreateUtil {   
  23.        
  24.     @SuppressWarnings("unchecked")   
  25.     public void createIndexForNews() throws Exception {   
  26.         //存放索引的文件夾   
  27.         File indexFile = new File("c:/index/news");   
  28.         //使用了庖丁解牛分詞器   
  29.         Analyzer analyzer = new PaodingAnalyzer();   
  30.         //使用索引文件夾,庖丁解牛分詞器創建IndexWriter   
  31.         IndexWriter indexWriter = new IndexWriter(indexFile , analyzer , true);   
  32.         //從資料庫中讀取出所有的新聞記錄以便進行索引的創建   
  33.         Configuration cfg = new AnnotationConfiguration().configure();   
  34.         SessionFactory factory = cfg.buildSessionFactory();   
  35.         Session session = factory.openSession();   
  36.         List<NewsItem> list = session.createQuery(" from NewsItem").list();   
  37.         DateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒");   
  38.         //對所有的新聞實體進行索引創建   
  39.         for (NewsItem newsItem : list) {   
  40.             //建立一個lucene文檔   
  41.             Document doc = new Document();   
  42.             //得到新聞標題   
  43.             String newsTitle = newsItem.getNewsTitle();   
  44.             //得到新聞內容   
  45.             String newsContent = newsItem.getNewsContent();   
  46.             //得到新聞事件   
  47.             String publishDate = format.format(newsItem.getPublishTime());   
  48.             //得到新聞主鍵id   
  49.             String id = newsItem.getId() + "";   
  50.             //將新聞標題加入文檔,因為要搜索和高亮,所以index是tokennized,TermVector是WITH_POSITIONS_OFFSETS   
  51.             doc.add(new Field("title" , newsTitle , Field.Store.YES , Field.Index.TOKENIZED , Field.TermVector.WITH_POSITIONS_OFFSETS));   
  52.             //利用htmlparser得到新聞內容html的純文本   
  53.             Parser parser = new Parser();   
  54.             parser.setInputHTML(newsContent);   
  55.             String strings = parser.parse(null).elementAt(0).toPlainTextString().trim();   
  56.             //添加新聞內容至文檔,與標題相似   
  57.             doc.add(new Field("content" , strings , Field.Store.COMPRESS , Field.Index.TOKENIZED , Field.TermVector.WITH_POSITIONS_OFFSETS));   
  58.             //添加時間至文檔,因為要按照此欄位降序排列排序,所以tokenzied,不用高亮所以TermVector是no就行了   
  59.             doc.add(new Field("date" , publishDate , Field.Store.YES , Field.Index.TOKENIZED , Field.TermVector.NO));   
  60.             //添加主鍵至文檔,不分詞,不高亮。   
  61.             doc.add(new Field("id" , id , Field.Store.YES , Field.Index.NO , Field.TermVector.NO));   
  62.             indexWriter.addDocument(doc);   
  63.         }   
  64.         //創建索引   
  65.         indexWriter.optimize();   
  66.         indexWriter.close();   
  67.         //關閉session   
  68.         session.close();   
  69.     }   
  70.     public static void main(String[] args) throws Exception {   
  71.         IndexCreateUtil util  = new IndexCreateUtil();   
  72.         util.createIndexForNews();   
  73.     }   
  74. }  

 

對索引進行搜索的代碼如下:

 

  

Java代碼 複製代碼
  1. package com.zly.indexManager;   
  2.   
  3. import java.io.File;   
  4. import java.util.ArrayList;   
  5. import java.util.List;   
  6.   
  7. import net.paoding.analysis.analyzer.PaodingAnalyzer;   
  8.   
  9. import org.apache.lucene.analysis.Analyzer;   
  10. import org.apache.lucene.document.Document;   
  11. import org.apache.lucene.index.IndexReader;   
  12. import org.apache.lucene.queryParser.QueryParser;   
  13. import org.apache.lucene.search.Hits;   
  14. import org.apache.lucene.search.IndexSearcher;   
  15. import org.apache.lucene.search.Query;   
  16. import org.apache.lucene.search.Sort;   
  17. import org.apache.lucene.search.highlight.Highlighter;   
  18. import org.apache.lucene.search.highlight.QueryScorer;   
  19. import org.apache.lucene.search.highlight.SimpleFragmenter;   
  20. import org.apache.lucene.search.highlight.SimpleHTMLFormatter;   
  21.   
  22. import com.zly.test.entity.SearchResultBean;   
  23.   
  24. public class IndexSearchUtil {   
  25.        
  26.     public List<SearchResultBean> getSearchResult(String searchWhich , String searchParam , int firstResult , int maxResult) throws Exception{   
  27.         //索引所在文件夾   
  28.         File indexFile = new File("c:/index/news");   
  29.         //讀取索引的indexReader   
  30.         IndexReader reader = IndexReader.open(indexFile);   
  31.         //庖丁解牛分詞器   
  32.         Analyzer analyzer = new PaodingAnalyzer();   
  33.         //指定對content還是title進行查詢   
  34.         QueryParser parser = new QueryParser(searchWhich , analyzer);   
  35.         //創建indexSearcher   
  36.         IndexSearcher searcher  = new IndexSearcher(reader);   
  37.         //對用戶的輸入進行查詢   
  38.         Query query = parser.parse(searchParam);   
  39.         //根據date欄位進行排序,得到查詢結果   
  40.         Hits hits = searcher.search(query , new Sort("date" , true));   
  41.         //創建list,將結果保存其中,以便在jsp頁面中進行顯示   
  42.         List<SearchResultBean> list = new ArrayList<SearchResultBean>();   
  43.         //模擬hibernate的serFirstResult和setMaxResult以便返回指定條目的結果   
  44.         for (int i = firstResult - 1; i < firstResult + maxResult - 1; i++) {   
  45.             Document doc = hits.doc(i);   
  46.             //取得該條索引文檔   
  47.             SearchResultBean srb = new SearchResultBean();   
  48.             //從中取出標題   
  49.             String title = doc.get("title");   
  50.             //從中取出內容   
  51.             String content = doc.get("content");   
  52.             //從中取出主鍵id   
  53.             String id = doc.get("id");   
  54.             //從中取出發布時間   
  55.             String date = doc.get("date");   
  56.             //高亮htmlFormatter對象   
  57.             SimpleHTMLFormatter sHtmlF = new SimpleHTMLFormatter("<b><font color='red'>""</font></b>");   
  58.             //高亮對象   
  59.             Highlighter highlighter = new Highlighter(sHtmlF,new QueryScorer(query));   
  60.             //設置高亮附近的字數   
  61.             highlighter.setTextFragmenter(new SimpleFragmenter(100));   
  62.             //如果查詢的是標題,進行處理   
  63.             if(searchWhich.equals("title")) {   
  64.                 String bestFragment = highlighter.getBestFragment(analyzer,searchWhich,title);   
  65.                 //獲得高亮後的標題內容   
  66.                 srb.setTitle(bestFragment);   
  67.                 //如果內容不足150個字,全部設置   
  68.                 if(content.length() < 150) {   
  69.                     srb.setContent(content);   
  70.                 }else {   
  71.                     //如果內容多於150個字,只取出前面150個字   
  72.                     srb.setContent(content.substring(0 , 150));   
  73.                 }   
  74.             } else {   
  75.                 //如果查詢的是內容欄位   
  76.                 String bestFragment = highlighter.getBestFragment(analyzer,searchWhich,content);   
  77.                 //取得高亮內容並設置   
  78.                 srb.setContent(bestFragment);   
  79.                 //設置標題,全部設置   
  80.                 srb.setTitle(title);   
  81.             }   
  82.             //設置日期   
  83.             srb.setDate(date);   
  84.             //設置主鍵   
  85.             srb.setId(id);   
  86.             //添加到list中,以便在jsp頁面上顯示   
  87.             list.add(srb);   
  88.         }   
  89.         return list;   
  90.     }   
  91.     //取得符合搜索條件的所有記錄總數,以便分頁 , 與上面方法類似   
  92.     public int getResultCount(String searchWhich , String searchParam) throws Exception {   
  93.         File indexFile = new File("c:/index/news");   
  94.         IndexReader reader = IndexReader.open(indexFile);   
  95.         Analyzer analyzer = new PaodingAnalyzer();   
  96.         QueryParser parser = new QueryParser(searchWhich , analyzer);   
  97.         IndexSearcher searcher  = new IndexSearcher(reader);   
  98.         Query query = parser.parse(searchParam);   
  99.         Hits hits = searcher.search(query);   
  100.         return hits.length();   
  101.     }   
  102. }  

 

 

分頁action代碼如下:

Java代碼 複製代碼
  1. package com.zly.test.action;   
  2.   
  3. import java.util.List;   
  4.   
  5. import com.zly.indexManager.IndexSearchUtil;   
  6. import com.zly.test.entity.PageControl;   
  7. import com.zly.test.entity.SearchResultBean;   
  8.   
  9. public class SearchAction extends BaseAction {   
  10.   
  11.        
  12.     private static final long serialVersionUID = -2387037924517370511L;   
  13.     //查詢索引實體類   
  14.     private IndexSearchUtil indexSearcher;   
  15.     //對應搜索欄位是標題還是內容   
  16.     private String searchWhich;   
  17.     //對應用戶輸入的搜索內容   
  18.     private String searchParam;   
  19.     //對應分頁跳轉到的頁面   
  20.     private String jumpPage;   
  21.        
  22.     public String getJumpPage() {   
  23.         return jumpPage;   
  24.     }   
  25.   
  26.     public void setJumpPage(String jumpPage) {   
  27.         this.jumpPage = jumpPage;   
  28.     }   
  29.   
  30.     public String getSearchWhich() {   
  31.         return searchWhich;   
  32.     }   
  33.   
  34.     public void setSearchWhich(String searchWhich) {   
  35.         this.searchWhich = searchWhich;   
  36.     }   
  37.   
  38.     public String getSearchParam() {   
  39.         return searchParam;   
  40.     }   
  41.   
  42.     public void setSearchParam(String searchParam) {   
  43.         this.searchParam = searchParam;   
  44.     }   
  45.   
  46.     public String search() throws Exception {   
  47.         //如果為空,說明第一次進入分頁   
  48.         if(jumpPage == null) {   
  49.             jumpPage = "1";   
  50.         }   
  51.         //從request範圍內取得pageControl對象   
  52.         PageControl pageControl  = (PageControl) this.getRequest().getAttribute("pageControl");   
  53.         //如果為空,則是第一次分頁,創建分頁對象,並且設置總的記錄條數,以便設置最大頁數    
  54.         if(pageControl == null) {   
  55.             pageControl = new PageControl();   
  56.             pageControl.setMaxRowCount((long)indexSearcher.getResultCount(searchWhich, searchParam));   
  57.             pageControl.countMaxPage();   
  58.         }   
  59.         //設置當前頁   
  60.         pageControl.setCurPage(Integer.parseInt(jumpPage));   
  61.         //計算firstResult   
  62.         int firstResult = (pageControl.getCurPage() - 1) * pageControl.getRowsPerPage() + 1;   
  63.         //計算從當前條數算還有多少條記錄   
  64.         long left = pageControl.getMaxRowCount() - firstResult;   
  65.         int maxResult = -1;   
  66.         //如果剩餘的記錄數不如每頁顯示數,就設置maxResult為剩餘條數   
  67.         if(left < pageControl.getRowsPerPage()) {   
  68.             maxResult = Integer.valueOf(left + "");   
  69.         //如果剩餘記錄數大於每頁顯示頁數,就設置maxResult為每頁條數   
  70.         }else {   
  71.             maxResult = pageControl.getRowsPerPage();    
  72.         }   
  73.         //取得查詢結果集   
  74.         List<SearchResultBean> userList = indexSearcher.getSearchResult(searchWhich, searchParam, firstResult, maxResult);   
  75.         //設置為pageControl   
  76.         pageControl.setData(userList);   
  77.         //將pageControl設置到request範圍,以便在jsp現實結果   
  78.         this.getRequest().setAttribute("pageControl", pageControl);   
  79.         //將searchWhich和searchParam設置到request範圍,以便添加到分頁jsp的form裡面的hidden表單域,以便下次分頁時,能夠將值提交過來   
  80.         this.getRequest().setAttribute("searchWhich", searchWhich);   
  81.         this.getRequest().setAttribute("searchParam", searchParam);   
  82.         //跳轉到分頁視圖   
  83.         return SUCCESS;   
  84.            
  85.     }   
  86.   
  87.     public IndexSearchUtil getIndexSearcher() {   
  88.         return indexSearcher;   
  89.     }   
  90.   
  91.     public void setIndexSearcher(IndexSearchUtil indexSearcher) {   
  92.         this.indexSearcher = indexSearcher;   
  93.     }   
  94.        
  95. }  

 

 

搜索的action在struts.xml中設置如下:

 

Xml代碼 複製代碼
  1. <action name="searchAction" class="searchAction" method="search">  
  2.     <result>/searchResult.jsp</result>  
  3. </action>  

 

//searchResult.jsp代碼如下:

 

Html代碼 複製代碼
  1. <%@ page language="java" contentType="text/html;charset=utf-8"  
  2.     pageEncoding="utf-8"%>  
  3. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
  4. <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  6. <html>  
  7. <head>  
  8. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
  9. <title>${searchParam} 的搜查結果 -- 最快新聞網</title>  
  10. </head>  
  11. <body>  
  12.     <jsp:include page="index.jsp"></jsp:include>  
  13.     <div id="content">  
  14.            
  15.         <div id="searchResults" >  
  16.             <c:forEach items="${pageControl.data}" var="result">  
  17.                 <div style="margin-top: 20px;">  
  18.                     <span>  
  19.                         <a href="detailAction.action?id=${result.id }">${result.title}</a><br />  
  20.                         ${result.content }   
  21.                         <font color="green">http://localhost:8080/NewsWithSearch/detailAction.action?id=${result.id } ${result.date }</font>  
  22.                     </span>  
  23.                     <br />  
  24.                 </div>  
  25.             </c:forEach>         
  26.         </div>  
  27.            
  28.         <br /><br /><br /><br />  
  29.            
  30.         <%@ include file="searchPage.jsp" %>  
  31.     </div>  
  32. </body>  
  33. </html>  

    其運行結果如圖所示(按標題搜索):

 

 

 

 

 

按內容搜索的運行結果如下:

 

 

 

至此,本小項目的所有功能完成,雖然沒有多少難度,也不是什麼高科技, 俺還是在google和javaeye上查了不少資料,總算是做完了,貼出來,與大家分享,也給新手學習提供資料。

 

所有的資源我都添加到了附件中,學過ssh的同學應該能夠成功部署項目並運行。

 

其中NewsWithSearch.rar是工程文件夾,包含了所有的代碼文件和jar包,加壓完直接引到MyEclipse里就行,data.rar是所有的sql語句,插入到MySQL之前應先建立資料庫mynews  ,     dic.rar是庖丁解牛用到的字典文件,

解壓成一個文件夾,並配置環境變數PAODING_DIC_HOME,其值就是你把它解壓成的文件夾(例如c:/dic),最後如果你不想創建索引的話,可以把news.rar解壓成一個文件夾,拷貝到c:/index/news下面。

 

作者:

http://www.javaeye.com/topic/414477

抱歉!評論已關閉.