网络留言系统(Javaweb简易开发)

article/2025/8/29 8:56:07

目录

第一步:建立数据库test

第二步:创建javaee项目,onlineMessage

第三步:创建JDBC

先导入JDBC驱动包

 创建SqlSrvDBConn类

第四步:构件JavaBean

第五步:编写Servlet

MainServlet

AddServlet

RegisterServlet

第六步:编写页面

login.jsp

register.jsp

main.jsp

liuyan.jsp 

error.jsp

 第七步:配置文件

界面运行效果如下:

 项目源代码:

问题整理:


采用JSP+Servlet+JavaBean+JDBC方式开发一个网络留言系统。

要求:(1)用户在页面上输入用户名和密码登录,成功进入后可以看到所有的留言信息(2)用户可以自己添加,编辑留言,提交后可实时看到新增加的留言(3)系统提供新用户注册的功能

第一步:建立数据库test

我用的是mysql数据库,数据库中有两张表,用户信息表usertable和留言表lytable

表结构如下:

第二步:创建javaee项目,onlineMessage

第三步:创建JDBC

先导入JDBC驱动包

 创建SqlSrvDBConn类

这个类主要就是连接数据库,操作数据库的。

public class SqlSrvDBConn {private Statement stmt;private Connection conn;ResultSet rs;//在构造方法中创建数据库连接public SqlSrvDBConn(){stmt=null;try {//1.加载并注册驱动Class.forName("com.mysql.jdbc.Driver");//2.获取数据库连接对象Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");} catch (Exception e) {e.printStackTrace();}rs=null;}//获取数据库连接public Connection getConn(){return this.conn;}//执行查询类的SQL语句,有返回集public ResultSet executeQuery(String sql){try {//5.获取执行sql对象Statementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);//6.执行sqlrs=stmt.executeQuery(sql);} catch (SQLException throwables) {throwables.printStackTrace();}return rs;}//关闭对象public void closeStmt(){try {//8.释放资源stmt.close();} catch (SQLException e) {System.err.println("Data.executeQuery: " + e.getMessage());}}public void closeConn(){try {//8.释放资源conn.close();} catch (SQLException e) {System.err.println("Data.executeQuery: " + e.getMessage());}}}

第四步:构件JavaBean

底层数据库有几个表,就创建几个JavaBean,其实就是Java实体。里边写属性和get和set方法

public class UserTable {//属性private Integer id;private String username;private String password;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
public class LyTable implements java.io.Serializable {//属性private Integer id;private Integer userId;private Date date;private String title;private String content;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getUserId() {return userId;}public void setUserId(Integer userId) {this.userId = userId;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}
}

第五步:编写Servlet

MainServlet

MainServlet:主要实现登录验证功能和对留言的查询功能,查询所有的留言信息。

@WebServlet("/mainServlet")
public class MainServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置请求编码request.setCharacterEncoding("gb2312");//获取提交的用户名String usr = request.getParameter("username");//获取提交的密码String pwd = request.getParameter("password");//定义一个变量作为验证成功与否的标识boolean validated=false;//与数据库有关SqlSrvDBConn sqlsrvdb=new SqlSrvDBConn();//获得会话对象,用来存储当前登录的用户信息HttpSession session=request.getSession();//创建一个user对象,并设置为空UserTable user=null;//先获得UserTable对象,如果是第一次访问该页,用户对象肯定为空,但如果是第二次甚至是第三次,就直接登录主页而无须再次重复验证该用户的信息user=(UserTable)session.getAttribute("user");//如果是第一次进入if(user==null){//查询usertable表中的记录String sql="select * from usertable";//取得结果集ResultSet rs=sqlsrvdb.executeQuery(sql);try{while(rs.next()){//如果用户名和密码都正确if((rs.getString("username").trim().compareTo(usr)==0)&&(rs.getString("password").compareTo(pwd)==0)){user=new UserTable();				//创建持久化的JavaBean对象useruser.setId(rs.getInt(1));user.setUsername(rs.getString(2));user.setPassword(rs.getString(3));session.setAttribute("user", user);	//把user对象存储在会话中validated=true;						//标识为true表示验证成功通过}}rs.close();}catch (SQLException e){e.printStackTrace();}sqlsrvdb.closeStmt();}else{validated=true;//该用户在之前已经注册登录过了,已经验证过身份了,无需再验证}//身份验证之后---------------------------------------if(validated){//验证成功,应该去主界面,主界面显示留言的所有信息,所以要从留言表中查出来,并且暂存在会话中ArrayList al=new ArrayList();try{String sql="select * from lyTable";ResultSet rs=sqlsrvdb.executeQuery(sql);	//取得结果集while(rs.next()){LyTable ly=new LyTable();ly.setId(rs.getInt(1));ly.setUserId(rs.getInt(2));ly.setDate(rs.getDate(3));ly.setTitle(rs.getString(4));ly.setContent(rs.getString(5));al.add(ly);}rs.close();}catch(SQLException e){e.printStackTrace();}sqlsrvdb.closeStmt();session.setAttribute("al", al);//然后跳转到main.jspresponse.sendRedirect("main.jsp");}else{//验证失败跳转到error.jspresponse.sendRedirect("error.jsp");}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request,response);}
}

AddServlet

AddServlet:这个主要实现留言的添加功能,要在会话中保存一份,也要在数据库中存储留言信息

@WebServlet("/addServlet")
public class AddServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("gb2312");String title = request.getParameter("title");String content = request.getParameter("content");HttpSession session = request.getSession();//从会话中获取出当前用户的对象UserTable user = (UserTable)session.getAttribute("user");//建立留言表对应的JavaBean对象,把数据封装进去LyTable ly=new LyTable();ly.setUserId(user.getId());							//获取当前登录用户的idly.setDate(new Date(System.currentTimeMillis()));	//获取当前系统时间ly.setTitle(title);ly.setContent(content);ArrayList al=(ArrayList)session.getAttribute("al");al.add(ly);//向数据库中插入新的留言记录PreparedStatement pstmt=null;SqlSrvDBConn sqlsrvdb=new SqlSrvDBConn();Connection ct=sqlsrvdb.getConn();try{pstmt=ct.prepareStatement("insert into lyTable(userid,date,title,content) values(?,?,?,?)");pstmt.setInt(1, ly.getUserId());pstmt.setDate(2, (Date) ly.getDate());pstmt.setString(3, ly.getTitle());pstmt.setString(4, ly.getContent());pstmt.executeUpdate();response.sendRedirect("main.jsp");}catch(SQLException e){e.printStackTrace();response.sendRedirect("liuyan.jsp");}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request,response);}
}

