Java项目——个人博客系统

article/2025/9/11 17:36:17

文章目录

  • 一、项目背景
  • 二、项目功能
  • 三、项目的基本流程
    • 1.准备工作
    • 2.数据库设计
    • 3.准备前端页面
    • 4.实现前端匹配的Servlet所需功能
    • 5.项目难点


一、项目背景

在学习完JavaWeb相关知识后,有了基础能力就想通过完成一个Javaweb项目来回顾和加强已经学过的知识,并且希望在这个过程中发现自己的不足并加以改正。
由于之前一直都在CSDN上分享自己的学习过程,对CSDN博客系统的功能有了一定的了解,因此便尝试完成了个人博客系统。

二、项目功能

1.用户登录:
在这里插入图片描述
2.用户主页:
在这里插入图片描述
3.查看全文:
在这里插入图片描述
4.写文章:
在这里插入图片描述
5.注销回到登录页面:
在这里插入图片描述

三、项目的基本流程

1.准备工作

pom.xml中引入的依赖包

<dependencies><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf</artifactId><version>3.0.12.RELEASE</version></dependency><!-- Servlet依赖包:官方提供的servlet标准 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><!-- 开发编译时需要这个依赖包,运行时不需要 --><scope>provided</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><!-- 数据绑定包,提供JAva对象与JSON数据格式进行序列化 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</version></dependency><!--    引入单元测试框架,方便我们做测试    --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.1</version></dependency>
</dependencies>

引入Jackson依赖是为了进行序列化、反序列化的操作
作用:使数据和对象之间可以相互转换,保证数据的完整性

Jackson是一个Java用来处理JSON格式数据的类库,性能非常好,经常被用来JSON序列化(将对象转换为JSON字符串)和反序列化(将JSON字符串转换为指定的数据类型)

序列化和反序列化操作:

public class WebUtil {//判断是否登录,通过请求对象获取session,如果session存在且登录时// 保存的键为user,值是用户对象,这个数据存在,就表示已登录//返回user:已登录就返回session中保存的用户,未登录返回nullpublic static User checkLogin(HttpServletRequest req){User user = null;//如果从tomcat保存的session的map数据结构中,获取session,false表示获取不到,返回nullHttpSession session = req.getSession(false);if(session!=null){user = (User)session.getAttribute("user");}return user;}//这个对象可以使用单例private static ObjectMapper M = new ObjectMapper();//反序列化:转换一个输入流中包含的json字符串为一个java对象//使用泛型:传一个什么类型给我,就返回一个该类型的对象public static <T> T read(InputStream is,Class<T> clazz){try {return M.readValue(is,clazz);} catch (IOException e) {throw new RuntimeException("json反序列化出错",e);}}//序列化:将一个任意类型的java对象,转换为一个json字符串public static String write(Object o){try {return M.writeValueAsString(o);} catch (JsonProcessingException e) {throw new RuntimeException("json序列化出错",e);}}

2.数据库设计

1.创建所需表:

  • user(用户表)
  • acticle(文章表)

2.设计与之对应的数据库实体类:
在这里插入图片描述
3.数据库连接工具:

//数据库工具类:提供获取数据库连接,释放资源的统一代码
public class DBUtil {//静态变量,是类加载的时候初始化,只执行一次private static MysqlDataSource ds;//一个程序,连接一个数据库,只需要一个连接池,其中保存了多个数据库连接对象//1.获取连接池,内部使用,不开放private static DataSource getDataSource(){//ds类加载的时候,初始化为null,方法使用的时候,每次都判断一下if(ds==null){//判断为空,就创建及初始化属性ds=new MysqlDataSource();ds.setURL("jdbc:mysql://127.0.0.1:3306/blog");ds.setUser("root");ds.setPassword("010124");ds.setUseSSL(false);//不安全连接,如果不设置,也不影响,只是有警告ds.setCharacterEncoding("UTF-8");}return ds;}//2.获取数据库连接对象:开放给外部的jdbc代码使用public static Connection getConnection(){try {return getDataSource().getConnection();} catch (SQLException e) {throw new RuntimeException("获取数据库连接出错,可能是url,账号密码写错了",e);}}//3.释放资源//查询操作需要释放三个资源,更新操作(插入,修改,删除)只需要释放前两个资源public static void close(Connection c, Statement s, ResultSet r){try {if(r!=null) r.close();if(s!=null) s.close();if(c!=null) c.close();} catch (SQLException e) {throw new RuntimeException("释放数据库资源出错",e);}}//提供更新操作方便的释放资源功能public static void close(Connection c, Statement s){close(c,s,null);}public static void main(String[] args) {System.out.println(getConnection());}
}

4.用户表和文章表的CRUD操作(Dao类):
在这里插入图片描述

3.准备前端页面

1.把之前写好的前端静态页面部署到webapp目录下

2.封装ajax:
在前后端交互中我们需要用到ajax进行数据交互
把之前封装好的ajax函数拷贝过来,放到一个单独的js文件中,方便后续使用

function ajax(args){//var ajax = function(){}let xhr = new XMLHttpRequest();// 设置回调函数xhr.onreadystatechange = function(){// 4: 客户端接收到响应后回调if(xhr.readyState == 4){// 回调函数可能需要使用响应的内容,作为传入参数args.callback(xhr.status, xhr.responseText);}}xhr.open(args.method, args.url);//如果args中,contentType属性有内容,就设置Content-Type请求头if(args.contentType){//js中,if判断,除了判断boolean值,还可以判断字符串,对象等,有值就为truexhr.setRequestHeader("Content-Type", args.contentType);}//如果args中,设置了body请求正文,调用send(body)if(args.body){xhr.send(args.body);}else{//如果没有设置,调用send()xhr.send();}
}

3.设计一个类:用于返回给前端ajax回调

//设计一个类,用于返回给前端ajax回调
public class JsonResult {private boolean ok;//表示执行一个操作是否成功private Object data;//操作成功,且是一个查询操作,需要返回一些数据给前端//同样省略getter、setter和toString
}

4.实现前端匹配的Servlet所需功能

在这里插入图片描述

5.项目难点

