http://www.javayou.com (收藏,设为首页)
当你不能再拥有时,你唯一能做的,就是让自己不要忘记 (手机请访问 http://3g.dlog.cn/javayou)
上一篇:梦魇 下一篇:今天立冬

用标签库实现页面搜索关键字高亮显示

2004年11月6日(Saturday) 21点32分 作者: 本站原创 天气: 心情: 一般

介绍一下DLOG4J中使用的高亮显示搜索关键字的方法:

在DLOG4J中是通过标签highlight来实现高亮显示搜索关键字的,页面搜索结果显示界面(例如main.jsp)中使用了例如下面的代码

<dlog:highlight query="你好">
//此处显示日记内容
</dlog:highlight>

当日记内容中出现你好字样的时候就会用红色粗体显示,这种方法的好处是无需修改原来的日记处理方法,仅仅需要在可能出现关键字的位置中加入该标签,你设置可以在整个文件头加入该标签,以实现整个页面的关键字高亮显示。

highlight标签扩展了类BodyTagSupport,用于访问包含在其中的页面内容并进行修改以及重新输出,下面是该标签的代码:

package dlog4j.util.tags;

import java.io.IOException;
import java.io.Reader;
import java.util.StringTokenizer;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

import dlog4j.util.StringUtils;

/**
 * 用于高亮显示搜索关键字的标签库
 * @author Winter Lau
 */
public class SearchHighlightTag extends BodyTagSupport {

 String color = "red";
 boolean bold = false;
 String query;
 
 /* (non-Javadoc)
  * @see javax.servlet.jsp.tagext.Tag#doStartTag()
  */
 public int doStartTag() throws JspException {
  return EVAL_BODY_BUFFERED;
 }

 /* (non-Javadoc)
  * @see javax.servlet.jsp.tagext.Tag#doStartTag()
  */
 public int doEndTag() throws JspException {
  Reader reader = getBodyContent().getReader();
  char[] buf = new char[1024];
  try{
   StringBuffer content = new StringBuffer(1024);
   do{
    int  rc = reader.read(buf);
    if(rc>0)
     content.append(buf,0,rc);
    if(rc<1024)
     break;
   }while(true);
   //整理content
   if(query!=null && !StringUtils.isEmpty(query.trim())){
    String startTag = "<font color=" + color + ">";
    String endTag = "";
    if(bold){
     startTag += "<b>";
     endTag = "</b>";
    }   
    endTag += "</font>";
    String replaceContent = content.toString();
    StringTokenizer st = new StringTokenizer(query);
    while(st.hasMoreElements()){
     String key = st.nextToken();
     if(key.length()<key.getBytes().length)
      replaceContent = StringUtils.replace(replaceContent, key, startTag + key + endTag);
     else{
      //使用大小写无关的替换策略
      replaceContent = StringUtils.replaceIgnoreCase(replaceContent, key, startTag + key + endTag);
     }
    }
    pageContext.getOut().write(replaceContent);
   }
   else
    pageContext.getOut().write(content.toString());
  }catch(IOException e0){
  }
  return EVAL_PAGE;
 }
 
 public boolean isBold() {
  return bold;
 }
 public void setBold(boolean bold) {
  this.bold = bold;
 }
 public String getColor() {
  return color;
 }
 public void setColor(String color) {
  this.color = color;
 }
 public String getQuery() {
  return query;
 }
 public void setQuery(String query) {
  this.query = query;
 }
}

目前该标签可定制高亮的颜色以及是否粗体显示。至少需要给该标签传递搜索关键字以便于进行高亮显示。该标签的工作原理是读入包含在该标签中的HTML文本,并逐个将其中包含关键字的地方替换成新的,增加了高亮控制代码的新文本并重新输出。这也就是BodyTagSupport的特性,用于改写标签的Body。

下面是DLOG4J中使用该标签的代码

<dlog:highlight query="<%=query%>" bold="true">
      <bean:write name="log" property="previewContent" filter="false"/>
</dlog:highlight>

标签: 标签库 
评论者: 大梦 2004-11-7 22:22 (Sunday)
仁兄何时开讲一下lucene.
评论者: 刘冬 2004-11-8 08:44 (Monday)
其实我对Lucene也只是一些很粗浅的了解,会简单的使用,谈何开讲啊
评论者: (*_*) 2004-11-8 09:00 (Monday)

Lucene自己就可以用粗体显示文本中的被搜索关键字,

org.apache.lucene.search.highlight.*;

Highlighter highlighter =new Highlighter(new QueryScorer(query));

然后就可以了。不过也许没有你的好看吧。能否设置参数弄得你那么好看呢?不知道了,当时只要求字体突出显示,不要求颜色,我这么糊弄完成就算了,不求完美,这样的工作态度,千万不要给我老板知道了~

姓名: 
邮箱:  {可选}
网址:  {可选} 此评论只有我和写日记的人查阅
校验码: ... <我看不清楚>
网记为您提供手机和互联网同步的个人主页,带给你不一样的体验