基于JavaWeb JSP/Servlet的《留言本》初学者项目教程-从零开始

前言

本项目是一个基于JavaWeb的《留言本》项目,实现的主要功能发布留言,回复留言,管理员登录后台管理等等。后端主要使用的技术有:Java,Servlet,Jdbc等。前端主要使用的技术有:JSP,Html,Ajax,Lay-ui等。

这是JavaWeb课程一次作业,本人JavaWeb初学小白一个,代码封装以及界面设计方面有待改进。本程序如有漏洞欢迎各位在评论区指正,源码已上传至Git,链接在文末,有错误会及时改正。此文章我会从零开始记录实现此项目的教程,如有问题,欢迎评论区留言。

效果图

点击展开查看效果图

首页

发布页面

管理员登录页

后台管理

开发环境搭建

点击展开查看开发环境搭建

Tomcat下载

Tomcat官网:https://tomcat.apache.org/

快捷下载 Tomcat 10:

选择自己对应系统版本下载解压即可(确保路径无中文)。我这里以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下载地址:

扫描二维码关注微信,回复密码,即可获取密码
扫描二维码关注微信,回复密码,即可获取密码
THE END