目录
- 项目简介
- 项目实现的功能
- 项目使用的技术
- 项目准备
- 创建web项目
- pom.xml配置
- web.xml配置
- 文件夹说明
- tomcat部署项目设置
- 数据库设计
- 设计用户表
- 设计文章表
- 功能的实现
- 用户注册功能
- 用户登录功能
- 所有文章展示界面
- 添加修改文章
- 文章访问量、点赞数设计
- 结果流程展示
- 项目测试文档
项目简介
西科论坛是基于博客系统改良的一个论坛项目。如果你还在为找工作没合适的经验指导而苦恼,就选择我们的西科论坛吧。在这里你可以看到学长学姐们的面试、笔试经验、内推信息、就业信息等。海量的信息,专为西科学子所打造的找工作的交流天地,希望能对自己的大学生活有更好的规划。
项目实现的功能
项目实现的功能如下:用户注册、用户登录、我的文章列表、添加我的文章、修改我的文章、删除我的文章、所有人文章列表、查看文章详情内容、文章访问量统计、文章点赞功能。
项目使用的技术
前端:html写简单网页功能,css美化网页,JavaScript实现页面的动态效果和接口的调用
后端:Servlet
数据库:mysql
项目管理工具:maven
项目部署工具:tomcat、服务器
项目准备
创建web项目
pom.xml配置
在pom.xml里面配置servlet框架
web.xml配置
在web.xml里面配置servlet的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<servlet>
<servlet-name>reg</servlet-name>
<servlet-class>service.regServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>reg</servlet-name>
<url-pattern>/reg</url-pattern>
</servlet-mapping>
</web-app>
这样的操作结束之后,Servlet项目就算正式创建完毕了。注意一定要看是否导入成功了吗?
文件夹说明
tomcat部署项目设置
数据库设计
设计用户表
drop table if exists userinfo;
create table userinfo(
id int primary key auto_increment,
username varchar(100) not null,
password varchar(32) not null,
createtime datetime default now(),
updatetime datetime default now(),
`state` int default 1
);
设计文章表
drop table if exists articleinfo;
create table articleinfo (
id int primary key auto_increment,
title varchar(100) not null,
content text not null,
createtime datetime default now(),
updatetime datetime default now(),
uid int not null,
rcount int not null default 1,
`state` int default 1
);
功能的实现
用户注册功能
先构建一个简单的前端页面,然后使用json进行前后端交互
- 前后端交互
jQuery.getJSON("reg",{"username":username.val(),
"password":password.val()},
function (data) {
if(data!=null && data.state==200){
alert("注册成功");
location.href="log.html";
}else{
alert("注册失败"+data.msg);
}
});
- 配置路由
<!-- 注册 -->
<servlet>
<servlet-name>reg</servlet-name>
<servlet-class>service.RegServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>reg</servlet-name>
<url-pattern>/reg</url-pattern>
</servlet-mapping>
- 后端操作
分为三步: 1,接收前端数据 2,数据库操作 3,返回给前端数据
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.接收前端数据
String username=request.getParameter("username");
String password=request.getParameter("password");
int state=-1;
String msg="";
if(username==null || password==null){
msg="参数不正确";
}else{
UserInfo userInfo=new UserInfo();
userInfo.setUsername(username);
userInfo.setPassword(password);
//2,数据库操作
UserInfoDao userInfoDao=new UserInfoDao();
try {
boolean ret=userInfoDao.selectname(userInfo);
if(ret){
msg="用户已存在";
}else{
int res=userInfoDao.add(userInfo);
if(res>0){
state=200;
}
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
//给前端返回json格式的数据
HashMap<String,Object> map=new HashMap<>();
map.put("state",state);
map.put("msg",msg);
WriteUtils.writeMap(response,map);
}```
因为后端返回给前端都是一样的json格式 为了方便起见,写一个公共的类,公共的方法来定义这个格式
```java
public static void writeMap(HttpServletResponse response, HashMap<String,Object>map) throws IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("applicaton/json");
PrintWriter writer=response.getWriter();
ObjectMapper mapper=new ObjectMapper();
writer.println(mapper.writeValueAsString(map));
}
数据库操作,首先可以在utils层中,创建一个公共的数据库连接的类DBUtils,然后给对外提供一个connect对象,并记住要有关闭数据库方法
获得connect对象通常是使用DataSource对象获取。
public class DBUtils {
//1.对外提供connect对象
private static MysqlDataSource dataSource = null;
public static Connection getConnect() throws SQLException {
if (dataSource == null){
//初次调用,先初始化
dataSource = new MysqlDataSource();
//1.设置连接的服务器地址
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java17blog?characterEncoding=utf-8");
//设置用户名
dataSource.setUser("root");
//设置密码
dataSource.setPassword("111111");
}
return dataSource.getConnection();
}
public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet) throws SQLException {
if (resultSet!=null) {
resultSet.close();
}
if (statement!=null) {
statement.close();
}
if (connection != null) {
connection.close();
}
}
}
数据库执行操作:
步骤: 1.连接数据库 2,创建操作命令Statement 3,写sql语句 4,处理结果集resultset 5,释放资源
public boolean selectname(UserInfo userInfo) throws SQLException {
boolean ret=false;
if(userInfo.getUsername()!=null){
//1.连接数据库
Connection connection=DBUtils.getConnect();
//2.使用操作命令执行SQL语句
String sql="select * from userinfo where username=?";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setString(1,userInfo.getUsername());
//3.处理结果集ResultSet
ResultSet resultSet=statement.executeQuery();
if(resultSet.next()){
ret=true;
}
//4.释放资源
DBUtils.close(connection,statement,resultSet);
}
return ret;
}
用户登录功能
登录与注册很相似,但注意登录要使用session保存用户信息。
userInfo=userInfoDao.getId(userInfo);
if(userInfo.getId()>=1){
state=200;
HttpSession session=request.getSession();
session.setAttribute("userinfo",userInfo);
}
所有文章展示界面
//权限验证
HttpSession session=request.getSession(false);
if(session==null || session.getAttribute("userinfo")==null){
msg="用户未登录";
state=100;
}else{
//数据库查询
UserInfo userInfo=(UserInfo) session.getAttribute("userinfo");
int uid=userInfo.getId();
ArticleInfoDao articleInfoDao=new ArticleInfoDao();
try {
list=articleInfoDao.getArticleList(uid);
state=200;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
HashMap<String,Object>map=new HashMap<>();
map.put("state",state);
map.put("msg",msg);
map.put("list",list);
WriteUtils.writeMap(response,map);
添加修改文章
注意这个都需要先进行权限验证,利用session判断用户是否登录成功,然后再进行相应的操作
HttpSession session = request.getSession(false);
false表示: 返回与该请求相关联的session会话,如果没有且创建为false,就不会创建一个新的session信息;
如果是true,则表示从客户端获取session失败后,会创建一个新的session信息;
文章访问量、点赞数设计
很简单,编写sql语句,当每次访问文章接口时候,次数加1;
String sql="update articleinfo set rcount=rcount+1 where id=?";
String sql="update articleinfo set good=good+1 where id=?";
结果流程展示
先访问登录界面
若没有用户信息,可以点击注册,跳转至注册页面:输入账号密码,登录成功跳转至所有文章列表页面:
点击我的首页,进入个人文章列表界面:在里面可以进行添加,修改删除文章等功能
点击返回论坛,跳转至所有文章列表界面,点击文章名字,就能显示文章详情,文章详情页里面可以点赞,点赞成功后面的数字就会+1;
项目测试文档
https://kdocs.cn/l/sno0IdKxRvBb