目录
- 前言
- 一、一点建网站的背景知识
- 二、个人博客系统介绍
- 1、核心功能和数据库
- 2、前端页面
- 3、后端
- servlet
- service层
- dao层
- 配置文件
- 参考资料
前言
这篇博主会介绍下我用javaweb搭建的个人博客系统,源码也会打包放到gitee上,需要的朋友可以自取,大家互相学习,请不要直接CV。
tip:本篇承上篇,许多基本内容在上篇谈到,建议看之前先浏览下上篇博客。
上篇:自己动手搭网站(五):javaweb基础:登录功能
系列总目录:自己动手搭建网站系列总目录
gitee仓库链接
一、一点建网站的背景知识
在正式介绍代码前,博主先谈谈个人了解的一点web背景知识,也是博主接触web后“东拼西凑”来的,若有不当之处,希望大家指正。
最早的网站是非常简单的,基本就是用html和css写的一些静态页面,几乎没有什么交互能力,只是用来展示某些信息的。这个时期的web技术也常被称为web1.0
后来,随着技术的不断发展,C#、php、java等语言逐渐扩展到web领域,或者说,它们本来便是“应运而生”的。这些高级语言的加入使得网站渐渐有了交互能力,不再是只能看的页面了。也被称为web2.0时代,这个时期出现了许多经典的web建站技术栈,比如下面几个:
javaweb系列 (j2EE /javaweb,前端jsp,后端java执行各种复杂操作;最先由sun公司提出,后来sun公司被oracle收购,现在oracle的网站可能还是用j2ee这套,j2ee比较适合大型网站,但是原生的j2ee真的很复杂,现在发展简化到了“spring(boot)+前端”的模式,方便多了,也是目前比较主流的网站开发技术栈)、
asp.net系列(感觉是微软仿照jsp那套做得,前端asp,后端C#执行各种复杂操作,顺便一说,C#和Java据说有90%的相似度)、
php(这个博主没怎么用过,不过听说php可以嵌入html中,导致前后端的界限模糊消失,增加了中小型网站开发效率的同时也使得其很难用于大型网站的开发并且维护也变得更加困难,但目前似乎仍有不少网站用着这套技术栈)
当然,上述还称不上web技术栈,一般还要加上数据库(mysql)、操作系统(centos)、服务器(tomcat、Nginx等)…形成从开发到部署的一整套技术,便可称之为web技术栈了。
web技术博大精深,近年来web3.0的概念也逐渐产生,涉及更复杂的用户交互体验,甚至渗透到生活的方方面面,已经渐渐超脱网站的限制而走向更多元的发展方向。入坑的朋友们,有没有觉得“任重而道远”呢?
二、个人博客系统介绍
闲话少说,咱们步入正题,这次博主采用的技术栈为javaweb(jsp、servlet、jdbc、mysql、tomcat),jsp主要是写前端页面、servlet和jdbc后端操作和连接数据库、tomcat是web服务器、mysql就不必多说了,吾等开发者最青睐的开源数据库。关于jsp、servlet、jdbc大家有疑问的话可以看参考资料中狂神的相关视频,博主主要也是跟着这视频学的。这次用的集成开发环境是idea2022.1
关于用idea新建一个简单的web项目在我放到另外一篇博客
idea基本web开发环境配置及新建javaweb项目
1、核心功能和数据库
系统非常简单,核心功能就两个:登录和博客管理(发布、编辑、修改、展示)
数据库表我也就建了两个,一个user表,一个blog表,分别服务于上面两个功能。登录方面,就简单的登录,甚至没有注册和找回密码等功能,因为是个人博客系统,注册什么的没太大必要(绝对不是因为偷懒,确信!)
-- 创建数据库 create database if not exists blog_system; use blog_system; -- 创建用户表 create table user( user_id varchar(20) primary key, password varchar(20) ); -- 创建博客表,主键为blog_id,无符号int,自增 create table blog( blog_id int unsigned auto_increment primary key, author varchar(20) not null, title varchar(40) not null, content text not null, create_time datetime not null, update_time datetime not null, is_deleted tinyint unsigned not null ); -- 向用户表中插入一条数据 insert into user(user_id,password) values('admin','test@123'); -- 向博客表中插入一条数据 insert into blog(author,title,content,create_time,update_time,is_deleted) values("微光落尘","###测试文章","嘻嘻哈哈","2022-08-31 20:36:08","2022-08-31 20:36:08",0);
2、前端页面
这次博主用的前端框架为bootstrap5,其实和bootstrap3也差不了多少,当初只是想了解下最新的bootstrap。涉及到博客功能,还引入了一个开源项目editor.md ,引入后webapp下的目录结构大概是这样子的
博主在jsp页面插入了一些js脚本,用来和后端交互数据,其中最重要的函数是$.ajax(),关于此方法的详细介绍,参见ajax()方法详解,简单来说就是个用来向后端传递数据并接收后端传回参数的函数。
因为最上面部分和左侧导航栏重复使用,我把它们抽出来做为母版页header.jsp和left.jsp,之后在jsp里面用<%@ include file=“header.jsp”%>引入进来就行。页面相比于第四篇中介绍的几个页面有了一些改变。下面是部分前端页面的代码:
header.jsp
<%--网站头部母版页--%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
欢迎来小尘空间
小站虽小,或有其妙
left.jsp
<%--网站个人中心侧边栏--%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
主页(https://blog.csdn.net/m0_51566872/article/details/index.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
微光落尘的个人空间 <%@ include file="header.jsp"%>效果图如下
美景分享页(https://blog.csdn.net/m0_51566872/article/details/scenery.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
微光落尘的个人空间 效果图如下:
博客列表展示页(blogListPage.jsp)
这里使用了jstl的一些标签来生成动态博客列表,并做了分页功能,分页功能的实现参见参考资料给的链接。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
微光落尘的个人空间 <%@ include file="header.jsp"%>共${page.totalQuantity}篇博客 ${blog.title} ${blog.author} ${blog.createTime} - > «
- > ‹
- ›
- »
效果图:
点击标题进入到博客内容展示页(showBlog.jsp),可以看到详细的博客内容
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
微光落尘的个人空间 <%-- --%> <%@ include file="header.jsp"%>hhh
fffff
效果图如下:
关于本站页面就是个简单的静态页面,内容基本就第四篇博客中的那些,这里就不赘述了。
点击右上角圆形头像展开提示菜单,可以选择“个人中心”、“发布博客”、“登录”、“退出”,如下图效果:
点击“个人中心”,触发登录验证,若没有登录则转向登录页面(https://blog.csdn.net/m0_51566872/article/details/login.jsp),登录成功后转到个人中心(https://blog.csdn.net/m0_51566872/article/details/personalCenter.jsp)
登录页面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
微光落尘的个人空间 小尘空间传送门
效果图如下:
个人中心(https://blog.csdn.net/m0_51566872/article/details/personalCenter.jsp),这页其实也只是拿来充门面的:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
微光落尘的个人空间 点击左侧导航栏“博客管理”,进入博客管理页面(https://blog.csdn.net/m0_51566872/article/details/blogManagement.jsp),可以选择修改和删除博客,也是本系统的核心,这里的动态列表使用js动态生成的(别问我这里为什么不用jstl,jstl真的简单些…)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
微光落尘的个人空间 <%@ include file="left.jsp"%>点击编辑,可以修改博客内容,顺便一说,因为是个人博客系统,所以作者也被我写成默认的了(不是偷懒啊…)
博客编辑页面(editBlog.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
微光落尘的个人空间 <%@ include file="header.jsp"%>
发布博客页面(https://blog.csdn.net/m0_51566872/article/details/publish.jsp)和编辑页面差不多,就不多说了。
3、后端
后端整体结构和上篇说的一样,下面是后端的文件结构
后端具体的代码就不再罗列了,要完整代码的到我的gitee仓库下载即可,下面简单介绍下后端的一些重点内容。
servlet
两类servlet,分别用来处理登录和博客管理相关的请求,登录上篇说得差不多了,博客管理相关的servlet主要有下面几个函数
String method = req.getParameter("method"); if(method.equals("publish")){//用户写完博客点击发布后触发的函数,也就是添加博客到数据库中 this.publish(req,resp); } else if (method.equals("getAllBlog")){//从数据库中取出所有博客 this.getAllBlog(req,resp); }else if(method.equals("delete")){//删除博客 this.deleteBlog(req,resp); }else if(method.equals("modify")){//修改博客 this.modify(req,resp); }else if(method.equals("blogDisplay")){//博客展示,用户点击标题后触发的请求 this.queryBlogById(req,resp); } }
还有一个专门用于辅助分页展示的servlet,关于分页功能,这篇文章讲的比较详细,大家可以参考下
Java Web -【分页功能】详解
登录功能已经在上篇中说过,这里不再赘述。
service层
这层主要是处理一些业务逻辑,并调用数据访问层进行进一步处理,以添加博客功能为例,代码如下
@Override public boolean addBlog(String author, String title, String content) { //返回给servlet的状态标识,用以表示操作是否成功 boolean flag = false; Connection connection = null;//数据库连接 //获取时间并格式化 Date date = new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String createTime = format.format(date); String updateTime = createTime; //连接数据库,并执行添加博客的操作 try { connection = BaseDao.getConnection(); flag = blogdao.addBlog(connection,author,title,content,createTime,updateTime); } catch (Exception e) { throw new RuntimeException(e); }finally { //关闭连接 BaseDao.closeResourse(connection,null,null); } return flag; }
其它函数也差不多是这个逻辑,这里页不再赘述
dao层
数据访问层,一些基本的内容在上篇中也已经谈到,一般我们会把基本的数据库操作封装到一起,命名为BaseDao,其它Dao调用BaseDao的函数。仍然以添加博客为例,简单介绍下
@Override public boolean addBlog(Connection connection,String author,String title, String content, String createTime, String updateTime) { boolean flag = false;//返回给上层的表示,表示操作是否成功 PreparedStatement pstm = null;//预编译的sql语句 ResultSet result = null;//执行操作得到的结果集 int res;//执行操作得到的数据库返回的状态码,一般是受影响的行数,不过在mysql中可能是匹配的行数 if(connection != null) { String sql = "insert into blog(author,title,content,create_time,update_time,is_deleted) values(?,?,?,?,?,?)"; //is_deleted默认为0,表示博客未被删除 Object[] params = {author,title,content,createTime,updateTime,0};//上面sql语句需要的参数 //执行数据更新操作 try { res = BaseDao.update(connection, sql, result, pstm, params); if (res == 1) { flag = true; } //关闭资源 BaseDao.closeResourse(null, result, pstm); }catch (Exception e){ e.printStackTrace(); } } return flag; }
配置文件
主要是网站配置文件web.xml、数据库配置文件按db.properties和maven配置文件pom.xml
web.xml文件主要是声明过滤器和servlet,设置网站首页
https://blog.csdn.net/m0_51566872/article/details/index.jsp LoginServlet com.shimmer.servlet.user.LoginServlet LoginServlet /login BlogServlet com.shimmer.servlet.blog.BlogServlet BlogServlet /blog PagingServlet com.shimmer.servlet.blog.PagingServlet PagingServlet /https://blog.csdn.net/m0_51566872/article/details/paging CharacterEncodingFilter com.shimmer.filter.CharacterEncodingFilter CharacterEncodingFilter /* LoginFilter com.shimmer.filter.LoginFilter LoginFilter /personalCenter/*
db.properties配置数据库连接必要信息
//driver是驱动 driver=com.mysql.cj.jdbc.Driver //mysql后是MySQL服务器IP和端口,再后面是数据库名字,再是一些配置 url=jdbc:mysql://127.0.0.1:3306/blog_system?useUnicode=true&characterEncoding=utf-8&userSSL=false&serverTimezone=GMT%2B8 username=自己设的 password=自己设置的
pom.xml
4.0.0 org.example MyBlogSystem 1.0-SNAPSHOT war junit junit 4.11 test javax.servlet javax.servlet-api 4.0.1 provided mysql mysql-connector-java 8.0.29 com.alibaba fastjson 1.2.79 javax.servlet jstl 1.2 org.junit.jupiter junit-jupiter RELEASE compile
到这里,这个系统基本就介绍得差不多了,可能讲解的不是很详细,不过篇幅已经够长了(主要是博主快编不动了…)若有不清晰的地方,大家可以参考后面参考资料中的文章、视频等再研究研究。整个《自己动手搭网站》系列到此暂且也算是结束第一期了。虽然,部署维护什么的只是稍微提及,等后面有空再补上吧(等我学会再来编…)。
另外,功能方面做得比较简陋是因为考虑到后面可能升级到spring boot+vue的技术栈,spring+前端的模式也是目前比较主流的web技术栈之一,这套技术怎么说呢,其实也是从J2EE简化扩展来的,有了javaweb的基础后,springboot上手还是比较快的,但想深入了解,可能就非一时之功了。另外,前端框架的学习可能要稍微多花些功夫,虽然有现成的样式可以参考(ElementUI),但是要灵活使用还是比较困难的,这也是博主没有一次性跨到这套技术栈的原因,步子太大了,容易那啥来着…
最后,如果觉得本篇文章对您有帮助的话,别忘了点赞!!!
参考资料
1、菜鸟-Bootstrap5 教程
2、editor.md官网
3、富文本编辑器Editor.md入门
4、javaweb从入门到实战
5、Java Web -【分页功能】详解
还没有评论,来说两句吧...