如何用Java来实现一个笔记广场的功能(笔者实战)

我是小康小白,一个平平无奇的Java小白。热爱有趣的文字,生活和远方。
在这里插入图片描述


项目部分的功能是实现一个笔记广场的功能。

笔者将它分为了两部分:

  • 一,实现将用户除笔记内外,全部输出;类似下图
    在这里插入图片描述
  • 二,实现将当点击每一篇公开笔记时,将用户的用户名和笔记名传入(传两个值是因为一个人的公开笔记不止一条,这样可以确保不会输出错误),连接数据库,并将相应的详细内容输出(包括笔记的内容)。类似下图。
    在这里插入图片描述

项目的大致框架和思维导图如下所示:

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

以下是项目部分的源码(注释贼多,希望可以看完,方便理解):

数据库如下图所示:
在这里插入图片描述
项目采用的是fastjson;

dao包:

  • 1.JdbcController
package com.dao;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import com.entity.User;
import com.entity.UserNameAndHeadline;
import com.entity.UserOutContent;
import com.util.DBManager;

/**
 *连接数据库,并将所有公开的笔记输出
 *
 */

public class JdbcController {
    /**
     * 将除笔记内容以外所有的用户信息储存于ArrayList中
     *
     * @return
     */
    public ArrayList<UserOutContent> getOutContentInfo(){
        DBManager obj = new DBManager();
        Connection conn = obj.getConnection();
        ArrayList<UserOutContent> users = new ArrayList<>();
        if (conn == null){
            System.out.println("数据库连接出错");
            return null;
        }
            String sql = "SELECT * from users_publicnotes";
            try {
                //预编译处理sql语句
                PreparedStatement ptst = conn.prepareStatement(sql);
                ResultSet rs = ptst.executeQuery();
                rs.last();
                rs.beforeFirst();
                while (rs.next()){
                    UserOutContent user = new UserOutContent();
                    user.setUsername(rs.getString("username"));
                    user.setP_headline(rs.getString("p_headline"));
                    user.setPrasisepoints(rs.getLong("praisepoints"));
                    user.setPageview(rs.getLong("pageview"));
                    user.setTime(rs.getTimestamp("time"));
                    users.add(user);
                }
                obj.closeConn(conn);
            } catch (SQLException e) {
                e.printStackTrace();
                System.out.println("SQL语句有误,数据库报错");
                return null;
            }
        return users;
    }

    /**
     * 将用户名和笔记的标题储存于一个ArrayList集合中
     * @return
     */
    public ArrayList<UserNameAndHeadline> getUsernameAndHeadlineInfo(){
        DBManager obj = new DBManager();
        Connection conn = obj.getConnection();
        ArrayList<UserNameAndHeadline> users = new ArrayList<>();



        if (conn == null){
            System.out.println("数据库连接出错");
            return null;
        }
        String sql = "SELECT * from users_publicnotes";
        try {
            //预编译处理sql语句
            PreparedStatement ptst = conn.prepareStatement(sql);
            ResultSet rs = ptst.executeQuery();
            rs.last();
            rs.beforeFirst();
            while (rs.next()){
                UserNameAndHeadline user = new UserNameAndHeadline();
                user.setUsername(rs.getString("username"));
                user.setP_headline(rs.getString("p_headline"));
                users.add(user);
            }
            obj.closeConn(conn);
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("SQL语句有误,数据库报错");
            return null;
        }
        return users;
    }

    /**
     * 与第一个方法不同,将指定位置的用户的所有信息存储于一个ArrayList集合中
     */
    public ArrayList<User> getUserInfo(int i){
        DBManager obj = new DBManager();
        Connection conn = obj.getConnection();
        ArrayList<User> users = new ArrayList<>();
        ArrayList<User> userList = new ArrayList<>();
        if (conn == null){
            System.out.println("数据库连接出错");
            return null;
        }
        String sql = "SELECT * from users_publicnotes";
        try {
            //预编译处理sql语句
            PreparedStatement ptst = conn.prepareStatement(sql);
            ResultSet rs = ptst.executeQuery();
            rs.last();
            rs.beforeFirst();
            while (rs.next()) {
                User user = new User();
                user.setUsername(rs.getString("username"));
                user.setP_headline(rs.getString("p_headline"));
                user.setP_content(rs.getString("p_content"));
                user.setPrasisepoints(rs.getLong("praisepoints"));
                user.setPageview(rs.getLong("pageview"));
                user.setTime(rs.getTimestamp("time"));
                users.add(user);
            }
            obj.closeConn(conn);
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("SQL语句有误,数据库报错");
            return null;
        }

        userList.add(users.get(i));
//        System.out.println(userList);

        return userList;
    }

}

*2.QueryOutput(这个包我写的最麻烦,注释也是最多的)

package com.dao;

import	java.util.Arrays;
import com.entity.User;
import com.entity.UserNameAndHeadline;
import java.util.ArrayList;

