Web 技术 - 大作业-Web系统开发

写在前面

妈的退役完写完课设就开始搞这个 b 东西,度过了行动力超强的两周然后开始期末考试然后直接给我榨干了。

生成式人工智能实在太给力了妈的,实验报告中基本所有图都是 AI 生成的,直接写个脚本把代码导入到一个 word 里,然后把 word 丢给 AI 读想生成啥生成啥太爽了我去。

github 项目:https://github.com/Luckyblock233/MomoBlog-Web

第一章 实践任务描述

(一)问题描述

设计一个前后端交互web系统,前端内容可选如下:

  1. 完善第一次实验中三个主题页面之一
  2. 独立开发其他个人主页/博客/旅游景点介绍/电子商务网站

具体设计要求如下:

  1. 开发对应的后台系统,实现登录界面,至少包含账号、密码、验证码;网站前端和后端需要实现联动,实现菜单栏动态效果、轮播图、新闻等动态内容的增、删、查、改功能;需具备文件上传功能,例如新闻图片、轮播图片等(语言不限,但不能使用三方框架)。
  2. 采用同步和异步前后端交互方式(用JSON格式),包括表单提交、AJAX等。
  3. 设计数据库,使用JDBC(或者其他后端技术)连接数据库,数据库类型不限,不能使用各类高级后端框架;
  4. 熟练使用Session和Cookie,在此基础上实现登录验证和持久登录等功能。
  5. 对服务端错误、http错误码、异常、验证错误等情况能设置友好的用户提示。

(二)实验环境

  • IDE:IntelliJ IDEA 2024.1.1 (Ultimate Edition)
  • 数据库:MySQL
  • Windows 11 10.0.22631 版本 22631
  • java version 22.0.1 2024-04-16

第二章 项目文件结构及功能

image.png

第三章 页面效果展示

(一)登录注册

image.png image.png

(二)用户首页

image.png image.png

(三)管理员首页

image.png image.png

第四章 页面逻辑图

(一)index.jsp

image.png

(二)register.jsp

image.png

(三)home.html

image.png

(四)admin.html

image.png

第五章 核心技术点

(一)CSS 选择器及优先级

image.png

(二) 图形验证码的生成与验证

随机生成4位数字验证码,将其绘制在背景为浅灰色的图片上,并通过随机噪点增加验证码的复杂性。

生成的验证码内容会存储到用户的会话中,设置有效期为60秒,同时通过响应头禁止缓存,确保验证码实时刷新。最后,将验证码图片以JPEG格式输出到客户端,以便用户验证。核心代码示例如下:

    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    Graphics g = image.getGraphics();
    try {
        // 背景色
        g.setColor(new Color(220, 220, 220));
        g.fillRect(0, 0, width, height);
        // 生成验证码
        Random random = new Random();
        StringBuilder codeBuilder = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            codeBuilder.append(random.nextInt(10));
        }
        String captchaCode = codeBuilder.toString();
        // 存储到会话
        HttpSession session = request.getSession(true);
        session.setAttribute("captchaCode", captchaCode);
        session.setMaxInactiveInterval(60);
        // 绘制验证码
        g.setColor(Color.BLACK);
        g.setFont(new Font("Arial", Font.BOLD, 18));
        g.drawString(captchaCode, 10, 22);
        // 添加噪点
        g.setColor(new Color(150, 150, 150));
        for (int i = 0; i < 100; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            g.drawOval(x, y, 1, 1);
        }
        // 输出图片
        ImageIO.write(image, "JPEG", response.getOutputStream());

(三)Cookie与Session实现持久化登录

通过 LoginServlet 处理用户登录请求,主要功能包括:

  1. 验证用户输入的验证码是否正确,防止恶意登录。
  2. 使用 UserDao 验证用户名和密码的正确性,并从数据库中检索用户信息。
  3. 成功登录后,将用户的 ID 和用户名存储到会话中,并设置会话有效期。
  4. 如果用户选择“记住我”功能,则生成一个唯一的会话令牌(sessionToken),存储到数据库中,同时通过 Cookie 将令牌发送给客户端,实现持久化登录。
  5. 对于失败的情况(如验证码或用户名密码错误),将用户重定向回登录页面并提示错误信息。
