`
ljz0898
  • 浏览: 227409 次
  • 性别: Icon_minigender_1
  • 来自: 海南海口
社区版块
存档分类
最新评论

java博客系统

阅读更多
小弟马上就要毕业了,感觉这段时间比较闲的!就利用这段时间好好锻炼锻炼一下!于是就决定做个博客系统!经过差不多一个月的时间,终于搞定!拿上来让同行们给点意见!系统主要利用s2sh+lucene+oracle技术进行开发

首先声明一下:小弟不是为了别的,只是想让大家多提点意见,比如代码方面啊,等等!好了 不说那么多了!
注意:由于小弟的美工不太好,小弟的这个博客系统模仿了 网上某位大侠博客系统的页面美工!
声明:由于接下来小弟忙于别的事情,所以没有对项目代码进行优化,所以有很多重复性代码!所以我认为代码确实存在很多缺点!


下面图片是主页的截图





下面图片是日志模块的截图








下图是留言模块的截图(留言模块利用到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架构那些事 




长按,识别二维码,加关注
  • 大小: 1 MB
  • 大小: 876.5 KB
  • 大小: 876.5 KB
  • 大小: 526.6 KB
  • 大小: 69.8 KB
  • 大小: 619.6 KB
  • 大小: 441.7 KB
  • 大小: 1.1 MB
  • 大小: 24.1 KB
  • 大小: 23.5 KB
  • 大小: 596.6 KB
  • 大小: 27.8 KB
  • 大小: 40 KB
  • 大小: 509.9 KB
  • 大小: 528.9 KB
  • 大小: 100.5 KB
  • 大小: 14.7 KB
  • 大小: 987.1 KB
  • 大小: 528.9 KB
  • 大小: 831.7 KB
分享到:
评论
24 楼 qq_16699317 2015-07-15  
qq_16699317 写道
求一份源代码,感激不尽。。。多谢了

1403291341@qq.com
23 楼 qq_16699317 2015-07-15  
求一份源代码,感激不尽。。。多谢了
22 楼 u012461083 2015-04-02  
博主,求一份源码,学习中
284555723@qq.com
21 楼 longding 2014-09-29  
帅哥,能否发一份源码,想学习一下
308855361@qq.com
20 楼 红豆和绿豆 2014-07-28  
求一份源码,谢谢。
644833937@qq.com
19 楼 java_evil 2014-05-09  
你好?下载地址好像失效了,能不能发给我一份,小弟正在做的系统也需要Lucene,希望能从你这里得到借鉴,谢谢!  707287746@qq.com
18 楼 java_evil 2014-05-09  
你好?下载地址好像失效了,能不能发给我一份,小弟正在做的系统也需要Lucene,希望能从你这里得到借鉴,谢谢!  707287746@qq.com
17 楼 heikehuan 2013-10-30  
谢谢  873089992@qq.com
16 楼 小飞鸟_qq 2013-07-28  
你好!你提供的源码地址是错误的,能否给我发一份java博客系统的源码呢?874693291@qq.com,谢谢!
15 楼 chenluozhi 2013-06-16  
没下载。。。
14 楼 yanga520 2013-04-23  
能否发份源码参考下,谢谢,xklsuyun@163.com
13 楼 liuxiao942585946 2013-04-16  
弱弱的问一句,我现在正在学习SSH,也想做一个类似的系统,能吧你的代码发给我参考一下吗,谢谢。邮箱 1515433891@qq.com
12 楼 zml_lxy 2013-02-25  
发份源码给我吧谢谢!zl_xinyu@163.com  QQ137127502
11 楼 renlei413326889 2012-05-31  
lz能不能发我邮箱呀 renlei413326889@163.com
10 楼 renlei413326889 2012-05-31  
lz大大 你的源代码下载不了呀~
9 楼 yanga520 2011-12-15  
好东西应该共享
8 楼 liuhl 2011-12-01  
佩服, 我现在也是在做博客系统, 可以分享一下代码吗  ,youku515@163.com , 谢谢啦
7 楼 kira8528 2011-11-28  
博主你好,我希望要份源代码,谢谢。kira8528@126.com
6 楼 guzizai2007 2011-11-26  
博主,你好,可以发一份源代码给我吗?想学习一下...  guzizai2007@sina.com 谢谢!
5 楼 Margina 2011-10-19  
最近正在学习ssh,请问能不能发一份代码啊 ,谢谢啦~ lovecoool@gmail.com

相关推荐

    Java博客系统,完美自适应,支持markdown编辑器

    【Java博客系统,完美自适应,支持markdown编辑器】 这个项目是一个完整的Java博客系统,它利用了现代Web开发中的多项核心技术,旨在提供一个功能齐全、响应式布局且用户友好的平台,让博主能够轻松地撰写和发布...

    Java 博客系统源码

    【Java 博客系统源码】是一个典型的Java Web项目,采用了经典的MVC(Model-View-Controller)设计模式,主要技术栈为JSP、Struts和Java。这个系统提供了创建、发布、阅读博客的功能,是学习和理解Web开发的好材料。 ...

    Java博客系统yijavaBlog v1.0.0.zip

    yijavaBlog博客系统是一个无需数据库的Java博客系统源码。由于软件无需数据库,所以整个软件都显得非常小,只有2M,是一个微型的博客网站系统。 本系统没有数据库,您可将目前网络上的任意网站的接口瞬间变成您的...

    一款简洁美观、自适应的Java博客系统.zip

    【标题】:“一款简洁美观、自适应的Java博客系统” 这款Java博客系统名为"OneBlog",它是一款设计优雅且响应式的开源项目。"简洁美观"指的是该博客系统在用户界面设计上注重用户体验,以清晰、直观的布局和吸引人...

    基于java的开发源码-Java博客系统yijavaBlog.zip

    基于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博客系统.zip 基于java的开发源码-Tale Java博客系统...

    基于java的开发源码-NewStarBlog 开源Java博客系统.zip

    基于java的开发源码-NewStarBlog 开源Java博客系统.zip 基于java的开发源码-NewStarBlog 开源Java博客系统.zip 基于java的开发源码-NewStarBlog 开源Java博客系统.zip 基于java的开发源码-NewStarBlog 开源Java博客...

    java博客系统源代码

    【Java博客系统源代码】是一个基于Java编程语言开发的大型在线博客平台的源代码实现。这个项目涵盖了多种关键的技术和概念,是学习和研究Java Web开发的宝贵资源。以下是该项目中涉及的一些核心知识点: 1. **Java...

    SpringBoot开发非常美观的java博客系统(包含后台管理功能)

    SpringBoot开发非常美观的java博客系统(包含后台管理功能)SpringBoot开发非常美观的java博客系统(包含后台管理功能) 技术选型: JDK8 数据库MySQL 主框架 (Spring-boot、Spring-data-jpa) 安全权限 Shiro 搜索...

    SpringBoot+Mybatis+Thymeleaf等技术实现的Java博客系统.zip

    SpringBoot+Mybatis+Thymeleaf等技术实现的Java博客系统.zipSpringBoot+Mybatis+Thymeleaf等技术实现的Java博客系统.zipSpringBoot+Mybatis+Thymeleaf等技术实现的Java博客系统.zipSpringBoot+Mybatis+Thymeleaf等...

    java博客系统完整版

    【Java博客系统完整版】是一个专为初学者设计的项目,它提供了全面的Java编程实践,特别是对于那些希望深入理解如何构建Web应用程序的人来说,这是一个极好的学习资源。这个博客系统展示了如何利用Java技术栈来创建...

    一个优美的JAVA博客系统.zip

    【标题】"一个优美的JAVA博客系统.zip"指的是一个基于Java编程语言开发的博客系统,其特点是设计美观、用户体验良好。这个系统很可能被用于个人博客、技术分享平台或者小型社区,提供文章发布、评论互动、分类管理等...

    Java博客系统之前端页面

    在本项目中,"Java博客系统之前端页面"是一个基于Java技术实现的博客系统的用户界面部分。这个前端页面是整个博客系统与用户交互的核心,它负责展示博客内容、提供用户友好的操作界面以及处理用户的输入请求。下面...

    BlogOnline.zip_java博客系统

    **BlogOnline.zip:Java博客系统详解** 在当前的互联网环境中,博客系统已经成为个人及组织分享知识、表达观点的重要平台。本项目"BlogOnline.zip"是一个基于Java技术栈开发的博客系统,利用了Ajax进行前端交互优化...

    简洁美观的Java博客系统源代码 可部署

    总结来说,这款Java博客系统集成了许多现代Web开发的最佳实践,包括Markdown写作、自定义链接、多主题、插件扩展和Emoji支持等,为用户提供了一个既美观又实用的在线写作平台。对于Java开发者来说,这是一个学习和...

    Blog.rar_java博客系统_ssh开发博客_博客_博客 SSH_博客系统

    【SSH开发Java博客系统】 SSH(Struts2 + Spring + Hibernate)是一个经典的Java Web开发框架组合,常用于构建高效、可扩展的企业级应用程序,如博客系统。在这个项目中,SSH框架被用来创建一个功能完善的个人博客...

Global site tag (gtag.js) - Google Analytics