javaweb——>个人博客项目

article/2025/9/11 12:45:53

javaweb——>个人博客项目

具体代码参考:java_blog

目录

  • javaweb——>个人博客项目
  • 具体代码参考:[java_blog](https://github.com/zhuyunfeisn/java-project/tree/master/java_Blog)
  • 一.简单介绍
    • 1.功能简介
    • 2.使用的技术
  • 二.项目准备
    • 1.需要的资源
    • 2.创建Web项目
    • 3.数据库设计
      • <1>用户表
      • <2>文章表
  • 三.项目开发
    • 1.前置知识
    • <1>Filter过滤器
      • <2>简单Ajax和json介绍
        • (1). Ajax
          • B.json的序列化和反序列化
    • 2.具体开发(后端服务)
      • <1>设计数据库实体类和返回的JSONResponse对象
        • (1)用户类
        • (2)文章类
        • (3)JSONResponse对象
      • <2>设计自定义异常以及Servlet实现的父类
        • (1)自定义异常
        • (2)Servlet实现的父类以及异常的处理
      • <3>设计数据库连接工具类
        • (1).获取数据库连接
        • (2)资源释放
      • <4>设计JSON与java对象的序列化和反序列化方法
      • <5>设计Filter过滤器工具
      • <6>业务功能的具体实现
  • 四.项目总结
    • 1.使用的技术和功能
      • <1>使用的技术
      • <2>功能
      • <3>项目执行的流程
        • (1)请求网页
        • (2)js发送ajax请求
        • (3)Tomcat
        • (4)Servlet
        • (5)Servlet统一处理异常

一.简单介绍

1.功能简介

实现一个简易的博客功能,包括用户登录、,发表新文章,显示文章详情,显示文章列表,显示文章列表接口访问量(使用到多线程,暂时未做)。

2.使用的技术

在这里插入图片描述

二.项目准备

1.需要的资源

在这里插入图片描述

2.创建Web项目

Web项目的前期配置

3.数据库设计

在这里插入图片描述

<1>用户表

create table user (id int primary key auto_increment,username varchar (20) not null unique,password varchar (20) not null,nickname varchar(20),sex bit,birthday date,head varchar (50) comment '头像'
);
insert into user(username,password) values
('张三','1001'),
('李四','1002'),
('王五','1003');

在这里插入图片描述

<2>文章表

create table article(
id int primary key auto_increment,
title varchar (20)  not null comment'标题',
content mediumtext  not null comment '正文' ,
create_time timestamp default now(),
view_count int default 0,
user_id int ,
foreign key (user_id) references user(id)
);
insert into article( title, content,  user_id) values
('快速排序','public...',1),
('冒泡排序','public...',1),
('选择排序','public...',1),
('归并排序','public...',2),
('插入排序','public...',2);

在这里插入图片描述

三.项目开发

1.前置知识

<1>Filter过滤器

在这里插入图片描述
Filter:拦截请求,过滤响应

<2>简单Ajax和json介绍

(1). Ajax

B.json的序列化和反序列化

参考:序列化和反序列化

2.具体开发(后端服务)

<1>设计数据库实体类和返回的JSONResponse对象

(1)用户类

@Getter
@Setter
@ToString
public class User {private Integer id;private String username;private String password;private String nickname;//昵称private Boolean sex;private Date birthday;private String head;//头像
}

(2)文章类

@Setter
@Getter
@ToString
public class Article {private Integer id;private String title;private String content;private Date createTime;private Integer viewCount;private Integer userId;
}

(3)JSONResponse对象

/*** http响应json数据,前后端统一约定的格式* 前端响应的状态码都是200,进入ajax的success来使用* 操作成功:(success:true,  data :xxx)* 操作失败:(success:false  code:xxx, message:xxx)*/
@Setter
@Getter
@ToString
public class JSONResponse {//业务操作是否成功private boolean success;//业务操作的消息码,一般来说,出现错误的错误码才有意义private String code;//业务操作的错误信息,给用户看的信息private String message;//业务数据:业务操作成功时,给前端ajax,success方法使用,解析响应json数据,渲染网页信息private Object data;}

<2>设计自定义异常以及Servlet实现的父类

(1)自定义异常

package org.example.exception;/*** 自定义异常类:业务代码抛自定义异常或者其他异常* 自定义异常返回给定的错误码,其他异常返回其他错误码*/public class APPexception extends RuntimeException{//给前端返回json字符串中,保存错误码private String code;//message父类自带,返回josn字符串中,保存错误信息给用户用public APPexception(String code,String message) {super(message);this.code=code;}public APPexception(String code,String message, Throwable cause) {super(message, cause);this.code=code;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}
}

(2)Servlet实现的父类以及异常的处理

package org.example.servlet;import org.example.exception.APPexception;
import org.example.modle.JSONResponse;
import org.example.util.JSONUtil;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public  abstract class AbstractBaseServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置请求体编码req.setCharacterEncoding("UTF-8");//设置请求体的编码resp.setCharacterEncoding("UTF-8");//为响应体设置数据类型(浏览器要采取什么方式执行)resp.setContentType("application/json");//获取当前URL,校验是否是登录或者注册,如果不是,进行session校验//session会话管理,除登录和注册接口,其他都需要登录后访问//通过req.getServletPath();获取请求服务路径JSONResponse json=new JSONResponse();//调用子类重写的方法try{Object data=process(req, resp);//子类的process执行完全没有抛异常,表示业务执行成功json.setSuccess(true);json.setData(data);}catch (Exception e){e.printStackTrace();//异常如何处理//自定义异常返回错误信息//json.setSuccess(false)不用设置了,因为new的时候初始化就是String code="UNKNOWN";String s="未知错误";if(e instanceof APPexception){//将异常信息取出赋给scode=((APPexception)e).getCode();s=e.getMessage();json.setCode(code);json.setMessage(s);}}PrintWriter pr=resp.getWriter();//将json信息打印pr.println(JSONUtil.serialize(json));pr.flush();pr.close();}protected  abstract Object process(HttpServletRequest req, HttpServletResponse resp) throws Exception;}

<3>设计数据库连接工具类

 private static final String URL="jdbc:mysql://localhost:3306/servlet_blog?" +"user=root&password=sn20000904&useUnicode=true&characterEncoding=UTF-8";//数据库连接池private static final DataSource DS=new MysqlDataSource();//静态代码块初始化DSstatic {((MysqlDataSource)DS).setUrl(URL);}

(1).获取数据库连接

  //获取数据库连接public static Connection getConnection(){try {return DS.getConnection();} catch (SQLException e) {e.printStackTrace();//抛自定义异常throw new APPexception("SQL001","获取数据库连接异常",e);}}

(2)资源释放

 //资源释放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 APPexception("SQL002","数据库释放资源出错",e);}}public static void close(Connection c, Statement s){close(c,s ,null );}

<4>设计JSON与java对象的序列化和反序列化方法

package org.example.util;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;import java.io.IOException;
import java.io.InputStream;public class JSONUtil {//定义一个ObjectMapper类,主要实现java类和json对象之间的转换private static final ObjectMapper MAPPER = new ObjectMapper();/*** JSON序列化,将java对象序列化为json字符串** @param o java对象* @return json字符串*///序列化,返回json字符串public static String serialize(Object o) {try {return MAPPER.writeValueAsString(o);} catch (JsonProcessingException e) {e.printStackTrace();throw new RuntimeException("json序列化失败" + o);}}/*** 反序列化操作** @param is    输入流* @param clazz 指定要反序列化的类型* @param <T>* @return 反序列化对象*///反序列化(使用输入流InputStream获取输入字符串)public static <T> T deserialize(InputStream is, Class<T> clazz) {try {return MAPPER.readValue(is, clazz);} catch (IOException e) {e.printStackTrace();throw new RuntimeException("json反序列化失败" + clazz.getName());}}
}

<5>设计Filter过滤器工具

package org.example.filter;import org.example.modle.JSONResponse;
import org.example.util.JSONUtil;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;//import javax.servlet.annotation.WebFilter;/*** 配置用户统一会话管理的过滤器,匹配所有请求路径* 服务端资源:/login不用校验session,其他都要校验,如果不通过,返回401,响应资源随便加* 前端资源:/jsp/校验session,不通过重定向到登录页面*           /js/,/static/,/view/,全部不校验*/
@WebFilter("/*")
public class LoginFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}/***每次http请求匹配到过滤器路径时,会执行该过滤器的doFilter方法*如果我们要往下执行,是调用filterChain.doFilter(request,response)*否则需要自行处理响应内容*/@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {//类强制转换HttpServletRequest req=(HttpServletRequest) request;HttpServletResponse resp=(HttpServletResponse) response;String servletPath=req.getServletPath(); //获取当前请求的服务路径//先处理不需要登录允许访问的:往下执行,继续调用if(servletPath.startsWith("/js/")||servletPath.startsWith("/static/")||servletPath.startsWith("/view/")||servletPath.equals("/login")){chain.doFilter(request, response);}else {//先获取Session对象,没有就返回空HttpSession session=req.getSession(false);//验证用户是否登录,如果没有登录,还需要根据前端和后端做不同的处理if(session==null||session.getAttribute("user")==null){//前端重定向到登陆页面if(servletPath.startsWith("/jsp/")){//使用绝对路径,重定向resp.sendRedirect(basePath(req)+"/view/login.html");}else {//后端返回401状态码resp.setStatus(401);//设置请求体的编码resp.setCharacterEncoding("UTF-8");//为响应体设置数据类型(浏览器要采取什么方式执行)resp.setContentType("application/json");JSONResponse json=new JSONResponse();json.setCode("LOG000");json.setMessage("用户没有登录,不允许访问");PrintWriter pw=resp.getWriter();pw.println(JSONUtil.serialize(json));pw.flush();pw.close();}}else {//敏感资源,但已登录,允许继续执行chain.doFilter(request, response);}}}/*** 根据http请求,动态的获取访问路径(服务路径之前的部分)*/public static String basePath(HttpServletRequest req){String schema=req.getScheme();//获取httpString host=req.getServerName();//主机ip或域名int port=req.getServerPort();//服务器端口号String contextPath=req.getContextPath();//获取应用上下文路径return schema+"://"+host+":"+port+contextPath;}@Overridepublic void destroy() {}
}

<6>业务功能的具体实现

用户登录、,发表新文章,显示文章详情,显示文章列表,删除文章,修改文章,显示文章列表接口访问量(使用到多线程,暂时未做)。
源代码参考:java_blog
Servlet相关操作位于servlet包下,数据库查询操作位于DAO包下

四.项目总结

1.使用的技术和功能

<1>使用的技术

Servlet,MySQL,jackson,ajax,UEditor

<2>功能

1.已完成:用户登录、,发表新文章,显示文章详情,显示文章列表,删除文章,修改文章
Servlet模板方法:结合jackson序列化响应的统一格式,结合自定义异常完成统一的异常处理
敏感资源的查看,使用到Session以及Filter过滤器
扩展
Filter过滤器完成用户会话的统一管理
富文本编辑器实现博客文章的展示,以及图片上传

2.未完成:使用到多线程
数据库连接池,通过双重校验锁的单例模式来完成
文章列表接口的统计访问量:(内存实现)在文章列表接口中,定义一个变量来保存访问量,在定义一个获取访问量的接口,请求时返回访问量的内容

在这里插入图片描述

<3>项目执行的流程

在这里插入图片描述

(1)请求网页

在这里插入图片描述

(2)js发送ajax请求

在这里插入图片描述

(3)Tomcat

在这里插入图片描述

(4)Servlet

在这里插入图片描述
在这里插入图片描述

(5)Servlet统一处理异常

在这里插入图片描述


http://chatgpt.dhexx.cn/article/7GymNZqo.shtml

相关文章

个人博客-javaWeb项目

一、目标 利用已有的前端页面实现一个个人博客系统的后端设计&#xff0c;可以实现用户登录&#xff0c;博客列表展示&#xff0c;博客详情页展示&#xff0c;写博客&#xff0c;删除博客的功能。 二、开发思路 采用前后端分离的方式&#xff0c;网页通过ajax构造HTTP请求和…

javaweb实现个人博客系统

JAVAweb项目——个人博客系统 技术路线&#xff1a; 项目主要采用jsphtml前台页面&#xff0c;后端服务器采用servlet&#xff0c;编辑相关样式以及函数功能的时候使用到了bootstap和jQuery。数据库操作通过dbutils和c3p0连接池实现。Md编辑通过第三方插件editor.md实现。 实现…

一个简单漂亮的Java博客系统

预览地址&#xff1a;http://forestblog.liuyanzhao.com 关于项目 该博客是基于SSM实现的一个个人博客系统&#xff0c;适合初学SSM和个人博客制作的同学学习。 主要涉及技术包括的包括 Maven、Spring、SpringMVC、MyBatis、JSP等 最新写了一篇该项目的毕业设计论文&#xf…

Java程序员博客系统推荐!我调研了100来个 Java 开源博客系统,发现这 5 个最好用!

最近想倒腾一下博客&#xff0c;看了很多现成的比较成熟的开源博客系统&#xff0c;自己也简单从下面几个维度总结对比了一下&#xff1a; star数量技术选型社区生态 当然啦&#xff01;好东西不能独享。下面简单分享一下我所做的笔记。 欢迎小伙伴们评论区补充完善。ღ( &a…

JavaWeb搭建简易个人博客

前台首页访问路径&#xff1a;/index.jsp 后台访问路径:/admin.jsp 运行项目前请把blog-parent目录下的database.sql加载到数据库中,并在blog-web/资源文件夹下的db.properties里配置数据库访问账号和密码 CSDN下载链接:点击链接下载

Java项目-Javaweb实现个人博客

作者主页&#xff1a;编程指南针 简介&#xff1a;Java领域优质创作者、CSDN博客专家 Java项目、简历模板、学习资料、面试题库、技术互助 文末获取源码 项目编号 &#xff1a;KS020 运行环境&#xff1a; 开发工具&#xff1a;IDEA /ECLIPSE 应用服务器&#xff1a;TOMCA…

用java写一个博客网站

可以先看一下这个网站长怎么样&#xff0c;哈哈哈&#xff0c;小屋知多少 先说一下这个博客有哪写功能&#xff1f;然后这个是代码后台下载地址&#xff1a;https://gitee.com/c-xiaobai-c/ssm-blog-website-background.git 前台下载地址&#xff1a;https://gitee.com/c-xia…

JavaWeb项目 -- 博客系统

JavaWeb项目 -- 博客系统 前言&#xff1a;页面展示一、创建 Maven 项目二、设计数据库三、封装数据库的操作3.1 创建 DBUtil 类3.2 创建 Blog 类3.3 创建 User 类3.4 创建类 BlogDao3.5 创建类 UserDao 四、导入准备好的前端代码五、实现博客列表界面5.1 约定好前后端交互接口…

【Java项目】从0到1构建一个博客系统

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaWeb】 ✈️✈️本篇内容:从0到1构建一个博客系统&#xff01; &#x1f680;&#x1f680;代码托管平台github&#xff1a;博客系统源码托管&#xff01; ⛵…

史上最全的 Java 高质量博客与网站推荐(国内篇)

阅读文本大概需要 6.66 分钟。 前言 我最近在系统整理一些 Java 后台方面的面试题和参考答案&#xff0c;有找工作需求的童鞋&#xff0c;欢迎关注我的 Github 仓库&#xff0c;如果觉得不错可以点个 star 关注 &#xff1a; 1、awesome-java-interview2、awesome-java-notes…

博客系统[Java]

目录 一.准备工作 二.实现数据库代码(JDBC) 1.创建数据库/表结构>数据库设计 2.封装数据库(Model) 1>创建DBtil封装数据库连接操作 2>创建实体类-->表示一条记录 3>封装针对数据的增删改查 三.博客列表页 1.约定前后端 2.编写服务器代码 3.编写客户端…

JavaWeb项目—— 博客系统

文章目录 效果展示1. 创建 maven 项目2. 设计数据库3. 封装数据库的操作代码3.1 创建 DBUtil 类3.2 创建 Blog&#xff08;代表一篇博客&#xff09;3.3 创建 User&#xff08;代表一个用户&#xff09;3.4 创建类 BlogDao&#xff08;对博客表进行操作&#xff09;3.5 创建类 …

Java个人博客项目

目录 引言 开发环境 所用技术 项目目录 数据库设计 功能介绍 源码下载 更多优质练手项目 Java学生成绩管理系统 JavaWeb练手项目ATM机 Java图书管理系统 Java电子发票管理系统 引言 这个项目是大二下学期期末考核项目&#xff0c;当时是自选主题写一个项目&#x…

Java项目——个人博客系统

文章目录 一、项目背景二、项目功能三、项目的基本流程1.准备工作2.数据库设计3.准备前端页面4.实现前端匹配的Servlet所需功能5.项目难点 一、项目背景 在学习完JavaWeb相关知识后&#xff0c;有了基础能力就想通过完成一个Javaweb项目来回顾和加强已经学过的知识&#xff0c…

【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;速度会非…