简介:基于Java语言与HTML5前端技术开发的绿色环保资讯类网站完整项目源码,面向高校毕业设计、课程设计及从事Java Web开发的初学者。项目按管理员与普通用户双角色设计,管理员可登录注册并维护环保资讯、培训信息及普通用户资料,普通用户支持个人基本信息管理、浏览环保资讯、课堂、活动与科普内容,并能对课堂知识发表评论,功能覆盖信息展示、后台管理与前后端交互。资源包共2000个文件,以849个PNG图片、311个JS脚本、240个CSS样式、146个Java类、103个JSP页面和136个XML配置为主,另含SQL数据库脚本、演示资源与多类型前端素材,压缩包整体37.32MB,模块分类清晰,便于本地部署运行。当前已有147位学习者浏览关注。通过这套源码,读者可获得完整的前后端实现代码、页面设计素材、数据库建表脚本和功能演示内容,能直观理解环保信息类网站的业务流程与开发方法,也适合作为毕业设计或课程设计的参考模板。
1. 基于Java+HTML5绿色环保网站:从零搭一个能演示的完整项目
如果你是一个刚学完Java基础、准备找实习的在校生,或者是一个需要快速交付课设/毕设的开发者,肯定遇到过这种尴尬:后端用Servlet还是Spring Boot拿不准,前端想用HTML5新特性又怕浏览器不兼容,最后做出来的网站要么像2008年的后台管理系统,要么前后端完全割裂——前端静态页面能打开,一接后端就报404。这篇文章要聊的「基于Java+HTML5绿色环保网站」,就是一套我能直接给你讲清楚设计思路、能照着敲代码跑起来、还能录成演示视频交差的完整方案。它不是什么高深架构,但足够覆盖「Java后端 + HTML5前端 + 数据库 + 部署演示」这条完整链路。我会从技术选型、具体实现、参数配置到避坑经验,按我自己做这类项目的顺序讲,全程给可复现的代码和命令。
先说结论:这类网站最适合的技术组合不是Spring Boot全家桶,而是轻量级的Java Servlet + JSP + MySQL,前端用HTML5的语义化标签、表单验证、Canvas和本地存储。原因很简单——课设和毕设的评审老师看的是「你懂不懂原理」,Spring Boot封裝太多东西,反而容易被问住。但我会把两种方案都讲清楚,你按自己的场景选。另外,我会在演示环节给出一套「不用买服务器也能在线演示」的做法,这是很多人最容易卡住的地方。
2. 技术选型为什么不选Spring Boot全家桶:轻量方案与重型方案的分界线
2.1 Java后端:Servlet + JSP vs Spring Boot,各自的适用边界
做绿色环保网站这类业务逻辑不复杂的项目(新闻发布、环保知识展示、用户留言、数据统计大屏),我一般会先画一张业务流程图:用户登录注册、浏览环保资讯、提交环保建议、管理员后台管理内容。如果业务就这些,Servlet + JSP完全够用,而且部署简单——打一个WAR包丢进Tomcat就能跑。Spring Boot的优势在自动配置和微服务生态,但单体小项目用不上,反而引入大量依赖后打包体积变大,在老机器上演示起来更卡。
如果选Servlet路线,核心类就三个:一个HttpServlet子类处理请求,一个Service类写业务逻辑,一个DAO类操作数据库。用web.xml或注解配置映射路径。参数传递靠HttpServletRequest的getParameter(),返回页面用request.getRequestDispatcher().forward()。这套东西看着原始,但每个环节都透明,调试时你能清楚地知道请求走到了哪一步——这对答辩演示特别重要,老师问「用户点登录之后发生了什么」,你能从浏览器到Servlet到数据库一条线讲清楚。
如果项目要求用Spring Boot,我建议保持分层不变,只把Servlet换成@RestController,其余业务代码全部复用。有个细节:Spring Boot的spring-boot-starter-web内嵌了Tomcat,打包成JAR后java -jar就能跑,但数据库连接池默认用的是HikariCP,连接超时时间默认30秒,如果服务器性能差,首次查询可能超时,建议在application.properties里调大:
spring.datasource.hikari.connection-timeout=60000 spring.datasource.hikari.maximum-pool-size=10 spring.datasource.hikari.idle-timeout=300000这段配置的前两个参数解决「慢机器上第一次查库报连接超时」的问题,第三个参数控制空闲连接回收时间。我见过不止一次没配这些参数、演示现场等着连数据库等半分钟的情况。
2.2 HTML5前端:语义化标签、表单验证和Canvas绘图如何服务于环保主题
HTML5在这个项目里不是装饰,它有三个实际用途。第一是语义化标签<header>、<nav>、<main>、<section>、<article>、<footer>——让评审老师一眼看出页面结构清晰,也方便搜索引擎抓取,这对「绿色环保网站」这种内容型站点是加分项。第二是表单原生验证属性required、pattern、type="email",比如用户提交环保建议时,前端先拦掉空内容和非法邮箱,不用等请求打到后端再返回错误。第三是<canvas>画统计图表——环保网站通常要在首页展示空气质量指数、垃圾回收率这类数据,用Canvas画柱状图比引用ECharts更轻,也更能展示你对HTML5的掌握程度。
前端和后端的交互方式,我推荐用Fetch API + JSON,而不是传统表单提交。原因在于:JSON交互让后端只返回数据,页面跳转由前端JS控制,这样在演示时可以单独测试接口——打开浏览器地址栏直接访问/api/news/list,看到JSON数组就说明后端通了,不用点页面按钮去猜哪里断了。另外,把页面切到手机宽度时,HTML5的<meta name="viewport">和CSS Media Query能保证网站在手机上不变形,很多评审老师会顺手开手机浏览器扫码看你的演示。
2.3 数据库设计:环保类站点的核心表结构和字段参数
不管后端选哪套,数据库表我建议控制在五张以内:用户表user、资讯表news、建议表suggestion、环保项目表project、管理员表admin。五张表覆盖了「前台浏览+用户互动+后台管理」的完整闭环,又不至于让建表脚本显得臃肿。
user表的字段这样定:id自增主键、username唯一索引、password存MD5或BCrypt哈希、email、create_time。为什么不存明文密码?因为答辩时老师很可能问「用户密码怎么存的」,你回答「哈希加密存储」比回答「直接存数据库」得分高一个档次。suggestion表比较关键,字段包括id、user_id外键、title、content、status——status用TINYINT,0待处理1已采纳,这个字段在后台管理页面会用来做筛选。
建表脚本要加字符集设置,否则插入中文数据会乱码:
CREATE TABLE `user` ( `id` INT NOT NULL AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL, `password` VARCHAR(100) NOT NULL, `email` VARCHAR(100) DEFAULT NULL, `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;这里的utf8mb4是重点——MySQL的utf8其实不是真正的UTF-8,它存不了emoji和一些生僻字,一旦用户输入内容里带了个emoji,整条插入语句直接报错。utf8mb4是完整的UTF-8实现,能存四字节字符。ENGINE=InnoDB保证事务支持,如果后面你想加一个「环保项目认捐」功能,需要同时扣减用户积分和更新项目进度,事务就是必须的了。
3. 搭建绿色环保网站核心功能:后端接口、前端页面与交互实现
3.1 环境准备与项目目录结构
开始写代码之前,先把环境对齐。JDK用1.8或11都行,Tomcat用9.x,MySQL用5.7或8.0,IDE随意但建议用IDEA社区版。开发时用Maven管理依赖,总比手动拷JAR包干净。这里说的方案是Servlet + JSP,适合课设和毕设场景;如果你有一个现成的Spring Boot工程,调整的地方也不多。
一个标准的Maven项目结构长这样:
green-website/ ├── pom.xml ├── src/main/java/com/green/ │ ├── servlet/ # 控制器层 │ ├── service/ # 业务逻辑层 │ ├── dao/ # 数据库访问层 │ ├── entity/ # 实体类 │ └── util/ # 工具类 ├── src/main/resources/ │ └── db.properties # 数据库配置 └── src/main/webapp/ ├── index.html # 首页 ├── css/ # 样式文件 ├── js/ # 前端脚本 └── WEB-INF/web.xmlpom.xml只引入Servlet API、MySQL驱动和连接池,三样就够。连接池用的是Druid,阿里的,有监控页面,演示时可以直接展示SQL执行次数和慢查询统计,这比连接池本身更能打动评审老师。Druid的统计页面不用额外开发,配置好StatViewServlet后访问/druid/index.html就能看到,很多评委没见过这个,一打开就是加分项。
3.2 后端Servlet接口实现:以「获取环保资讯列表」为例
接口设计遵循一个朴素原则:URL用名词而不是动词,/api/news/list表示获取资讯列表,/api/news/detail?id=1表示获取详情。这个习惯是从REST风格里学来的,不强制完全RESTful,但至少URL能让人猜出意思。下面这个Servlet实现了资讯列表的JSON输出:
@WebServlet("/api/news/list") public class NewsListServlet extends HttpServlet { private NewsService newsService = new NewsService(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置响应类型为JSON,编码UTF-8防止中文乱码 resp.setContentType("application/json;charset=UTF-8"); // 允许前端跨域调用,开发时用不同端口跑前后端很常见 resp.setHeader("Access-Control-Allow-Origin", "*"); List<News> newsList = newsService.queryLatestNews(10); // 手动组装JSON,避免引入额外依赖库 StringBuilder json = new StringBuilder(); json.append("{\"code\":0,\"data\":["); for (int i = 0; i < newsList.size(); i++) { News n = newsList.get(i); if (i > 0) json.append(","); json.append("{\"id\":").append(n.getId()) .append(",\"title\":\"").append(n.getTitle()) .append("\",\"summary\":\"").append(n.getSummary()) .append("\"}"); } json.append("]}"); resp.getWriter().write(json.toString()); } }这段代码的逻辑是:浏览器请求/api/news/list,容器调用doGet方法,方法里先声明返回类型是JSON,再调用newsService.queryLatestNews(10)拿到最新十条资讯,最后手动拼JSON字符串写回响应。手动拼JSON有两个原因:一是这个项目只有几个接口,引入Jackson会多一层封装,对理解原理反而不利;二是手动拼能锻炼你处理字符串转义的能力——注意title字段里的"和\没做转义,真实项目里需要用StringEscapeUtils或JSON库处理,这里为了展示简化了。
参数说明:@WebServlet注解的urlPatterns默认就是/api/news/list,不需要在web.xml里重复配置(Servlet 3.0+才支持这个特性,Tomcat 7以上就是3.0了)。queryLatestNews(10)里的10是「最新资讯条数」,页面底部「加载更多」功能可以改参数。
3.3 前端HTML5页面实现:表单验证与Fetch请求
前端页面我做了三个:index.html首页、news.html资讯列表页、suggest.html建议提交页。suggest.html最能体现HTML5表单特性,我完整贴出来:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>提交环保建议</title> <link rel="stylesheet" href="css/style.css"> </head> <body> <header> <nav> <a href="index.html">首页</a> <a href="news.html">环保资讯</a> <a href="suggest.html" class="active">提交建议</a> </nav> </header> <main> <section> <h1>你的环保建议</h1> <!-- required和pattern都是HTML5原生表单验证属性 --> <form id="suggestForm"> <div> <label>标题</label> <input type="text" name="title" id="title" required minlength="4" maxlength="30" placeholder="用一句话概括你的建议"> </div> <div> <label>内容</label> <textarea name="content" id="content" rows="6" required minlength="10"></textarea> </div> <div> <label>联系方式</label> <input type="email" name="email" id="email" placeholder="选填,便于我们回复你"> </div> <button type="submit">提交建议</button> </form> </section> </main> <script> document.getElementById('suggestForm') .addEventListener('submit', async function (e) { // 阻止表单默认提交行为,改用fetch发送JSON e.preventDefault(); const formData = { title: document.getElementById('title').value, content: document.getElementById('content').value, email: document.getElementById('email').value }; try { const resp = await fetch('/api/suggestion/add', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(formData) }); const result = await resp.json(); if (result.code === 0) { alert('提交成功,感谢你的环保建议!'); this.reset(); } else { alert('提交失败:' + result.msg); } } catch (err) { alert('网络异常,请稍后重试'); } }); </script> </body> </html>这段前端代码利用了三个HTML5核心能力:required和minlength让浏览器在用户提交空表单时直接拦截并给出气泡提示,不发请求到后端——这在答辩演示时很直观,你点一下「提交建议」按钮但什么都不填,浏览器会自己弹「请填写此字段」,不用写一行JS校验代码。type="email"还会校验邮箱格式,用户可以偷懒不填联系方式,但如果填了就必须是合法的邮箱地址。Fetch API的async/await写法代替了老旧的XMLHttpRequest,简洁也更好讲原理。
3.4 数据库交互:DAO层与Druid连接池配置
DAO层是后端代码里最容易被写砸的部分。很多人把SQL语句直接写在Servlet里,表面省事,但一旦字段变了要改SQL,所有Servlet都得动。分层以后,改SQL只动DAO,Servlet不用碰,这算一个基本修养。
public class NewsDao { private static DruidDataSource dataSource; static { // 初始化连接池,参数从db.properties读取更规范 dataSource = new DruidDataSource(); dataSource.setUrl("jdbc:mysql://localhost:3306/green_db?useSSL=false&serverTimezone=Asia/Shanghai"); dataSource.setUsername("root"); dataSource.setPassword("123456"); dataSource.setInitialSize(3); dataSource.setMaxActive(10); dataSource.setMaxWait(3000); } public List<News> queryLatest(int limit) { List<News> list = new ArrayList<>(); String sql = "SELECT id, title, summary, create_time FROM news ORDER BY create_time DESC LIMIT ?"; // try-with-resources自动关闭连接 try (Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setInt(1, limit); try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { News n = new News(); n.setId(rs.getInt("id")); n.setTitle(rs.getString("title")); n.setSummary(rs.getString("summary")); n.setCreateTime(rs.getTimestamp("create_time")); list.add(n); } } } catch (SQLException e) { e.printStackTrace(); } return list; } }这段代码里最容易忽略的是useSSL=false&serverTimezone=Asia/Shanghai这段参数。MySQL 8.x默认时区是UTC,如果你不指定serverTimezone,连接时会直接报错先给你看一个英文异常。useSSL=false解决的是MySQL 8.x在你本机没配SSL证书时报的警告,不影响运行但很吵。LIMIT ?用了占位符,防止SQL注入——这条要主动讲,因为「你懂不懂防SQL注入」几乎是Java面试题里必问的一道题。
参数说明:setInitialSize(3)表示连接池启动时创建3个连接备用;setMaxActive(10)表示同时最多10个连接,超过后请求排队;setMaxWait(3000)是拿连接的最大等待时间,超过就抛异常。这三个参数在Druid监控页里能看到实时值,演示时切到监控页,能看到连接数在3到10之间波动,这是个有说服力的画面。
4. 把项目跑起来:从本地Tomcat到在线演示部署
4.1 本地Tomcat部署的最小步骤与检查项
本地跑通是第一步,这一步卡住的话后面全白搭。如果你用的是IDEA,从菜单栏选Run → Edit Configurations → 添加Tomcat Server → Local → 选Deployment标签 → 点加号把项目打成war exploded格式。这样做的意义是支持热部署——改完Java代码不用重启Tomcat,重新编译后刷新页面就行,开发体验跟Spring Boot的devtools差不多。
还有一条更直接的命令行路线,适合想搞清楚原理的人:
# 在项目根目录执行,跳过测试减少打包时间 mvn clean package -DskipTests # 把打好的war包复制到Tomcat的webapps目录 cp target/green-website.war /opt/tomcat9/webapps/ # 启动Tomcat(不要用catalina.sh run,后台运行更稳) /opt/tomcat9/bin/startup.sh # 查看日志确认没有异常 tail -f /opt/tomcat9/logs/catalina.out启动后浏览器访问http://localhost:8080/green-website/,看到网站首页就说明WAR包部署成功。这里有个容易翻车的点:webapps目录下如果已经有同名旧包,Tomcat启动时会自动把WAR解压覆盖,但旧的解压目录可能残留,导致你改了代码却不生效。解决方法是先手动删掉webapps/green-website/整个目录,再重新拷贝WAR包。
4.2 在线演示:没有云服务器也能展示的三个方案
很多人做完项目才发现答辩要现场演示,但自己的电脑连不上实验室WiFi,或者学校外网访问不了内网。这时有几个常用方案。第一个方案是用局域网穿透工具,比如向日葵的远程桌面或者Tailscale组虚拟局域网,让评审老师用他的电脑直接访问你笔记本上跑的Tomcat。这个方案最接近真实部署,缺点是需要双方的客户端配合。第二个方案是买一台最便宜的云服务器,轻量应用服务器就行,把WAR包丢上去跑,域名都不用买,直接用公网IP加端口访问。安全组记得放行8080端口,不然外部访问不了。第三个方案是记录一段演示视频,把核心功能操作一遍,作为备用方案。
我一般在答辩前会同时准备方案二和方案三:云服务器一旦临时挂了(比如安全组配置错误、Tomcat内存溢出),立刻切换到录好的视频。不要只依赖一个方案,现场出问题的概率远比你想象的高。
4.3 云服务器部署的参数调整:内存、数据库和防火墙
云服务器通常只有1G或2G内存,跟本机动辄16G没法比。Tomcat默认的JVM参数需要改,在bin/catalina.sh或bin/setenv.sh里加一行:
JAVA_OPTS="-Xms256m -Xmx512m -XX:MaxMetaspaceSize=256m"-Xms256m是JVM启动时申请的最小堆内存,-Xmx512m是最大堆内存,MaxMetaspaceSize限制类元数据空间。很多人在1G内存的服务器上部署默认Tomcat,结果系统换内存频繁,页面加载极慢。还有MySQL如果也装在同一个机器上,innodb_buffer_pool_size建议调成128M,默认的128M对小型站点够用,但如果有排序和分组查询占内存,可以微调。
数据库连接串的地址也要改,从localhost改成云服务器的内网IP或直接保持localhost(如果MySQL和Tomcat装在同一个服务器上,localhost反而更快,因为它走了Unix socket而不是TCP端口)。如果你用的是云数据库,那就必须用外网地址加端口,云厂商的安全组和数据库白名单两个地方都要放行。
5. 这套绿色环保网站最常见的6个坑:现象、原因、解决办法
5.1 表单提交的中文乱码:从页面到数据库全链路排查
现象:前端表单填好中文点提交,存入数据库后查出来全是??,或者接口返回的JSON里中文变成了ä½ å¥½这种鬼样子。
原因有两个层面。第一层是请求和响应编码问题——Servlet默认用ISO-8859-1编码,不是UTF-8。第二层是数据库连接串没指定字符集,MySQL连接时用了latin1。还有第三层是页面本身的charset没写对。
解决:给Servlet加一个过滤器统一设置编码,另外在上述数据库连接串末尾加&characterEncoding=utf8。有了字符集过滤器,所有Servlet都不需要单独处理编码,这是标准做法:
@WebFilter("/*") public class EncodingFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); chain.doFilter(req, resp); } }这段代码是「官方最佳实践」级别的工具——req.setCharacterEncoding必须在读取任何参数之前调用,否则无效。@WebFilter("/*")拦截所有请求,一次性搞定。
5.2 本地能访问,局域网其他人访问不了
现象:自己电脑浏览器打开http://localhost:8080一切正常,让同学用手机或另一台电脑访问http://你的IP:8080,打不开或者加载超时。
原因排查顺序:第一,Windows防火墙没放行8080端口。第二,Tomcat的server.xml里Host配置绑定了localhost而非0.0.0.0。第三,同一WiFi下路由器开启了AP隔离,设备间无法互相访问。
解决办法:先用ipconfig查本机局域网IP,然后确认Tomcat的conf/server.xml里Connector标签的address属性没写,默认监听所有网卡。再在Windows防火墙高级设置里添加入站规则允许8080端口。如果还不行,把路由器管理页面里「AP隔离」或「无线隔离」关掉。这里有个判断技巧:在同学电脑上ping你的IP,能通说明网络层OK,不通就是隔离或防火墙问题。
5.3 Druid连接池启动报错:配置文件里的坑
现象:Tomcat启动时日志刷一排Failed to init DruidDataSource,异常指向com.mysql.cj.jdbc.Driver找不到。
原因一般是pom.xml里没引MySQL驱动依赖,或者引了但scope是provided导致运行时没打进WAR。这个错误最坑的是——编译阶段不报错(因为IDEA能识别依赖),打包部署后才暴露。
解决:确认pom.xml里依赖的scope是runtime或compile。同时检查db.properties里的驱动类名:MySQL 5.x是com.mysql.jdbc.Driver,MySQL 8.x是com.mysql.cj.jdbc.Driver,混用会报ClassNotFoundException。用8.x版本驱动连接5.x数据库没问题,但反过来不行。
5.4 HTML5表单的pattern属性与大写字母的冲突
现象:用户输入合法的邮箱,但表单提示格式错误。
原因:type="email"本身就能校验邮箱格式,如果你又加了pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}",而用户邮箱里有大写字母(如ZhangSan@163.com),正则里没写i修饰符,HTML5的pattern默认区分大小写,就误判了。
解决:要么去掉pattern只保留type="email",要么在正则里加上大写范围。另外一个贴士:pattern校验的是「整个值」而不是「子串」,所以写正则时尽量用^和$框定。
5.5 数据库连接串里的时间戳报错:serverTimezone
现象:本地连MySQL 8.x报错The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized。
原因:MySQL 8.x安装时默认时区是UTC或未设置,JDBC驱动和MySQL协商时发现时区不匹配。这个报错信息里中文会乱码,看上去像编码问题,很容易让人误判方向。
解决:连接串加serverTimezone=Asia/Shanghai。如果用的连接池是Druid,还要在Druid的配置里加上connectionInitSqls——有些云数据库会主动断空闲时间过长的连接,导致连接池里的连接失效后被拿来用,直接抛异常。加一行setConnectionInitSqls(Arrays.asList("SELECT 1"))可以在每次取连接时校验连接是否存活。
5.6 演示时刷新404:HTML5的History路由模式
现象:当前在news.html页面,点浏览器刷新变成404。
原因:如果你在后端配了/news这样的路径映射,页面是HTML5的history.pushState改的URL,刷新时浏览器直接请求/news,但服务端没这个路由,就返回Tomcat的404页面。
解决:如果只是简单网站,建议用<a>标签跳转而不是pushState,避免这个坑。如果确实要用History路由,Tomcat的web.xml里配一个<error-page>对404做转发,但这属于「掩饰」而非解决,不如老老实实用多页面。
6. 环保网站的进阶验证:搜索引擎优化、性能调优和答辩话术准备
项目做到能跑只是及格线,想拿高分要在验证环节下功夫。这一章讲三个进阶点,都是我能直接给出做法和参数的那种。
第一个是页面加载性能验证。用Chrome的DevTools里的Network面板看首页的请求数、资源体积和加载时间。要做好三个优化:一是图片用loading="lazy"懒加载,环保网站必然有大量风景图片,这个HTML5属性让图片滚动到视口时才加载,能显著降低首屏时间。二是静态资源开启Gzip压缩——Tomcat的server.xml里Connector加compression="on" compressionMinSize="2048",小于2KB的文件不压缩,压缩后CSS和JS的体积能减到原来的三分之一甚至更少。三是把公共CSS和JS放/static目录并设置浏览器缓存。验证指标定一个具体值:首屏时间本地要低于2秒,云服务器不能高于3秒。
第二个是站点内容在搜索引擎的可见性验证。加入<meta name="description">描述页面核心内容,<meta name="keywords">选三到五个跟页面相关的词。给<article>标签里的标题用<h1>到<h3>层级。最重要的一个细节是语义化标签:用<nav>包导航,用<footer>包版权信息,这些是搜索引擎判断页面结构的重要信号。验证方式是打开浏览器的「无痕模式」搜网站标题,或直接检查搜索结果页有没有展示你写的description。
第三是答辩演示的检查清单。我每次做这类项目,会提前把下面这几项过一遍:①从浏览器无痕模式开始演示,排除用户登录态干扰。②先访问一个不存在的路径(如/api/news/xx),展示后端返回的JSON错误信息,证明不是简单的前端假动作。③杀掉MySQL进程再操作一次,展示错误提示,再恢复MySQL正常操作——这个「故障演练」式展示非常加分,评委看到你有容错意识。④准备三个问题答案:为什么选Java不选Python?HTML5相对HTML4新增了哪些能力?数据库连接池解决了什么问题?这三个问题几乎是必问,因为你的页面标题已经告诉评委「这是Java+HTML5」,人家肯定会顺着往下问。
最后一个我自己的习惯:做完项目把数据库导出SQL脚本,连同项目代码一起打压缩包,命名带上日期。不是因为课设要交,而是因为三个月后你自己回头看这段代码,没有这个脚本你会连数据库表结构都回忆不起来。这个习惯帮我免过好几次「返工」,也希望帮到你。
本文还有配套的精品资源,点击获取