RegisterServlet

RegisterServlet主要实现新用户的注册,将信息存入数据库

@WebServlet("/registerServlet")
public class RegisterServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("gb2312");String usr = request.getParameter("username");String pwd = request.getParameter("password");//向数据库中插入用户名和密码PreparedStatement pstmt=null;SqlSrvDBConn sqlsrvdb=new SqlSrvDBConn();Connection ct=sqlsrvdb.getConn();try{pstmt=ct.prepareStatement("insert into usertable(username,password) values(?,?)");pstmt.setString(1, usr);pstmt.setString(2, pwd);pstmt.executeUpdate();response.sendRedirect("login.jsp");}catch(SQLException e){e.printStackTrace();}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request,response);}
}

第六步:编写页面

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>简易留言板</title>
</head>
<body bgcolor="#E3E3E3">
<form action="mainServlet" method="post"><table><caption>用户登录</caption><tr><td>用户名:</td><td><input type="text" name="username" size="20"/></td></tr><tr><td>密码:</td><td><input type="password" name="password" size="21"/></td></tr></table><input type="submit" value="登录"/><input type="reset" value="重置"/>
</form>
如果没注册单击<a href="register.jsp">这里</a>注册!
</body>
</html>

register.jsp

<%@ page language="java" pageEncoding="gb2312"%>
<html>
<head><title>简易留言板</title>
</head>
<body bgcolor="#E3E3E3"><form action="registerServlet" method="post"><table><caption>用户注册</caption><tr><td>登录名:</td><td><input type="text" name="username"/></td></tr><tr><td>密码:</td><td><input type="password" name="password"/></td></tr></table><input type="submit" value="注册"/><input type="reset" value="重置"/></form>
</body>
</html>