  1. 实现用户不登录不允许访问主页内容并且重定向到登录页面,其次用户不登录的情况下访问某个接口也是非法的,也要重定向到登录页面
  2. 文章发布后要将新的一篇文章插入到数据库中,查看全文要将markdown格式的数据转为HTML
  3. 登录成功也要创建session并保存用户信息以供后面使用

http://chatgpt.dhexx.cn/article/QoX0GhYP.shtml

相关文章

【Java】博客系统——详细解释+代码+详细注释(课设必过)

目录 前言 博客系统简要分析 一、数据库的设计 1.1 分析 1.2 代码实现&#xff08;创建数据库和表&#xff09; 二、封装数据库&#xff08;JDBC代码的编写&#xff09; 2.1、首先通过创建Maven项目&#xff0c;基于Small Tomcat部署 servlet&#xff1b; 2.2、封装数据…

SSM分布式框架搭建

现在我们看一下我们大家的项目的结构&#xff1a; 一、建立框架&#xff1a; 二、建立root File –》 New –》Module 三、建立子项目tool File–》New –》Module 以同样的方式建立base-manage项目&#xff0c;他的子项目选择org.apache.maven.archetypes:maven-archetype…

8.分布式爬虫框架

目录 分布式爬虫框架消息队列Redis和Scrapy-Redis 分布式爬虫框架 分布式爬虫框架分为两种&#xff1a;控制模式&#xff08;左&#xff09;和自由模式&#xff08;右&#xff09;&#xff1a; 控制模式中的控制节点是系统实现中的瓶颈&#xff0c;自由模式则面临爬行节点之间…

golang 分布式框架Origin学习笔记

最近项目的后端需求是全球同服的&#xff0c;在使用语言方面确定了为golang之后&#xff0c;了解了一下当前的一些goalng游戏服务器框架&#xff0c;终于在leaf/pitaya/ 等众多框架中选择了 Origin&#xff0c; 主要是因为它是分布式框架&#xff0c;微服务架构&#xff0c;比较…

Java开发Dubbo分布式框架

引言 Dubbo是一个分布式服务框架&#xff0c;致力于提供高性能和透明化的RPC远程服务调用方案&#xff0c;以及SOA服务治理方案。简单的说&#xff0c;dubbo就是个服务框架&#xff0c;如果没有分布式的需求&#xff0c;其实是不需要用的&#xff0c;只有在分布式的时候&#x…

PyTorch 分布式框架 Ray :保姆级入门教程

来源&#xff1a;官方博客 翻译&#xff1a;PyTorch 开发者社区&#xff08;微信公众号&#xff09; 今天的机器学习需要分布式计算。无论是训练网络、调整超参数、服务模型还是处理数据&#xff0c;机器学习都是计算密集型的&#xff0c;如果没有访问集群&#xff0c;速度会非…

celery 分布式框架详解

Celery 结构图 如果没有celery&#xff0c;让你自己设计一个异步任务队列你怎么做。 首先&#xff0c;要有一个发起任务的client&#xff0c;选定一定保存任务信息的媒介&#xff0c;由一个worker去一直监听这个信息媒介&#xff0c;这个worker最好是多进程的&#xff0c;另外…

分布式定时任务调度框架

分布式定时任务调度框架 1 分布式定时任务框架设计 1.1 所需的功能 一个分布式定时任务&#xff0c;需要具备有以下几点功能&#xff1a; 1&#xff09;核心功能&#xff1a;定时调度、任务管理、可观测日志 2&#xff09;高可用&#xff1a;集群、分片、失败处理 3&#xf…

# 手把手教学超详细python通用爬虫分布式框架(一)

手把手教学超详细python通用爬虫分布式框架(一) 这里日后添加系列文章的所有文章的目录 文章目录 手把手教学超详细python通用爬虫分布式框架(一)前言一、所谓任务&#xff1f;二、任务需要什么1.启动格式2.任务执行流程分析3.任务灵活化 总结 前言 采用 vueflask&#xff0c;…

使用c++开发分布式框架实践

目前比较流行的分布式框架有dubbo&#xff0c;springcloud&#xff0c;JMX等&#xff0c;都是java实现的&#xff0c;但是在做c项目时&#xff0c;也有分布式的需求&#xff0c;这时我们可以基于grpc自己设计一套分布式框架。 整体思路如下&#xff1a; Consumer服务消费者&…

Ray入门指南——分布式框架(待更新)

1. ray库介绍 金融、工程模型需要大量使用 Pandas 和 Numpy 来做矩阵计算&#xff0c;需要针对 Pandas/Numpy 有更好的支持&#xff0c;ray库就是其中一种可以加速计算的框架。 Ray 有如下特点&#xff1a; 分布式异步调用内存调度Pandas/Numpy 的分布式支持支持 Python整体性…

springboot分布式框架搭建

搭建框架需要工具默认基于 maven 的分布式工程&#xff0c;我们知道在一个项目中&#xff0c;多个微服务是属于同一个工程&#xff0c;只不过是提供不同的服务而已&#xff0c;因此使用 maven 分布式工程来搭建微服务架构。搭建基于 maven 分布式的 Spring Cloud 微服务工程架构…

分布式事务及分布式框架Seata

分布式事务 分布式事务是什么&#xff1f; 》本地事务是一个单元的sql&#xff0c;分布式事务也是一个单元的sql&#xff0c;他们区别在于&#xff0c;分布式事务的sql分布在了不同服务上&#xff0c;这里的服务指微服务和数据库服务 &#xff1f;为什么强调服务是微服务和数…

分布式计算框架Map/reduce

简介: MapReduce是一个基于集群的高性能并行计算平台,MapReduce是一个并行计算与运行的软件框架,MapReduce是一个并行程序设计模型与方法.特点: ①分布可靠,对数据集的操作分发给集群中的多个节点实现可靠性,每个节点周期性返回它完成的任务和最新的状态 ②封装了实现细节&a…

什么是分布式架构

一、分布式架构定义 什么是分布式架构 分布式系统&#xff08;distributed system&#xff09; 是建立在网络之上的软件系统。 内聚性&#xff1a;是指每一个数据库分布节点高度自治&#xff0c;有本地的数据库管理系统。 透明性&#xff1a;是指每一个数据库分布节点对用户…

分布式架构图解

一、分布式架构图解 1&#xff09;传统servletjsp模式 2&#xff09;分布式架构  需要按照功能点把系统拆分&#xff0c;拆分成独立的功能。单独为某一个节点添加服务器。需要系统之间配合才能完成整个业务逻辑。叫做分布式。  分布式架构&#xff1a;多个子系统相互协作…

分布式框架

应用架构 单一应用架构ORM 当网站流量很小时&#xff0c;只需一个应用&#xff0c;将所有功能都部署在一起&#xff0c;以减少部署节点和成本。此时&#xff0c;用于简化增删改查工作量的数据访问框架(ORM)是关键。 适用于小型网站&#xff0c;小型管理系统&#xff0c;将所有…

juicer.js @each中的index 索引+1操作

问题描述&#xff1a;想在index1的值显示出来而不是做字符串拼接&#xff0c;如我做的楼号&#xff0c; 想显示2楼&#xff0c;3楼&#xff0c;4楼 解决方法&#xff1a;在index前加一个加号即可。 !{index1}楼 效果&#xff1a; 简单介绍juicer模板&#xff1a; Juicer 是…

Jmetercookie管理器

Jmeter中cookie自动存储 1&#xff0c;新建一个测试计划&#xff0c;然后添加一个"HTTP Cookie 管理器"(用来存储cookie) 2&#xff0c;新建一个线程组&#xff0c;添加一个Sampler-->“HTTP 请求”&#xff08;用来登录用的&#xff09;&#xff0c;添加一个Samp…

利用3D-DNA流程组装基因组

利用3D-DNA流程组装基因组 使用二代数据或三代数据得到contig后&#xff0c;下一步就是将contig提升到染色体水平。有很多策略可以做到这一点&#xff0c;比如说遗传图谱&#xff0c;BioNano(看运气), HiC, 参考近源物种。 如果利用HiC进行准染色体水平&#xff0c;那么目前常见…