当前位置: 首页 > news >正文

SpringMVC 实现简易加法器

SpringMVC 实现简易加法器

一、前言

本文基于《Web编程技术》课程实验要求,使用 Eclipse、JDK 1.8、Tomcat 9.0、SpringMVC 框架,从零搭建带输入校验的网页加法器。项目可接收两个数字并完成加法运算,对空输入、字母、中文、特殊符号等非法内容做拦截并页面提示,同时通过 CSS 优化界面样式。

二、实验环境与技术栈

1. 运行环境

  • 操作系统:Windows 10 / Windows 11
  • JDK 版本:JDK 1.8
  • 服务器:Apache Tomcat 9.0
  • 开发工具:Eclipse Web Developer

2. 核心技术栈

  • 后端框架:SpringMVC
  • 前端页面:JSP + CSS
  • 配置文件:web.xml(Web全局配置)、springmvc.xml(SpringMVC核心配置)
  • 依赖包:Spring 核心 Jar 包 + commons-logging 日志包

3. 设计思想(MVC 模式)

遵循 MVC 分层思想实现代码解耦:

  1. View 视图层index.jspadd.jsp,负责页面展示、表单录入、信息回显
  2. Controller 控制层AddController.java,接收请求、参数校验、业务处理、视图跳转
  3. Model 模型层:本项目通过 Model 对象完成前后端数据交互

整体流程:用户提交表单 → 请求分发至 SpringMVC 控制器 → 后端校验参数 → 合法则计算求和,非法则封装错误信息 → 跳转页面展示结果/提示。

三、项目整体目录结构

SpringMVC_AddDemo  // 项目根目录
├─ src/main/java                // 后端Java源码目录
│  └─ com
│     └─ controller             // 控制器包
│        └─ AddController.java   // 核心控制器类
├─ src/main/webapp              // Web资源根目录(浏览器可直接访问)
│  ├─ index.jsp                  // 项目首页,自动跳转加法页面
│  ├─ add.jsp                   // 加法器表单主页面
│  └─ WEB-INF                    // 受保护目录(浏览器禁止直接访问)
│     ├─ lib                     // 存放SpringMVC所有依赖Jar包
│     ├─ web.xml                 // Web项目全局配置
│     └─ springmvc.xml           // SpringMVC框架配置
└─ Servers                      // Eclipse Tomcat 服务器配置

说明:WEB-INF 是 JavaWeb 保护目录,仅服务器内部可调用,用于存放配置文件、Jar 包,提升安全性。

四、详细搭建步骤

步骤1:Eclipse 创建动态 Web 项目

  1. 打开 Eclipse,选择 File → New → Dynamic Web Project
  2. 项目名称填写:SpringMVC_AddDemo
  3. Target runtime 选择 Apache Tomcat v9.0
  4. Dynamic web module version 选择 4.0,点击 Finish 完成创建。

步骤2:导入 SpringMVC 依赖 Jar 包

  1. 进入目录 src/main/webapp/WEB-INF/lib
  2. 放入以下必备 Jar 包:
    • spring-corespring-beansspring-contextspring-expression
    • spring-webspring-webmvc
    • commons-logging
  3. 全选所有 Jar 包(Ctrl+A),右键选择 Build Path → Add to Build Path
  4. 右键项目 → Refresh 刷新项目。

步骤3:创建后端控制器包与类

3.1 创建包 com.controller

  1. 右键 src/main/javaNew → Other
  2. 展开 Java,选中 PackageNext
  3. 包名填写 com.controller,点击 Finish

3.2 创建控制器 AddController.java

  1. 右键 com.controller → 新建 Java Class,类名:AddController
  2. 粘贴完整代码:
package com.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;@Controller
@RequestMapping("/add")
public class AddController {// 跳转加法表单页面@RequestMapping("/toPage")public String toAddPage() {return "add";}// 处理加法计算请求@RequestMapping("/calc")public String calculate(@RequestParam(value = "num1", required = false) String num1,@RequestParam(value = "num2", required = false) String num2,Model model) {// 非空校验if (num1 == null || num1.trim().isEmpty()) {model.addAttribute("msg1", "第一个数字不能为空!");model.addAttribute("num2", num2);return "add";}if (num2 == null || num2.trim().isEmpty()) {model.addAttribute("msg2", "第二个数字不能为空!");model.addAttribute("num1", num1);return "add";}double n1, n2;// 数字格式校验try {n1 = Double.parseDouble(num1.trim());} catch (NumberFormatException e) {model.addAttribute("msg1", "第一个输入不是有效数字,请重新输入!");model.addAttribute("num2", num2);return "add";}try {n2 = Double.parseDouble(num2.trim());} catch (NumberFormatException e) {model.addAttribute("msg2", "第二个输入不是有效数字,请重新输入!");model.addAttribute("num1", num1);return "add";}// 加法运算double sum = n1 + n2;model.addAttribute("num1", num1);model.addAttribute("num2", num2);model.addAttribute("sum", sum);return "add";}
}