main.jsp

<%@ page language="java" pageEncoding="gb2312" import="java.util.*,java.sql.*,org.easybooks.test.model.vo.*,org.easybooks.test.jdbc.*"%>
<%@ page import="org.easybooks.test.javaBean.LyTable" %>
<html>
<head><title>留言板信息</title>
</head>
<body bgcolor="#E3E3E3"><form action="liuyan.jsp" method="post"><table border="1"><caption>所有留言信息</caption><tr><th>留言人姓名</th><th>留言时间</th><th>留言标题</th><th>留言内容</th></tr><%PreparedStatement pstmt=null;SqlSrvDBConn sqlsrvdb=new SqlSrvDBConn();Connection ct=sqlsrvdb.getConn();ArrayList al=(ArrayList)session.getAttribute("al");Iterator iter=al.iterator();while(iter.hasNext()){LyTable ly=(LyTable)iter.next();String usr=null;try{pstmt=ct.prepareStatement("select username from userTable where id=?");pstmt.setInt(1, ly.getUserId());ResultSet rs=pstmt.executeQuery();while(rs.next()){usr=rs.getString(1);}}catch(SQLException e){e.printStackTrace();}%><tr><td><%=usr%></td><td><%=ly.getDate().toString()%></td><td><%=ly.getTitle()%></td><td><%=ly.getContent()%></td></tr><%}%></table><input type="submit" value="留言"/></form>
</body>
</html>

liuyan.jsp 

<%@ page language="java" pageEncoding="gb2312"%>
<html>
<head><title>留言板</title>
</head>
<body bgcolor="#E3E3E3"><form action="addServlet" method="post"><table border="1"><caption>填写留言信息</caption><tr><td>留言标题</td><td><input type="text" name="title"/></td></tr><tr><td>留言内容</td><td><textarea name="content" rows="5" cols="35"></textarea></td></tr></table><input type="submit" value="提交"/><input type="reset" value="重置"/></form>
</body>
</html>

error.jsp

<%@ page language="java" pageEncoding="gb2312"%>
<html>
<head><title>出错</title>
</head>
<body>登录失败!单击<a href="login.jsp">这里</a>返回
</body>
</html>

 第七步:配置文件

<?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_4_0.xsd"version="4.0"><display-name>onlineMessage</display-name><welcome-file-list><welcome-file>login.jsp</welcome-file></welcome-file-list></web-app>

界面运行效果如下:

 

 项目源代码:

gittee:onlineMessage: 网络留言系统

问题整理:

按照老师给的那个代码,当注册用户或者是写留言的时候,数据是无法插入数据库的,因为他有个主键自动增长,然后去给你匹配的时候,你没有写上那个键的值,就无法给你匹配,然后你将数据库的那个字段名称写上,就OK啦!

 本案例来自于课本,仅供参考学习。


http://chatgpt.dhexx.cn/article/PKP3dUHe.shtml

相关文章

留言管理系统的设计与实现

一、设计目的 留言系统目前在各类网站中被广泛使用。通过综合运用JSP、Servlet、JavaBean、JDBC、MySQL和MVC DAO等技术与方法&#xff0c;设计与实现一个留言管理系统&#xff0c;进一步理解和掌握Java Web编程开发的基本技术和方法&#xff0c;熟练使用开发工具。 二、课程…

留言板系统的设计与实现_kaic

目 录 内容摘要 Abstract Key Words 1.课程题目介绍 1.1选题背景及意义 1.2需求分析 1.3达到的目标 2&#xff0e;系统总体模块 2.1 系统总体模块流程图 2.2 配置服务器 3.各功能模块界面设计与功能实现 3.1首页界面 3.2 文章日记管理…

位操作(左移和右移)

位操作提高程序运行效率 减少除法和取模的运算。在计算机程序中数据的位是可以操作的最小数据单位&#xff0c;理论上可以用”位运算”来完成所有的运算和操作。 左移&#xff0c;后空缺自动补0&#xff1b; 右移&#xff0c;分为逻辑右移和算数右移 1&#xff09;逻辑右移 …

`>>`(有符号右移) 和 `>>>`(无符号右移)的区别

JavaScript >>(有符号右移) 和 >>>(无符号右移)的区别 之所以以 JS 为例&#xff0c;是因为Java中不支持无符号操作 直接看MDN英文吧&#xff1a; >> (有符号右移) sign-propagating&#xff08;符号位-传播&#xff09;右移 我们知道&#xff0c;计算…

0x,左移,右移

0x代表的是十六进制&#xff0c;表示的是补码&#xff0c;默认为int类型&#xff0c;即32位&#xff0c;不足高位补0。如&#xff1a;0xff0x000000ff&#xff0c;每一位代表一个十六进制&#xff0c; -2表示的补码为1111 1111 1111 1111 1111 1111 1111 1110。十六进制为 0xfff…

右移

今天看到一道题&#xff0c;题为&#xff1a;用最有效率的方法算出2乘以8等於几?答案是&#xff1a;2 << 3&#xff0c;因为将一个数左移n位&#xff0c;就相当于乘以了2的n次方&#xff0c;那么&#xff0c;一个数乘以8只要将其左移3位即可&#xff0c;而位运算cpu直接…

企业信息安全————2、如何描述风险价值

什么是信息安全风险 安全的定义&#xff1a; 例如&#xff1a; 漏洞未修复————脆弱性 发生概率————威胁 带来影响————风险 威胁和脆弱性的关系&#xff1a; 功能越强大、提供的服务越多可能存在漏洞的概率也就越高。 总结&#xff1a;可以利用脆弱性&#xff0…

R语言用GARCH模型波动率建模和预测、回测风险价值 (VaR)分析股市收益率时间序列...

原文链接&#xff1a;http://tecdat.cn/?p26897 风险价值 (VaR) 是金融风险管理中使用最广泛的市场风险度量&#xff0c;也被投资组合经理等从业者用来解释未来市场风险&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 风险价值 (VaR) VaR 可以定义为资产在给…

【敏捷7.1】风险管理

风险管理 在 PMP 中&#xff0c;风险是一个重要的章节&#xff0c;并且有许多的过程&#xff0c;比如说我们要识别风险、进行定性定量分析、应对风险等&#xff0c;工具方面也有决策树、敏捷性分析等&#xff0c;最后还有一个风险应对和机会应对&#xff08;PMP认为风险和机会是…

MATLAB数学建模(二):评估股票的价值和风险

以下内容为学习笔记&#xff0c;更多的内容请访问原链接&#xff1a;https://mp.weixin.qq.com/s/fcCxFpiLMT1uFsyTFux_ig? 以下学习笔记与原链接的不同之处在于&#xff1a;对原链接内容进行了增删&#xff0c;删去了一些题外话&#xff0c;增加了对一些概念的解释&#xff0…

风险控制之VaR

什么是VaR VaR是value of risk的缩写称为风险价值&#xff0c;或者受险价值&#xff0c;指的是在一定的概率下&#xff0c;一个金融资产在未来一段时间内的最大可能损失。常用于金融机构的风险管理。它的数学定义为&#xff1a; 其中&#xff0c;的含义是金融资产在持有期的时…

拓端tecdat|R语言风险价值VaR(Value at Risk)和损失期望值ES(Expected shortfall)的估计

