- 浏览: 226728 次
- 性别:
- 来自: 海南海口
文章分类
- 全部博客 (114)
- java基础 (25)
- 设计模式 (6)
- css (1)
- js (2)
- jquery (5)
- flash as3.0 (3)
- lucene (2)
- tomcat (3)
- uml (0)
- struts2 (7)
- spring (0)
- sql (1)
- ejb3.0 (2)
- jbpm4 (1)
- webservices (1)
- linux (3)
- ajax (1)
- 面试 (1)
- flex (0)
- soa (0)
- oracle解锁 (5)
- 工具 (3)
- ext (3)
- 好的网址 (1)
- junit (2)
- jmx (2)
- encache (1)
- redis (1)
- 网站 (1)
- oracle重要的sql (1)
- web (3)
- hadoop (2)
- DB2 (1)
- ui (1)
- sybase (1)
- ue使用快捷键 (1)
- eclipse优化 (1)
- 前端优化用到的插件 (1)
- zookeeper (1)
- solr (1)
- hibernate (1)
- svn (1)
- resion (1)
- resin (1)
- maven (1)
- mysql (1)
- url (1)
- 通过HttpFileServer设置共享 可以通过http方式访问 (1)
- 非技术 (2)
- 营销 (1)
- ELK (3)
最新评论
-
it_xiaowu:
jqwerty_123 写道我的出同样的问题却是因为引入cxf ...
java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Ma -
繁星水:
实验证明可用,最后补充一下,可以不需要 set Package ...
axis根据wsdl生成java客户端代码 -
qq_16699317:
qq_16699317 写道求一份源代码,感激不尽。。。多谢了 ...
java博客系统 -
qq_16699317:
求一份源代码,感激不尽。。。多谢了
java博客系统 -
jqwerty_123:
我的出同样的问题却是因为引入cxf的时候jcl-over-sl ...
java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Ma
小弟马上就要毕业了,感觉这段时间比较闲的!就利用这段时间好好锻炼锻炼一下!于是就决定做个博客系统!经过差不多一个月的时间,终于搞定!拿上来让同行们给点意见!系统主要利用s2sh+lucene+oracle技术进行开发!
首先声明一下:小弟不是为了别的,只是想让大家多提点意见,比如代码方面啊,等等!好了 不说那么多了!
注意:由于小弟的美工不太好,小弟的这个博客系统模仿了 网上某位大侠博客系统的页面美工!
声明:由于接下来小弟忙于别的事情,所以没有对项目代码进行优化,所以有很多重复性代码!所以我认为代码确实存在很多缺点!
下面图片是主页的截图
下面图片是日志模块的截图
下图是留言模块的截图(留言模块利用到struts2+json+jquery实现ajax异步技术实现)
下图是图片显示的截图模块( 主页是利用thickbox实现浏览相片功能,和利用纯js实现防百度的相册和ajax评论)
防百度显示相册功能:
下图是音乐播放模块(这个模块主要防网易的音乐播放模块)
音乐播放是调用网易的音乐播放器
下图是利用lucene搜索日志高亮显示模块(主要是利用lucene技术进行实现的高亮显示和搜索)
文章显示模块:(相关文章提示主要是利用lucene对题目进行分词,在进行对索引进行查询)
程序下载模块:(这个模块主要是上传项目供用户下载)
后台模块
登陆界面:
日志添加:(主要利用fckeditor编辑器实现)
就贴这么多了!
代码总体结构如下.
贴上部分代码:(lucene索引的建立和查询)
如果有需要的就直接部署就可以用了!
最后附上项目代码,因为所有的jar包都在里面,还用图片比较大 ,我没有好好的优化过 ,所以目前容量比较大!
有什么问题 可以在公众号给我留言 包括源码 欢迎关注 Java架构那些事
长按,识别二维码,加关注
首先声明一下:小弟不是为了别的,只是想让大家多提点意见,比如代码方面啊,等等!好了 不说那么多了!
注意:由于小弟的美工不太好,小弟的这个博客系统模仿了 网上某位大侠博客系统的页面美工!
声明:由于接下来小弟忙于别的事情,所以没有对项目代码进行优化,所以有很多重复性代码!所以我认为代码确实存在很多缺点!
下面图片是主页的截图
下面图片是日志模块的截图
下图是留言模块的截图(留言模块利用到struts2+json+jquery实现ajax异步技术实现)
下图是图片显示的截图模块( 主页是利用thickbox实现浏览相片功能,和利用纯js实现防百度的相册和ajax评论)
防百度显示相册功能:
下图是音乐播放模块(这个模块主要防网易的音乐播放模块)
音乐播放是调用网易的音乐播放器
下图是利用lucene搜索日志高亮显示模块(主要是利用lucene技术进行实现的高亮显示和搜索)
文章显示模块:(相关文章提示主要是利用lucene对题目进行分词,在进行对索引进行查询)
程序下载模块:(这个模块主要是上传项目供用户下载)
后台模块
登陆界面:
日志添加:(主要利用fckeditor编辑器实现)
就贴这么多了!
代码总体结构如下.
贴上部分代码:(lucene索引的建立和查询)
package cn.ljzblog.ljz.util; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; import jeasy.analysis.MMAnalyzer; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Hits; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.highlight.Fragmenter; import org.apache.lucene.search.highlight.Highlighter; import org.apache.lucene.search.highlight.QueryScorer; import org.apache.lucene.search.highlight.SimpleFragmenter; import org.apache.lucene.search.highlight.SimpleHTMLFormatter; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.store.LockObtainFailedException; import test.LuceneJEAnalyzerText; import cn.ljzblog.ljz.model.Article; import cn.ljzblog.ljz.model.LogQueryTemp; import cn.ljzblog.ljz.model.PicQueryTemp; /** * @theme 主要是封装lucene索引和查询索引的方法 * @author ljz * @since 2010/10/10 */ public class LuceneQuery { private static String indexPath;// 索引生成的目录 private static IndexWriter indexWriter;// private IndexSearcher searcher; private Directory dir; private String prefixHTML = "<font color='red'>"; private String suffixHTML = "</font>"; private Date date; private Date date2; public LuceneQuery(String indexPath) { date = new Date(); this.indexPath = indexPath; } /** * 函数功能:建立文章的索引 * @param list */ public void createIndex(List<Article> list) { createIndexWriter();// 生成indexWriter对象 for (Article article : list) { Document document = new Document();// 生成Document对象 Field field = new Field("articleId", String.valueOf(article.getArticleId()), Field.Store.YES, Field.Index.NO); Field field2 = new Field("articleName", article.getArticleName(),Field.Store.YES, Field.Index.ANALYZED); Field field3 = new Field("articleContent", article.getArticleContent(), Field.Store.YES, Field.Index.NO); document.add(field); document.add(field2); document.add(field3); try { indexWriter.addDocument(document); } catch (CorruptIndexException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } closeIndexWriter(indexWriter); } /** * 函数功能:建立对文章的高亮显示查询 * */ public void createHightLightIndex(List<LogQueryTemp> list) { createIndexWriter();// 生成indexWriter对象 System.out.println("createHightLightIndex list length" + list.size()); for (LogQueryTemp logQuery : list) { Document document = new Document();// 生成Document对象 Field field = new Field("articleId", String.valueOf(logQuery.getArticleId()), Field.Store.YES, Field.Index.NO); Field field2 = new Field("articleName", logQuery.getArticleName(),Field.Store.YES, Field.Index.ANALYZED); Field field3 = new Field("articleKindName", logQuery.getArticleKindName(), Field.Store.YES, Field.Index.NO); Field field4 = new Field("writeTime", logQuery.getWriteTime(),Field.Store.YES, Field.Index.NO); Field field5 = new Field("articleContent", logQuery.getArticleContent(), Field.Store.YES, Field.Index.ANALYZED); document.add(field); document.add(field2); document.add(field3); document.add(field4); document.add(field5); try { indexWriter.addDocument(document); } catch (CorruptIndexException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } closeIndexWriter(indexWriter); } /** * 函数功能:建立查询图片的索引(主要是对图片的描述建立索引) * */ public void createPicIndex(List<PicQueryTemp> list) { createIndexWriter();// 生成indexWriter对象 for (PicQueryTemp picQuery : list) { Document document = new Document();// 生成Document对象 Field field = new Field("picId", String.valueOf(picQuery.getPicId()), Field.Store.YES,Field.Index.NO); Field field2 = new Field("picGroupId", String.valueOf(picQuery.getPicGroupId()), Field.Store.YES, Field.Index.NO); Field field3 = new Field("picName", picQuery.getPicName(),Field.Store.YES, Field.Index.NO); Field field4 = new Field("pictureDetail", picQuery.getPictureDetail(), Field.Store.YES, Field.Index.ANALYZED); document.add(field); document.add(field2); document.add(field3); document.add(field4); try { indexWriter.addDocument(document); } catch (CorruptIndexException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } closeIndexWriter(indexWriter); } /** * 函数功能 :关闭indexWriter * * @param indexWriter */ public void closeIndexWriter(IndexWriter indexWriter) { try { indexWriter.optimize(); indexWriter.close(); date2 = new Date(); System.out.println("建立索引总共用了:" + (date2.getTime() - date.getTime()) + "毫秒"); } catch (CorruptIndexException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 函数功能:生成indexWriter对象 */ public void createIndexWriter() { try { boolean flag = true; // 如果已存在索引,则追加索引 if (IndexReader.indexExists(indexPath)) { flag = false; } indexWriter = new IndexWriter(indexPath, new StandardAnalyzer(), flag, IndexWriter.MaxFieldLength.LIMITED); } catch (CorruptIndexException e) { e.printStackTrace(); } catch (LockObtainFailedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 函数功能:查询文章的索引 */ public List<Article> queryIndex(String indexPath, String findContent) { List<Article> list2 = new ArrayList<Article>(); System.out.println("查询内容为:" + findContent); try { dir = FSDirectory.getDirectory(indexPath); searcher = new IndexSearcher(dir); QueryParser parser = new QueryParser("articleName", new StandardAnalyzer()); try { Query query = parser.parse(findContent);// 根据查询内容进行查询 TopDocs topDocs = searcher.search(query, 5); ScoreDoc[] hits = topDocs.scoreDocs; for (int i = 0; i < hits.length; i++) { int DocId = hits[i].doc; Article article = new Article(); Document doc = searcher.doc(DocId); article.setArticleId(Integer.parseInt(doc.get("articleId"))); article.setArticleName(doc.get("articleName")); article.setArticleContent(doc.get("articleContent")); list2.add(article); } Date date3 = new Date(); System.out.println("查询总共花的时间为:"+ (date3.getTime() - date2.getTime()) + "毫秒"); } catch (ParseException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } return list2; } /** * 函数功能:通过booleanQuery方法进行查询索引 */ public List<Article> queryIndexByBooleanQuery(String indexPath, String findContent) { List<Article> list2 = new ArrayList<Article>(); LuceneJEAnalyzerText jeAnalyzer = new LuceneJEAnalyzerText(indexPath); BooleanQuery booleanQuery = new BooleanQuery(); try { dir = FSDirectory.getDirectory(indexPath); searcher = new IndexSearcher(dir); String[] str = jeAnalyzer.createAnalyzer(findContent).split(","); for (int i = 0; i < str.length; i++) { booleanQuery.add( new TermQuery(new Term("articleName", str[i])), BooleanClause.Occur.SHOULD); } // QueryParser parser = new QueryParser("articleName", new // StandardAnalyzer()); // Query query = parser.parse(findContent);//根据查询内容进行查询 TopDocs topDocs = searcher.search(booleanQuery, 3); ScoreDoc[] hits = topDocs.scoreDocs; for (int i = 0; i < hits.length; i++) { int DocId = hits[i].doc; Article article = new Article(); Document doc = searcher.doc(DocId); article.setArticleId(Integer.parseInt(doc.get("articleId"))); article.setArticleName(doc.get("articleName")); // article.setArticleContent(doc.get("articleContent")); list2.add(article); // list2.add(doc.get("sname")); } if (hits.length > 0) { list2.remove(0); } Date date3 = new Date(); System.out.println("查询总共花的时间为:" + (date3.getTime() - date2.getTime()) + "毫秒"); } catch (IOException e) { e.printStackTrace(); } return list2; } /** * 函数功能:高亮显示查询 * * @param fieldName * @param keyword * @throws CorruptIndexException * @throws IOException * @throws ParseException */ public List<PicQueryTemp> queryPicByLucene(String findContent) { List<PicQueryTemp> list2 = new ArrayList<PicQueryTemp>(); LuceneJEAnalyzerText jeAnalyzer = new LuceneJEAnalyzerText(indexPath); System.out.println("查询内容为:" + findContent); BooleanQuery booleanQuery = new BooleanQuery(); try { dir = FSDirectory.getDirectory(indexPath); searcher = new IndexSearcher(dir); String[] str = jeAnalyzer.createAnalyzer(findContent).split(","); for (int i = 0; i < str.length; i++) { booleanQuery.add(new TermQuery( new Term("pictureDetail", str[i])), BooleanClause.Occur.SHOULD); } TopDocs topDocs = searcher.search(booleanQuery, 12); ScoreDoc[] hits = topDocs.scoreDocs; for (int i = 0; i < hits.length; i++) { int DocId = hits[i].doc; PicQueryTemp picQuery = new PicQueryTemp(); Document doc = searcher.doc(DocId); picQuery.setPicGroupId(Integer.parseInt(doc.get("picGroupId"))); picQuery.setPicId(Integer.parseInt(doc.get("picId"))); picQuery.setPicName(doc.get("picName")); picQuery.setPictureDetail(doc.get("pictureDetail")); list2.add(picQuery); // list2.add(doc.get("sname")); } Date date3 = new Date(); System.out.println("查询总共花的时间为:" + (date3.getTime() - date2.getTime()) + "毫秒"); } catch (IOException e) { e.printStackTrace(); } return list2; } /**函数功能:主要对文章的索引进行查询,主要是查询文章的内容和标题 * @param keyword * @param startIndex * @param endIndex * @return * @throws CorruptIndexException * @throws IOException * @throws ParseException */ public List<LogQueryTemp> search(String keyword, int startIndex, int endIndex) throws CorruptIndexException, IOException, ParseException { List<LogQueryTemp> listlog = new ArrayList<LogQueryTemp>(); searcher = new IndexSearcher(indexPath); Analyzer analyzer = new MMAnalyzer(); // QueryParser queryParse = new QueryParser(fieldName, analyzer); // Query query = queryParse.parse(keyword); LuceneJEAnalyzerText jeAnalyzer = new LuceneJEAnalyzerText(indexPath); BooleanQuery booleanQuery = new BooleanQuery(); try { dir = FSDirectory.getDirectory(indexPath); searcher = new IndexSearcher(dir); String[] str = jeAnalyzer.createAnalyzer(keyword).split(","); for (int j = 0; j < str.length; j++) { booleanQuery.add(new TermQuery(new Term("articleContent",str[j])), BooleanClause.Occur.SHOULD); booleanQuery.add(new TermQuery(new Term("articleName", str[j])),BooleanClause.Occur.SHOULD); } Hits hits = searcher.search(booleanQuery); if (endIndex >= hits.length()) { endIndex = hits.length() - 1; } for (int i = startIndex; i <= endIndex; i++) { LogQueryTemp logQuery = new LogQueryTemp(); Document doc = hits.doc(i); String text = doc.get("articleContent"); String text2 = doc.get("articleName"); int htmlLength = prefixHTML.length() + suffixHTML.length(); // System.out.println("高亮HTML的总长度为" + htmlLength); SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter( prefixHTML, suffixHTML); Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(booleanQuery)); // 设置被高亮的文本返回的摘要的文本大小 Fragmenter fragmenter = new SimpleFragmenter(350);// 默认是50个字符,修改为350个字符 highlighter.setTextFragmenter(fragmenter); String highLightText = highlighter.getBestFragment(analyzer, "articleContent", text); String highLightText2 = highlighter.getBestFragment(analyzer, "articleName", text2); if (highLightText2 != null) { logQuery.setArticleName(highLightText2); } else { logQuery.setArticleName(doc.get("articleName")); } if (highLightText != null) { logQuery.setArticleContent(highLightText); } else { logQuery.setArticleContent(doc.get("articleContent")); } logQuery.setArticleId(doc.get("articleId")); logQuery.setIsMywrite(keyword); logQuery.setArticleKindName(doc.get("articleKindName")); logQuery.setWriteTime(doc.get("writeTime")); listlog.add(logQuery); } searcher.close(); } catch (IOException ex) { ex.printStackTrace(); } return listlog; } }
如果有需要的就直接部署就可以用了!
最后附上项目代码,因为所有的jar包都在里面,还用图片比较大 ,我没有好好的优化过 ,所以目前容量比较大!
有什么问题 可以在公众号给我留言 包括源码 欢迎关注 Java架构那些事
长按,识别二维码,加关注
评论
4 楼
zccmp
2011-09-03
帅哥,能否把源码发给我一份呀,现在正在学习中...
zccmp@163.com
谢谢!
zccmp@163.com
谢谢!
3 楼
aa00aa00
2010-11-03
做的不错
2 楼
yangguo
2010-10-19
做的不错啊
1 楼
ljz0898
2010-10-18
源代码地址:http://ljz0898.iteye.com/admin/blogs/787990
发表评论
-
struts2经常报找到input的配置路径错误
2012-03-12 11:44 0实现这几个方法就ok @Override public v ... -
博客系统sql
2010-10-21 17:03 1501博客系统表脚本! -
s2sh3大框架整合练习
2010-10-20 16:27 1977由于有几个朋友要求我给他们写一个3大框架整合的demo让他们参 ... -
博客系统数据库dmp文件
2010-10-20 11:30 2947这是博客系统的数据库dmp文件 大家直接导入就ok了 -
java博客系统源代码
2010-10-18 23:40 5197java博客系统源代码,一个是源代码,其他两个是jar包,把所 ... -
struts2 jquery json 实现ajax技术 返回list
2010-10-05 10:39 10284jsp页面: <input typ ... -
struts2遍历3列n行
2010-09-29 09:23 1654这篇文章装载来自 http://haidao.blog.51c ... -
<s:if>简单使用
2010-09-18 16:52 6736一、<s:if test=" ...
相关推荐
【Java博客系统,完美自适应,支持markdown编辑器】 这个项目是一个完整的Java博客系统,它利用了现代Web开发中的多项核心技术,旨在提供一个功能齐全、响应式布局且用户友好的平台,让博主能够轻松地撰写和发布...
【Java 博客系统源码】是一个典型的Java Web项目,采用了经典的MVC(Model-View-Controller)设计模式,主要技术栈为JSP、Struts和Java。这个系统提供了创建、发布、阅读博客的功能,是学习和理解Web开发的好材料。 ...
yijavaBlog博客系统是一个无需数据库的Java博客系统源码。由于软件无需数据库,所以整个软件都显得非常小,只有2M,是一个微型的博客网站系统。 本系统没有数据库,您可将目前网络上的任意网站的接口瞬间变成您的...
【标题】:“一款简洁美观、自适应的Java博客系统” 这款Java博客系统名为"OneBlog",它是一款设计优雅且响应式的开源项目。"简洁美观"指的是该博客系统在用户界面设计上注重用户体验,以清晰、直观的布局和吸引人...
基于java的开发源码-Java博客系统yijavaBlog.zip 基于java的开发源码-Java博客系统yijavaBlog.zip 基于java的开发源码-Java博客系统yijavaBlog.zip 基于java的开发源码-Java博客系统yijavaBlog.zip 基于java的开发...
基于java的开发源码-Tale Java博客系统.zip 基于java的开发源码-Tale Java博客系统.zip 基于java的开发源码-Tale Java博客系统.zip 基于java的开发源码-Tale Java博客系统.zip 基于java的开发源码-Tale Java博客系统...
基于java的开发源码-NewStarBlog 开源Java博客系统.zip 基于java的开发源码-NewStarBlog 开源Java博客系统.zip 基于java的开发源码-NewStarBlog 开源Java博客系统.zip 基于java的开发源码-NewStarBlog 开源Java博客...
【Java博客系统源代码】是一个基于Java编程语言开发的大型在线博客平台的源代码实现。这个项目涵盖了多种关键的技术和概念,是学习和研究Java Web开发的宝贵资源。以下是该项目中涉及的一些核心知识点: 1. **Java...
SpringBoot开发非常美观的java博客系统(包含后台管理功能)SpringBoot开发非常美观的java博客系统(包含后台管理功能) 技术选型: JDK8 数据库MySQL 主框架 (Spring-boot、Spring-data-jpa) 安全权限 Shiro 搜索...
SpringBoot+Mybatis+Thymeleaf等技术实现的Java博客系统.zipSpringBoot+Mybatis+Thymeleaf等技术实现的Java博客系统.zipSpringBoot+Mybatis+Thymeleaf等技术实现的Java博客系统.zipSpringBoot+Mybatis+Thymeleaf等...
【Java博客系统完整版】是一个专为初学者设计的项目,它提供了全面的Java编程实践,特别是对于那些希望深入理解如何构建Web应用程序的人来说,这是一个极好的学习资源。这个博客系统展示了如何利用Java技术栈来创建...
【标题】"一个优美的JAVA博客系统.zip"指的是一个基于Java编程语言开发的博客系统,其特点是设计美观、用户体验良好。这个系统很可能被用于个人博客、技术分享平台或者小型社区,提供文章发布、评论互动、分类管理等...
在本项目中,"Java博客系统之前端页面"是一个基于Java技术实现的博客系统的用户界面部分。这个前端页面是整个博客系统与用户交互的核心,它负责展示博客内容、提供用户友好的操作界面以及处理用户的输入请求。下面...
**BlogOnline.zip:Java博客系统详解** 在当前的互联网环境中,博客系统已经成为个人及组织分享知识、表达观点的重要平台。本项目"BlogOnline.zip"是一个基于Java技术栈开发的博客系统,利用了Ajax进行前端交互优化...
总结来说,这款Java博客系统集成了许多现代Web开发的最佳实践,包括Markdown写作、自定义链接、多主题、插件扩展和Emoji支持等,为用户提供了一个既美观又实用的在线写作平台。对于Java开发者来说,这是一个学习和...
【SSH开发Java博客系统】 SSH(Struts2 + Spring + Hibernate)是一个经典的Java Web开发框架组合,常用于构建高效、可扩展的企业级应用程序,如博客系统。在这个项目中,SSH框架被用来创建一个功能完善的个人博客...