【Web编程技术实验九】基于SpringMVC的动态时钟设计(附完整代码)

一、实验背景

本次实验要设计一个动态时钟,在网页正中央显示当前时间,并且时间要每秒自动刷新

技术栈: SpringMVC + JSP + JavaScript + Tomcat


二、实验效果

运行成功后,页面效果如下:

屏幕截图 2026-06-06 163649

  • 时间实时刷新(时:分:秒)
  • 页面居中显示
  • 美观的渐变背景

三、技术原理

3.1 SpringMVC 工作流程

用户访问 /clock
↓
DispatcherServlet 接收请求
↓
HandlerMapping 找到对应的 Controller
↓
Controller 处理业务逻辑(获取当前时间)
↓
Model 存储数据,传递给 View
↓
ViewResolver 解析视图路径
↓
返回 JSP 页面给用户

3.2 动态刷新原理

使用 JavaScript 的 setInterval() 函数,每隔1秒重新获取当前时间并更新页面显示。

四、项目结构

ClockDemo/
├── src/main/java/com/clock/controller/
│ └── ClockController.java
├── WebContent/
│ └── WEB-INF/
│ ├── web.xml
│ ├── spring-servlet.xml
│ ├── lib/
│ │ └── (Spring相关jar包)
│ └── views/
│ └── clock.jsp

五、核心代码

5.1 Controller 层(ClockController.java)

java
package com.clock.controller;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ClockController {
    
    @RequestMapping("/clock")
    public String showClock(Model model) {
        // 获取当前时间
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String currentTime = sdf.format(new Date());
        
        // 存入Model,传递给JSP
        model.addAttribute("time", currentTime);
        
        return "clock";
    }
}

代码解析:

@Controller:标记这是一个控制器类

@RequestMapping("/clock"):当访问 /clock 时执行此方法

Model:用于存储数据,传递给视图层

5.2 Spring 配置文件(spring-servlet.xml)

xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context 
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc 
           http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
    <!-- 扫描Controller包 -->
    <context:component-scan base-package="com.clock.controller" />
    
    <!-- 启用注解驱动 -->
    <mvc:annotation-driven />
    
    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>
    
</beans>

关键配置:

component-scan:自动扫描 @Controller 注解

viewResolver:将 return "clock" 解析为 /WEB-INF/views/clock.jsp

5.3 Web.xml 配置

xml
<?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">
    
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
</web-app>

5.4 视图层(clock.jsp)

jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>动态时钟 - SpringMVC</title>
    <style>
        body {
            margin: 0;
            padding: 0;
            height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            font-family: "微软雅黑", Arial, sans-serif;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        }
        .clock-container {
            text-align: center;
            background: rgba(255, 255, 255, 0.9);
            padding: 50px;
            border-radius: 20px;
            box-shadow: 0 15px 35px rgba(0,0,0,0.2);
        }
        .time {
            font-size: 60px;
            font-weight: bold;
            color: #333;
            letter-spacing: 5px;
            font-family: "Courier New", monospace;
        }
        .date {
            font-size: 24px;
            color: #666;
            margin-top: 20px;
        }
        .title {
            font-size: 28px;
            color: #667eea;
            margin-bottom: 20px;
        }
    </style>
    <script>
        function updateTime() {
            var now = new Date();
            var year = now.getFullYear();
            var month = String(now.getMonth() + 1).padStart(2, '0');
            var day = String(now.getDate()).padStart(2, '0');
            var hours = String(now.getHours()).padStart(2, '0');
            var minutes = String(now.getMinutes()).padStart(2, '0');
            var seconds = String(now.getSeconds()).padStart(2, '0');
            
            document.getElementById("date").innerHTML = year + "-" + month + "-" + day;
            document.getElementById("time").innerHTML = hours + ":" + minutes + ":" + seconds;
        }
        
        window.onload = function() {
            updateTime();
            setInterval(updateTime, 1000);
        }
    </script>
</head>
<body>
    <div class="clock-container">
        <div class="title">🕐 SpringMVC 动态时钟</div>
        <div class="time" id="time">--:--:--</div>
        <div class="date" id="date">----/--/--</div>
    </div>
</body>
</html>

六、遇到的问题及解决

问题1:Tomcat启动失败

现象: 服务器启动时报错

原因: spring-servlet.xml 中包扫描路径写错(controler 少了一个 l)

解决: 修正为 com.clock.controller

问题2:页面显示404

现象: 访问 /clock 返回404

原因: 视图解析器的 prefix 和 suffix 配置错误

解决:

prefix 改为 /WEB-INF/views/

suffix 改为 .jsp

问题3:时间不刷新

现象: 页面显示静态时间

原因: 忘记添加 setInterval 定时器

解决: 添加 setInterval(updateTime, 1000)

七、部署到云服务器

7.1 导出WAR包

在Eclipse中右键项目 → Export → WAR file

7.2 上传到ECS

使用WinSCP或FTP将WAR包上传到Tomcat的 webapps 目录

7.3 配置安全组

开放8080端口,授权对象 0.0.0.0/0

7.4 公网访问地址

http://你的公网IP:8080/ClockDemo/clock

八、实验总结

许俊杰: 我负责项目架构搭建和Controller编写。通过本次实验,掌握了SpringMVC框架的基本配置,理解了@Controller、@RequestMapping注解的作用,以及视图解析器的配置方法。遇到的主要问题是Tomcat启动失败,原因是spring-servlet.xml中的包扫描路径写错,修正后解决。

叶海林: 我负责JSP页面设计和JavaScript动态刷新功能。通过setInterval函数实现每秒更新时间,并使用CSS Flexbox实现页面居中。理解了前端与后端的交互流程。

王兴安: 我负责Spring配置文件编写和jar包导入。学会了web.xml中配置DispatcherServlet,和spring-servlet.xml中配置组件扫描和视图解析器。

李想: 我负责测试和截图以及spring-servlet.xml中配置组件扫描和视图解析器。
,验证了时钟在不同浏览器下的显示效果,确认了动态刷新功能正常,并整理了实验报告。

posted @ 2026-06-06 17:00  只整冰红茶  阅读(10)  评论(0)    收藏  举报