/**
 *当点击时,将用户的用户名和笔记名传入,连接数据库,并将用户的公开笔记的相应的详细内容输出
 */
public class QueryOutput {


    /**
     * 此方法的详细解释:
     *                  首先:
     *                       第一部分:由前端传入两个参数:username(用户名),p_headline(笔记的标题)。然后我将它们放在一个String类型的数组里,
     *                  然后通过ToString方法类使这两个参数连在一起,并用一个String类型的变量inputStr来储存这个值。
     *                       第二部分:将所有的用户名(str1)和笔记标题(str2)储存于一个String类型的数组中,然后将这个数组用ToString输出,并用
     *                  一个String类型的变量来储存这个值。再将值作为数组all的各个元素储存起来。
     *                        第三部分:用遍历来将第一部分获得的input和all数组的各个元素进行比较,获得i(即对应的笔记的位置,简单来说,就是在
     *                  第几行),并用一个全局变量number来储存该位置(i),然后用JdbcController类中的getUserInfo方法获得这个位置的笔记的全
     *                  部信息(包括笔记的内容)。
     * @param username
     * @param p_headline
     * @return
     */
    public  ArrayList<User> QueryOutput(String username, String p_headline) {


        ArrayList<User> userDetails = null;

        String[] input = new String[] {username,p_headline};
        String inputStr = Arrays.toString(input).replace("[","").replace("]","");

        //取得ArrayList中的将用户名和笔记标题和在一起的值
        JdbcController jdbcController = new JdbcController();
        ArrayList<UserNameAndHeadline> users = jdbcController.getUsernameAndHeadlineInfo();

        String[] all = new String[users.size()];

        //将所有的用户名(str1)和笔记标题(str2)储存于一个String类型的数组中,然后将这个数组用ToString输出,并用一个String类型的变量e来储存这个值。再将值作为数组all的各个元素储存起来。
        int j = 0;
        for (int i = 0; i < users.size(); i++) {
            //str1代表用户名
            String str1 = users.get(i).getUsername();
            //str2代表笔记标题
            String str2 = users.get(i).getP_headline();
            String[] strings = new String[]{str1, str2};
            String e = Arrays.toString(strings).replace("[", "").replace("]", "");
            all[j++] = e;
        }

        //number作为一个节点,存储匹配到相应的用户名和笔记标题时。此条信息的位置
        int number = 0;
        for(int i = 0; i < all.length; i++){
            if(all[i].equals(inputStr)){
                number = i;
                //将上面所得位置的用户的详细信息输出
                userDetails =  jdbcController.getUserInfo(number);
//                System.out.println(userDetails);
                break;
            }else {
                System.out.println("匹配失败");

            }

        }

        System.out.println(userDetails);
        return userDetails;
    }
}

entity(实例包):

  • 1.User
package com.entity;

import java.util.Date;

/**
 * 此类中包换所有用户信息,包括:username:用户名;
 *                           p_headline:公开笔记的标题;
 *                           p_content:公开笔记的内容;
 *                           prasisepoints:点赞数;
 *                           pageview:页面浏览量;
 *                           time:笔记的发布时间;
 *                        以及以上类的getter()方法和setter()方法;
 *                        这是主类,包含最多;
 * @author 10593
 */
public class User {

    private String username;
    private String p_headline;
    private String p_content;
    private long prasisepoints;
    private long pageview;
    private Date time;

    public User(){

    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getP_headline() {
        return p_headline;
    }

    public void setP_headline(String p_headline) {
        this.p_headline = p_headline;
    }

    public String getP_content() {
        return p_content;
    }

    public void setP_content(String p_content) {
        this.p_content = p_content;
    }

    public long getPrasisepoints() {
        return prasisepoints;
    }

    public void setPrasisepoints(long prasisepoints) {
        this.prasisepoints = prasisepoints;
    }

    public long getPageview() {
        return pageview;
    }

    public void setPageview(long pageview) {
        this.pageview = pageview;
    }

    public Date getTime() {
        return time;
    }

    public void setTime(Date time) {
        this.time = time;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", p_headline='" + p_headline + '\'' +
                ", p_content='" + p_content + '\'' +
                ", prasisepoints=" + prasisepoints +
                ", pageview=" + pageview +
                ", time=" + time +
                '}';
    }

}

  • 2.UserNameAndHeadline
package com.entity;

/**
 * 此类中包换所有用户信息,包括:username:用户名;
 *                           p_headline:公开笔记的标题;
 *                        以及以上类的getter()方法和setter()方法
 * @author 10593
 */
public class UserNameAndHeadline {
    private String username;
    private String p_headline;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getP_headline() {
        return p_headline;
    }

    public void setP_headline(String p_headline) {
        this.p_headline = p_headline;
    }