最近我们被要求撰写关于风险价值VaR的研究报告&#xff0c;包括一些图形和统计输出。 视频&#xff1a;风险价值VaR原理与Python蒙特卡罗Monte Carlo模拟计算投资组合实例 风险价值VaR原理与Python蒙特卡罗Monte Carlo模拟计算投资组合实例 &#xff0c;时长10:03 风险价值VaR和…

用Flink SQL流化市场数据2:盘中风险价值

本文是一个由多部分组成的系列文章的第二篇&#xff0c;该系列文章展示了FlinkSQL应用于市场数据的功能和可表达性。万一您错过了它&#xff0c;第一部分从计算流VWAP的简单情况开始。该系列的代码和数据可在github上获得。 速度在金融市场上至关重要。无论目标是最大化alpha还…

拓端tecdat|Python计算股票投资组合的风险价值(VaR)

最近我们被要求撰写关于风险价值&#xff08;VaR&#xff09;的研究报告&#xff0c;包括一些图形和统计输出。 什么是风险价值&#xff08;VaR&#xff09;&#xff1f; 风险价值&#xff08;VaR&#xff09;用于尝试量化指定时间范围内公司或投资组合中的财务风险水平。VaR提…

R语言风险价值:ARIMA,GARCH模型,Delta-normal法滚动估计,预测VaR(Value at Risk)和回测分析花旗公司股票时间序列数据

最近我们被客户要求撰写关于风险价值可视化的研究报告&#xff0c;包括一些图形和统计输出。 相关视频&#xff1a;时间序列分析&#xff1a;ARIMA GARCH模型分析股票价格数据 时间序列分析模型 ARIMA-ARCH GARCH模型分析股票价格数据 相关视频&#xff1a;在Python和R语言中建…

蒙特卡洛模拟计算风险价值VAR之R语言实现

一、解析VAR 当在分析方法中计算风险价值&#xff08;VAR&#xff09;时&#xff0c;我们需要假设金融工具的返回遵循一定的概率分布。最常用的是正态分布&#xff0c;这也是为什么我们通常称它为delta normal方法。要计算VAR&#xff0c;我们需要找到一个阈值&#xff08;T&am…

VaR - 风险价值 - 蒙特卡罗法 - Python

风险价值&#xff08;VaR&#xff09;&#xff1a;即在市场正常波动的条件下&#xff0c;在一定概率水平P%下&#xff0c;某一金融资产或金融资产组合的VaR是在未来特定一段时间Δt内最大可能损失。 现在我们使用蒙特卡罗模拟法进行风险价值的估算。简单来说&#xff0c;蒙特卡…

R语言用GARCH模型波动率建模和预测、回测风险价值 (VaR)分析股市收益率时间序列

最近我们被客户要求撰写关于GARCH的研究报告&#xff0c;包括一些图形和统计输出。 风险价值 (VaR) 风险价值 (VaR) 是金融风险管理中使用最广泛的市场风险度量&#xff0c;也被投资组合经理等从业者用来解释未来市场风险。VaR 可以定义为资产在给定时间段内以概率 θ 超过的市…

VaR风险价值-Python版本

1、VaR简介 2、VaR原理 3、不同VaR实现方法及适用场景 3.1 历史模拟法 3.1.1 使用TUSHARE读入美的复权后估计数据 隆重介绍一下TUSHARE&#xff0c; 非常好的财经数据库&#xff0c; 能获取到国内股价信息 #环境&数据准备 import sys as sy import numpy as np import…

基于蒙特卡罗模拟的股票风险价值VaR测算

基于蒙特卡罗模拟的股票风险价值VaR测算 前言&#xff1a;如果各位观看博客的想学的&#xff0c;可以通过Tushare金融数据注册链接注册账号&#xff0c;在获得相关数据集&#xff0c;这是本人的分享链接注册后&#xff0c;我可以获得50积分&#xff0c;谢谢各位支持。 摘要&…