基于JavaWeb JSP/Servlet的《留言本》初学者项目教程-从零开始
前言
本项目是一个基于JavaWeb的《留言本》项目,实现的主要功能有发布留言,回复留言,管理员登录,后台管理等等。后端主要使用的技术有:Java,Servlet,Jdbc等。前端主要使用的技术有:JSP,Html,Ajax,Lay-ui等。
这是JavaWeb课程一次作业,本人JavaWeb初学小白一个,代码封装以及界面设计方面有待改进。本程序如有漏洞欢迎各位在评论区指正,源码已上传至Git,链接在文末,有错误会及时改正。此文章我会从零开始记录实现此项目的教程,如有问题,欢迎评论区留言。
效果图
首页
发布页面
管理员登录页
后台管理
开发环境搭建
Tomcat下载
Tomcat官网:https://tomcat.apache.org/
快捷下载 Tomcat 10:
- zip (pgp, sha512)
- tar.gz (pgp, sha512)
- 32-bit Windows zip (pgp, sha512)
- 64-bit Windows zip (pgp, sha512)
- 32-bit/64-bit Windows Service Installer (pgp, sha512)
选择自己对应系统版本下载解压即可(确保路径无中文)。我这里以64-bit Windows zip为例!!!
Tomcat相关问题
一,Tomcat 启动闪退
Tomcat是基于Java环境的,所以请确保自己的电脑环境有Java环境。win+R 输入cmd
,在控制台输入Java -version
。若出现如下图所示结果即代表Java环境配置没有问题。若没有请先安装Java。
Java安装教程:https://www.runoob.com/java/java-environment-setup.html
如果安装好Java后还是闪退请继续往下看:
- 进入Tomcat的解压安装目录的bin目录下,找到
setclasspath.bat
文件
- 编辑
setclasspath.bat
文件,在24行添加Java的配置地址:set JAVA_HOME=D:\JAVA_JDK_18
这样即可运行成功,不再闪退。
二,Tomcat 控制台乱码
- 继续进入Tomcat安装目录,进入
conf
目录,找到`logging.properties`
- 编辑文件`logging.properties` ,注释51行的代码即可:
# java.util.logging.ConsoleHandler.encoding = UTF-8
创建项目
IDEA创建项目
先创建一个普通的Java项目,创建好之后右键项目添加框架支持,选中 Web应用程序,确定即可。然后项目结构中会多出一个Web目录。如下图:
IDEA配置Tomcat
点击运行旁边的编辑配置,进入调试配置界面,然后添加 +
号添加Tomcat 选择Tomcat服务器->本地
然后填写相关的配置。
然后点击配置,添加自己的项目文件,然后点击确认即可。
IDEA运行Tomcat
点击右上角的绿色三角
运行按钮即可,会自动跳转到浏览器,默认是跳转到Web目录下的index.jsp
。
MySQL数据库表设计
管理员表(admin)
CREATE TABLE `admin` (
`adminId` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
`adminUserName` varchar(25) NOT NULL COMMENT '管理员账号',
`adminPassword` varchar(255) DEFAULT NULL COMMENT '管理员密码',
`is_valid` int DEFAULT NULL COMMENT '是否有效(1为有效/0为无效)',
PRIMARY KEY (`adminId`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
用户表(user)
CREATE TABLE `user` (
`userId` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
`nickname` varchar(50) DEFAULT NULL COMMENT '昵称',
`qq` varchar(255) DEFAULT NULL COMMENT 'QQ',
`email` varchar(255) DEFAULT NULL COMMENT '邮箱',
`content` longtext COMMENT '留言内容',
`datetime` datetime DEFAULT NULL COMMENT '留言日期',
`replyContent` longtext COMMENT '回复内容',
`replyDateTime` datetime DEFAULT NULL COMMENT '回复时间',
PRIMARY KEY (`userId`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
SQL文件下载
SQL文件下载地址:https://git.landaiqing.space/Qing/GuestBook/src/branch/master/sql/webguestbook.sql
项目数据库连接配置
修改config.properties
里面的数据库名称
和用户名
,密码
即可。
代码编写

问题
一,启动报错(servlet映射中的<url pattern>[xxx]无效
)
1-Jun-2023 01:05:53.744 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke 调用方法[manageApp]时发生异常
java.lang.IllegalStateException: 启动子级时出错
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:686)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:658)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:713)
at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1821)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:577)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:294)
at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:811)
at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:428)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:376)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:577)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:294)
at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:811)
at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802)
at java.management/com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:472)
at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1472)
at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1310)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1412)
at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:577)
at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360)
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:598)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:844)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:721)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:720)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: org.apache.catalina.LifecycleException: 无法启动组件[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/Guestbook_war_exploded]]
at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:683)
... 36 more
Caused by: java.lang.IllegalArgumentException: servlet映射中的<url pattern>[openAdmin]无效
at org.apache.catalina.core.StandardContext.addServletMappingDecoded(StandardContext.java:3067)
at org.apache.catalina.Context.addServletMappingDecoded(Context.java:905)
at org.apache.catalina.startup.ContextConfig.configureContext(ContextConfig.java:1563)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1330)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:987)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:304)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4798)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
... 37 more
11-Jun-2023 01:05:53.746 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke 调用方法[createStandardContext]时发生异常
javax.management.RuntimeOperationsException: 调用方法[manageApp]时发生异常
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:304)
at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:811)
at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:428)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:376)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:577)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:294)
at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:811)
at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802)
at java.management/com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:472)
at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1472)
at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1310)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1412)
at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:577)
at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360)
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:598)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:844)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:721)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:720)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.IllegalStateException: 启动子级时出错
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:686)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:658)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:713)
at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1821)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:577)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:294)
... 30 more
Caused by: org.apache.catalina.LifecycleException: 无法启动组件[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/Guestbook_war_exploded]]
at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:683)
... 36 more
Caused by: java.lang.IllegalArgumentException: servlet映射中的<url pattern>[openAdmin]无效
at org.apache.catalina.core.StandardContext.addServletMappingDecoded(StandardContext.java:3067)
at org.apache.catalina.Context.addServletMappingDecoded(Context.java:905)
at org.apache.catalina.startup.ContextConfig.configureContext(ContextConfig.java:1563)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1330)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:987)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:304)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4798)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
... 37 more
解决办法:
通过报错信息可以看出,是url的问题,查看Servlet中注解中的url是否填写正确:@WebServlet("/xxx")
注意 :注解中的url一定要加上一个反斜杠/,不加就会报以上的错误。
二,关于jsp页面引入外部js或css无效
CSS
对于css 的引用,不能使用传统的<link>
方式:
<link rel="stylesheet" href="./static/css/index.css" type="text/css">
<style type="text/css">
@IMPORT url("./static/css/index.css");
</style>
JS
对于JS代码,我至今没找到jsp怎么引入外部JS文件,传统方法引入都无效。
IDEA导入项目配置
先配置JDK
克隆此项目后,右键项目,点击打开模块设置
,在里面设置JDK版本。
依赖包配置
将项目目录libs
文件下面的依赖包
都复制一份到Tomcat安装目录下面的lib
目录下面。
数据库配置
代码文件下载
Git下载地址:

