博客项目--西科论坛

项目简介

西科论坛是基于博客系统改良的一个论坛项目。如果你还在为找工作没合适的经验指导而苦恼,就选择我们的西科论坛吧。在这里你可以看到学长学姐们的面试、笔试经验、内推信息、就业信息等。海量的信息,专为西科学子所打造的找工作的交流天地,希望能对自己的大学生活有更好的规划。

项目实现的功能

项目实现的功能如下:用户注册、用户登录、我的文章列表、添加我的文章、修改我的文章、删除我的文章、所有人文章列表、查看文章详情内容、文章访问量统计、文章点赞功能。

项目使用的技术

前端: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值