笔者第一次写功能,难免有不足之处,希望大家可以不吝见教。
项目部分的功能是实现一个笔记广场的功能。
笔者将它分为了两部分:
- 一,实现将用户除笔记内外,全部输出;类似下图
- 二,实现将当点击每一篇公开笔记时,将用户的用户名和笔记名传入(传两个值是因为一个人的公开笔记不止一条,这样可以确保不会输出错误),连接数据库,并将相应的详细内容输出(包括笔记的内容)。类似下图。
项目的大致框架和思维导图如下所示:
以下是项目部分的源码(注释贼多,希望可以看完,方便理解):
数据库如下图所示:
项目采用的是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();
}
}
}
}
笔者编写不易希望来一个小红心鼓励。