步骤4:编写配置文件

4.1 web.xml(WEB-INF 目录下)

右键 WEB-INF 新建 File,命名 web.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"><!-- SpringMVC 前端控制器 --><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!-- 编码过滤器,解决中文乱码 --><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 欢迎页 --><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>
</web-app>

4.2 springmvc.xml(WEB-INF 目录下)

新建文件 springmvc.xml,粘贴代码:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttps://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!-- 扫描控制器包 --><context:component-scan base-package="com.controller"/><!-- 开启MVC注解驱动 --><mvc:annotation-driven/><!-- 放行静态资源 --><mvc:default-servlet-handler/><!-- 视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/"/><property name="suffix" value=".jsp"/></bean>
</beans>

步骤5:编写前端 JSP 页面

页面统一放在 src/main/webapp 根目录。

5.1 index.jsp(首页跳转)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>加法计算器首页</title>
</head>
<body><% response.sendRedirect("add/toPage"); %>
</body>
</html>

5.2 add.jsp(计算器主页面)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>SpringMVC简易加法器</title><style>*{margin:0;padding:0;box-sizing: border-box;font-family: "微软雅黑"}.container{width: 420px;margin: 80px auto;padding:30px;border-radius: 12px;box-shadow: 0 0 12px #ccc;}h2{text-align: center;color:#333;margin-bottom:25px}.item{margin:15px 0;}label{display:block;margin-bottom:6px;font-weight:500}input{width:100%;height:42px;padding:0 12px;border:1px solid #ddd;border-radius:6px;font-size:16px;}.err{color:red;font-size:14px;margin-top:4px}.submit-btn{width:100%;height:45px;background:#007aff;color:white;border:none;border-radius:6px;font-size:17px;cursor:pointer;margin-top:10px;}.submit-btn:hover{background:#0060d0}.result{margin-top:20px;text-align:center;font-size:18px;color:#28a745;font-weight:bold;}</style>
</head>
<body><div class="container"><h2>简易加法计算器</h2><form action="${pageContext.request.contextPath}/add/calc" method="post"><div class="item"><label>数字一:</label><input type="text" name="num1" value="${num1}"><div class="err">${msg1}</div></div><div class="item"><label>数字二:</label><input type="text" name="num2" value="${num2}"><div class="err">${msg2}</div></div><button class="submit-btn" type="submit">计算两数之和</button></form><% if(pageContext.findAttribute("sum") != null){ %><div class="result">计算结果:${num1} + ${num2} = ${sum}</div><% } %></div>
</body>
</html>

步骤6:部署并运行项目

  1. 打开 Eclipse Servers 面板,右键 Tomcat → Add and Remove,将项目添加至服务器
  2. 右键 Tomcat → Start 启动服务
  3. 浏览器访问地址:
http://localhost:8080/SpringMVC_AddDemo

五、功能测试用例

测试场景 预期效果
两个输入框全部留空 对应位置红字提示「不能为空」
单个输入框留空,另一个输入合法数字 空输入框弹出提示,已输入内容保留
输入字母、中文、特殊符号 提示「不是有效数字,请重新输入」
输入整数、小数、负数 正常计算并展示求和结果
合法数字提交 输入内容保留,展示计算结果

六、常见报错与调试方案

问题1:springmvc.xml 出现大量红色报错

现象:XML 命名空间、xsd 约束标红,已有 Jar 包仍报错。
解决

  1. 将 lib 下所有 Jar 包添加到 Build Path
  2. Project → Clean 清理项目缓存,刷新文件
  3. 离线环境:右键项目 Properties → Validation,取消勾选 XML Validator,关闭XML校验。

问题2:提交表单 404,路径出现 /add/add/calc

现象:路径重复多一层 /add,访问失败。
原因:表单使用相对路径,浏览器自动拼接地址。
解决:统一使用动态绝对路径:

<form action="${pageContext.request.contextPath}/add/calc" method="post">

重启 Tomcat 即可。

问题3:单独右键运行 JSP,功能失效

现象:页面可打开,提交表单无后端逻辑。
原因:单独运行 JSP 不会初始化 Spring 容器与前端控制器。
解决:必须通过 Servers 启动 Tomcat,访问项目根地址运行。

问题4:非法输入无错误提示

现象:空值、非数字提交后页面无提示。
解决

  1. 核对控制器 model.addAttribute 键名与页面 EL 表达式一致
  2. 重启 Tomcat,清除浏览器缓存。

问题5:右键新建找不到 Package 选项

解决:点击 New → Other,搜索 Package 进行创建。

七、实验总结

  1. 本项目基于 MVC 设计模式分层开发,视图、控制器、业务逻辑解耦,结构清晰,便于维护与扩展。
  2. SpringMVC 完整请求流程:请求 → 前端控制器 → 控制器处理 → 视图解析器 → 页面渲染。
  3. Web 项目表单提交建议使用 ${pageContext.request.contextPath} 动态路径,避免相对路径拼接造成 404 错误。
  4. 数据校验采用「非空判断 + 异常捕获」组合方式,是 Web 开发通用的数据校验思路。
  5. 配置文件中包扫描路径必须与 Java 包名严格一致,否则控制器无法被框架识别。

八、附录

  1. 参考教材:《Web编程技术》(第二版),余元辉主编,清华大学出版社,2024.8
  2. 参考书籍:《JSP设计》(第三版),Hans Bergsten主编,林琪、朱涛江翻译,O'Reilly Media,Inc 2013年
  3. 工具版本:JDK 1.8、Apache Tomcat 9.0、Eclipse Web Developer、Spring 5.x
http://www.jsqmd.com/news/1008809/

相关文章:

  • 从电子秤到智能设备:用STM32F4和HX711做个带蓝牙APP的迷你压力监测仪(附CubeMX工程)
  • UniApp项目实战:用uQRCode生成带动态Logo和样式切换的会员卡二维码
  • 告别单调播报:用uniapp插件Ba-TTS给你的App加上‘会说话’的震动反馈(附完整代码)
  • Shell函数与自动化:让脚本从“能用“进化到“好用“
  • R语言输出csv文件
  • 2025-2026企业出海ODI备案服务机构选择指南:合规路径与实务案例深度解析 - 优质品牌商家
  • 深度实战:Python爬虫完美解析QQ音乐歌单——接口逆向分析与数据抓取全攻略
  • 从BERT到GPT-4:手把手教你用Hugging Face玩转Prompt Tuning实战(附代码)
  • NXP MC56F81xxxL ADC并行扫描模式详解与电机控制应用
  • 2026年永康别墅门品牌选购实用指南
  • 2026年旅游招商加盟市场深度分析:哪些品牌值得关注? - 优质品牌商家
  • 从‘伏秒平衡’到波形图:手把手教你用LTspice仿真分析开关电源电感电流的直流与交流分量
  • Zabbix告警升级:告别邮件,用企业微信打造团队实时协同的监控中心
  • 别再自己造轮子了!用SKIT.FlurlHttpClient.Wechat.TenpayV3库,5分钟搞定C#微信Native支付
  • DRG存档编辑器:5分钟掌握深岩银河游戏进度定制
  • 如何在Mac上完美使用Xbox手柄:360Controller完整指南
  • 土壤重金属数据背后的故事:如何用Python+Pandas快速清洗与统计你的采样点数据?
  • 在Photoshop中无缝驾驭专业级纹理压缩:Intel Texture Works深度体验
  • 煤气罐检测数据集1117张VOC+YOLO格式
  • WAE在激光脉冲建模中的创新应用与技术优势
  • SAP MM顾问必看:OBYC自动记账配置保姆级教程,从BSX到GBB一次讲透
  • 不用复杂环境配置 OpenClaw 一键部署流程完整拆解【附安装包】
  • 从沙子到CPU——计算机硬件基础入门
  • BetterNCM-Installer高效指南:5分钟完成网易云音乐插件完整安装与管理
  • 【分享转发私信免费获取】CounterUAVHub 项目技术方案解析:轻量化静态站点构建无人机反制数据平台【附python代码】
  • ACM8625S数字功放高低音调节详解:基于杰理AC695x的I2C寄存器配置实战
  • 保姆级教程:用Python+Cartopy绘制专业气象图(以ERA5 500hPa位势高度场为例)
  • 大众点评店铺信息自动化采集工具:纯requests实现,含代理轮换与结构化清洗
  • PS4存档管理神器:Apollo Save Tool终极使用指南
  • 2026年当前,评价高的重庆省考面试培训如何选?这份金标尺教育深度解析请收好 - 品牌鉴赏官2026