    @Override
    public String toString() {
        return username +", "+ p_headline;
    }
}

3.UserOutContent

package com.entity;

import java.util.Date;

/**
 * 此类中包换所有用户信息,包括:username:用户名;
 *                           p_headline:公开笔记的标题;
 *                           prasisepoints:点赞数;
 *                           pageview:页面浏览量;
 *                           time:笔记的发布时间;
 *                        以及以上类的getter()方法和setter()方法
 * @author 10593
 */

public class UserOutContent {
    private String username;
    private String p_headline;
    private long prasisepoints;
    private long pageview;
    private Date time;



    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getP_headline() {
        return p_headline;
    }

    public void setP_headline(String p_headline) {
        this.p_headline = p_headline;
    }

    public long getPrasisepoints() {
        return prasisepoints;
    }

    public void setPrasisepoints(long prasisepoints) {
        this.prasisepoints = prasisepoints;
    }

    public long getPageview() {
        return pageview;
    }

    public void setPageview(long pageview) {
        this.pageview = pageview;
    }

    public Date getTime() {
        return time;
    }

    public void setTime(Date time) {
        this.time = time;
    }

    @Override
    public String toString() {
        return "UserOutContent{" +
                "username='" + username + '\'' +
                ", p_headline='" + p_headline + '\'' +
                ", prasisepoints=" + prasisepoints +
                ", pageview=" + pageview +
                ", time=" + time +
                '}';
    }
}

json包

  • util类
    • ChangeJson:
package com.json.util;

import com.alibaba.fastjson.JSON;
import com.entity.User;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * 将ArrayList集合转化为json格式后保存在一个字符串对象里
 */
public class ChangeJson {
     public String ChangeJson(ArrayList list){

         String str = JSON.toJSONString(list);
//        System.out.println(str);
        return str;
    }


}

  • JsonChange:
package com.json.util;
import	java.util.List;

import com.alibaba.fastjson.JSON;
import com.entity.User;


/**
 * 将json格式的数据转化为java中的List
 */
public class JsonChange {


    public List<User> JsonChange(String str){
        List<User> users = JSON.parseArray(str,User.class);
        return users;

    }
}

Servlet包:

  • Servlet:
package com.Servlet;

import com.dao.JdbcController;
import com.dao.QueryOutput;
import com.json.util.ChangeJson;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;


/**
 * Servlet类
 */
@WebServlet("/Servlet")
public class Servlet extends HttpServlet {
    /**
     * doPost方法:
     *              从接口请求中获得username参数,和p_headline参数。即看看有没有传进来此公开笔记的用户名和笔记的标题。
     *           若两参数不为零,说明页面想获取的是该公开笔记的详细信息,(包括笔记的内容)。输出对应用户的公开笔记。若参
     *           数为零,则说明页面想实现的是笔记广场功能。即将所有公开笔记输出(但不包括笔记的内容)。输出所有公开笔记
     *           (除笔记的内容)。
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 响应参数格式设置
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");


        //向外传值,并将数据转化为json格式保存在一个字符串对象里
        JdbcController jdbcController = new JdbcController();
        ChangeJson changeJson = new ChangeJson();

        //将此字符串对象输出
        PrintWriter out=response.getWriter();


            //如果获取到值说明是在笔记官场页面点击了某一条,则将对应用户的对应笔记的所有内容输出(包括笔记的内容)
            String str1 = request.getParameter("username");
            String str2 = request.getParameter("p_headline");

            if (str1 != null || str2 != null) {
                QueryOutput queryOutput = new QueryOutput();
                String str3 = changeJson.ChangeJson(queryOutput.QueryOutput(str1, str2));
                ;
                out.write(str3);
                out.flush();
                out.close();
            } else {
                //如果未获取到值则说明点击的用户广场,将所有公开的笔记输出(但不输出笔记内容)
                String str = changeJson.ChangeJson(jdbcController.getOutContentInfo());
                out.write(str);
                out.flush();
                out.close();
            }

    }

    /**
     * doGet方法:
     *              转到doPost方法。
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

util包:

  • DeManager
package com.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * @author 10593
 */
public class DBManager {

    private static final String url = "jdbc:mysql://localhost:3306/project?useSSL=false&serverTimezone=UTC";
    private static final String name = "com.mysql.cj.jdbc.Driver";
    private static final String username = "root";
    private static final String password = "*****";//数据库密码

     public Connection getConnection() {

         Connection conn = null;

         try {
             //加载mysql数据库驱动
             Class.forName(name);
         } catch (ClassNotFoundException e) {
             e.printStackTrace();
             System.out.println("加载数据库驱动异常");
             return null;
         }


         try {
             //连接mysql数据库
             conn = DriverManager.getConnection(url, username, password);
         }catch (SQLException e) {
            e.printStackTrace();
            System.out.println("连接数据库异常");
             return null;
         }

         System.out.println("成功连接到数据库");
         return conn;
     }

     //关闭数据库连接
    public void closeConn(Connection conn){
         if(conn != null){
             try{
                 conn.close();
                 System.out.println("成功关闭数据库连接");
             } catch (SQLException e){
                 e.printStackTrace();
             }
         }
    }


}


笔者编写不易希望来一个小红心鼓励。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45791445/article/details/106244783
今日推荐