// 验证码校验
        if (captchaCode == null || !request.getParameter("nowCaptchaCode").equals(captchaCode)) {
            response.sendRedirect(request.getContextPath() + "/index.jsp?error=" +
                URLEncoder.encode("验证码错误", StandardCharsets.UTF_8));
            return;
        }

        // 验证用户
        UserDao userDao = new UserDao();
        try {
            if (userDao.SearchUser(request.getParameter("nowUsername"), request.getParameter("nowPassword"))) {
                Optional<User> user = userDao.findByUsername(request.getParameter("nowUsername"));
                int userId = user.get().getId();

                // 设置会话
                httpSession.setAttribute("userId", userId);
                httpSession.setAttribute("username", user.get().getUsername());
                httpSession.setMaxInactiveInterval(30 * 60);

                // 记住我功能
                if (request.getParameter("keep") != null) {
                    String sessionToken = UUID.randomUUID().toString();
                    new SessionDao().insertSession(userId, sessionToken);

                    Cookie cookie = new Cookie("sessionToken", sessionToken);
                    cookie.setMaxAge(2 * 7 * 24 * 60 * 60);
                    cookie.setHttpOnly(true);
                    response.addCookie(cookie);
                }

                // 登录成功
                response.sendRedirect("protected/home.html");
            } else {
                response.sendRedirect(request.getContextPath() + "/index.jsp?error=" +
                    URLEncoder.encode("用户名或密码错误", StandardCharsets.UTF_8));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

(四)轮播图 JS 实现

通过多张图片平铺,用 overflow:hidden 只显示一张图片、其他的隐藏,无缝滚动用定时器,改变元素的 left 值让图片呈现左右滚动的效果。

在CSS中,通过 .slide-container 定义固定宽度的容器并隐藏溢出内容,.slide-list 使用 flex 布局排列图片并通过 transition 实现平滑切换,.slide-item 设置与容器相同的宽度保证每次显示一张图片,同时 .slide-container img 使用固定尺寸和 object-fit: cover 裁剪图片以保持比例和清晰度。

image.png
.slide-container {
    width: 800px;
    overflow: hidden;
    border: 1px solid #ccc;
    position: relative;
    margin: auto;
}

.slide-list {
    display: flex;
    transition: transform 0.5s ease-in-out;
}

.slide-item {
    width: 800px;
}

.slide-container img {
    width: 800px;
    height: 600px;
    object-fit: cover;
}

(五)JDBC数据库操作

JDBC(Java Database Connectivity) 是 Java 提供的标准数据库访问接口,用于在 Java 应用程序中与关系型数据库进行交互。它通过一组 API 提供了统一的方式,使开发者能够连接数据库、执行 SQL 查询、更新数据,并处理结果集。JDBC 工作流程如下:

  1. 加载驱动程序:
Class.forName("com.mysql.cj.jdbc.Driver");
  1. 建立连接:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_name", "user", "password");
  1. 创建语句对象:
Statement statement = connection.createStatement();
  1. 执行sql查询:
ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
  1. 处理结果集:
while (resultSet.next()) {
  System.out.println(resultSet.getString("name"));
}
  1. 关闭资源:
resultSet.close();
statement.close();
connection.close();

第六章 心得体会

本次实验以开发一个基于前后端交互的 Web 系统为目标,通过综合运用 JSP、Servlet、JDBC、CSS、JavaScript 等技术,实现了包括用户登录注册、验证码验证、持久化登录、轮播图展示、数据库操作等功能模块的完整开发过程。在实验过程中,我对 Web 开发的全栈技术有了更深入的理解,同时也积累了丰富的实践经验。

(一)收获

本次实验让我从以下几个方面收获颇丰:

  1. 技术积累:系统学习并实践了 Web 开发的核心技术,包括 JSP、Servlet、JDBC、AJAX 等,深入理解了从数据库到前端的完整开发流程。
  2. 项目管理能力:通过模块化开发和任务分解,明确了项目开发的优先级和时间分配,提升了项目管理意识。
  3. 代码质量:实验中注重了代码的可读性和安全性,使用注释和异常处理机制优化了代码质量。

(二)遇到的问题与解决方案

在实验过程中,我遇到了各种各样的问题,这些问题不仅考验了我的技术能力,也锻炼了我的解决问题的能力和耐心。

  1. 验证码的显示问题
    生成图形验证码时无法正常显示。仔细检查代码和查阅相关资料后,发现是由于响应头的设置不正确导致的,导致浏览器无法识别验证码图片的格式。
  2. 数据库连接异常
    在进行 JDBC 数据库连接时,报错信息提示 “SQLException: No suitable driver found”。随后发现是由于没有正确加载 MySQL 驱动程序导致的。
  3. 轮播图的无缝滚动问题
    图片切换时会出现短暂的空白或卡顿现象,影响用户体验。经过反复调试和参考其他优秀的轮播图实现代码,发现是由于定时器的设置和图片切换的逻辑不够优化导致的,于是进行了调整,实现了比较好的效果。

通过解决这些问题,我积累了一些宝贵的经验和方法。首先,遇到问题时要保持冷静,仔细分析报错信息和问题的表现形式,确定问题的大致范围;然后,通过查阅相关的技术文档、书籍和网络资料,寻找可能的解决方案。在查阅资料的过程中,要学会筛选有用的信息,避免被过多无关的内容所干扰;如果自己无法解决问题,可以向老师、同学或技术社区求助,听取他们的意见和建议,拓宽解决问题的思路。同时,要善于利用调试工具,如 IDE 的调试功能、浏览器的开发者工具等,对代码进行逐步调试,查找问题的根源所在;在解决问题后,要及时总结经验教训,将解决问题的过程和方法记录下来,以便日后遇到类似问题时能够快速解决。

(三)总结

通过此次实验,我对 Web 技术有了全面的认识,并在实践中提升了编码能力和项目开发能力。实验内容涵盖了前后端开发的多个重要模块,使我能从全局视角理解 Web 应用的实现原理和关键技术。这些知识与技能将为我未来的学习和工作打下坚实的基础。

附录 参考资料

  1. https://css.bqrdh.com/safety-color
  2. iconfont-阿里巴巴矢量图标库 https://www.iconfont.cn/
  3. MDN Web Docs https://developer.mozilla.org/zh-CN/
  4. Apache Tomcat® - Apache Tomcat 10 Software https://tomcat.apache.org/download-10.cgi
  5. 解决Windows下Tomcat日志乱码:编码一致性关键 https://blog.csdn.net/wpl__/article/details/115659501
  6. IntelliJ IDEA中配置Tomcat(超详细)_intellij idea配置tomcat-CSDN博客 https://blog.csdn.net/Wxy971122/article/details/123508532
  7. Servlet - 3.1下@MultipartConfig注解方式上传文件-CSDN博客 https://blog.csdn.net/mytt_10566/article/details/71077154
  8. 什么年代了,你还不知道 Servlet3.0 中的文件上传方式? https://juejin.cn/post/6974933954210037768
  9. 如何在textarea中插入提示文本 - 前端哥 https://www.qianduange.cn/article/11002.html
  10. 使用IDEA自动生成UML类图和时序图_idea uml generator怎么用-CSDN博客 https://blog.csdn.net/qq_43269093/article/details/110168656
  11. jsp+dao+bean+servlet(MVC模式)实现简单用户登录和注册页面(连接数据库,登录页面包含验证码,两周内免登陆等功能)_eclipse如何拿到数据库信息实现用户验证登录(包括验证码)只用bean,controller,d-CSDN博客 https://blog.csdn.net/qq_43505820/article/details/109562912

写在最后

github 项目:https://github.com/Luckyblock233/MomoBlog-Web

posted @ 2025-01-20 23:35  Rainycolor  阅读(245)  评论(0)    收藏  举报