实验8
SpringMVC 实战练习:开发三角形计算器 + 全程排坑记录
大家好,最近完成了 SpringMVC 框架的上机实验,从零搭建了一个三角形计算器 Web 小项目。整个过程从环境搭建、文件配置、代码编写,再到解决端口占用、Jar 包异常、项目部署失败、404 访问错误等一系列问题,踩了不少典型的坑。本篇文章完整记录项目开发流程、核心配置、代码实现以及问题排查思路,既是个人学习复盘,也分享给正在学习 SpringMVC 的小伙伴。
一、项目概述
1. 技术栈
- 开发工具:Eclipse IDE for Enterprise Java Developers
- 运行环境:JDK 1.8
- 服务器:Apache Tomcat 9.0
- 核心框架:SpringMVC
- 视图技术:JSP
2. 实现功能
- 前端 JSP 页面提供表单,接收用户输入的三角形三条边长;
- 后台接收参数,判断三条边能否合法构成三角形;
- 若可以构成三角形,使用海伦公式计算周长与面积;
- 将判断结果和计算数据回显到结果页面;
- 解决页面中文乱码、请求分发、页面跳转等基础 Web 问题。
3. 整体架构(MVC 分层思想)
本项目严格遵循 MVC 设计模式,三层职责划分清晰:
- Model(模型层):
Triangle.java实体类,封装边长属性、判断逻辑与计算逻辑; - Controller(控制层):
TriangleControl.java控制器,接收浏览器请求、调用业务逻辑、控制页面跳转; - View(视图层):
input.jsp(输入页)、show.jsp(结果页),负责页面展示与数据渲染。
二、项目目录结构
先梳理完整项目结构,方便对照搭建:
springmvc (动态Web项目根目录)
├─ src
│ ├─ com.bean // 实体类包
│ │ └─ Triangle.java
│ └─ com.control // SpringMVC控制器包
│ └─ TriangleControl.java
└─ WebContent
├─ WEB-INF
│ ├─ lib // SpringMVC所有依赖Jar包(必须放在根目录)
│ ├─ pages // 存放JSP视图页面
│ │ ├─ input.jsp
│ │ └─ show.jsp
│ ├─ web.xml // 项目全局部署描述文件
│ └─ springmvc-servlet.xml// SpringMVC核心配置文件
└─ index.jsp
重要提醒:所有 Spring 相关 Jar 包必须直接放在 WEB-INF/lib 下,不能嵌套子文件夹,否则 Tomcat 无法加载。
三、核心配置文件编写
SpringMVC 项目能否正常运行,配置文件是关键,下面贴出两份完整、可直接运行的配置代码。
1. 全局配置文件 web.xml
该文件主要配置:SpringMVC 前端控制器、中文乱码过滤器、默认欢迎页。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- 1. SpringMVC 前端控制器:拦截所有请求 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 服务器启动时就加载该Servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- / 表示拦截浏览器所有请求 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 2. 中文乱码过滤器:统一设置请求编码为UTF-8 -->
<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>
2. SpringMVC 核心配置 springmvc-servlet.xml
文件名规则:servlet-name + -servlet.xml,本项目中固定为 springmvc-servlet.xml,放在 WEB-INF 下。
主要功能:组件扫描、开启注解、视图解析器、放行静态资源。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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">
<!-- 1. 组件扫描:自动扫描com.control包下的控制器类 -->
<context:component-scan base-package="com.control"/>
<!-- 2. 开启SpringMVC注解驱动,支持@RequestMapping等注解 -->
<mvc:annotation-driven/>
<!-- 3. 视图解析器:自动拼接页面路径,简化跳转代码 -->
<!-- prefix:页面前缀路径 suffix:页面后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 4. 放行静态资源,防止静态文件被前端控制器拦截 -->
<mvc:default-servlet-handler/>
</beans>
四、后端 Java 代码实现
1. 实体类 Triangle.java(Model 层)
封装三角形三条边,提供判断合法性、计算周长和面积的业务逻辑。
package com.bean;
public class Triangle {
// 三条边长
private double a;
private double b;
private double c;
// 是否为合法三角形
private boolean isTriangle;
// 周长
private double perimeter;
// 面积
private double area;
// 无参构造(Spring参数封装必须)
public Triangle() {}
// 核心计算方法
public void calculate() {
// 三角形判定规则:任意两边之和大于第三边,且边长大于0
if (a > 0 && b > 0 && c > 0 && (a + b > c) && (a + c > b) && (b + c > a)) {
isTriangle = true;
// 计算周长
perimeter = a + b + c;
// 海伦公式计算面积
double p = perimeter / 2;
area = Math.sqrt(p * (p - a) * (p - b) * (p - c));
} else {
isTriangle = false;
}
}
// Getter & Setter 方法
public double getA() {
return a;
}
public void setA(double a) {
this.a = a;
}
public double getB() {
return b;
}
public void setB(double b) {
this.b = b;
}
public double getC() {
return c;
}
public void setC(double c) {
this.c = c;
}
public boolean isTriangle() {
return isTriangle;
}
public double getPerimeter() {
return perimeter;
}
public double getArea() {
return area;
}
}
2. 控制器 TriangleControl.java(Controller 层)
使用 @Controller 注解声明为控制器,@RequestMapping 绑定请求路径。
package com.control;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.bean.Triangle;
@Controller
public class TriangleControl {
// 跳转到输入页面
@RequestMapping("/input")
public String showInput(){
// 视图解析器自动拼接:/WEB-INF/pages/input.jsp
return "input";
}
// 处理计算请求
@RequestMapping("/calculate")
public String calculate(Triangle triangle, Model model){
// 执行计算逻辑
triangle.calculate();
// 将数据存入Model,转发到页面展示
model.addAttribute("tri",triangle);
return "show";
}
}
五、前端 JSP 页面代码
1. 输入页面 input.jsp
提供表单,让用户输入三条边长,提交到 /calculate 请求地址。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>三角形计算器</title>
</head>
<body>
<h3>三角形边长输入</h3>
<form action="calculate" method="post">
边长A:<input type="number" name="a" step="0.01" required><br><br>
边长B:<input type="number" name="b" step="0.01" required><br><br>
边长C:<input type="number" name="c" step="0.01" required><br><br>
<input type="submit" value="开始计算">
</form>
</body>
</html>
2. 结果页面 show.jsp
使用 JSTL 标签判断结果,展示三角形信息或错误提示。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>计算结果</title>
</head>
<body>
<h3>计算结果</h3>
<c:if test="${tri.triangle}">
<p>✅ 输入三边可以构成三角形</p>
<p>三角形周长:${tri.perimeter}</p>
<p>三角形面积:${tri.area}</p>
</c:if>
<c:if test="${!tri.triangle}">
<p>❌ 输入三边无法构成三角形,请重新输入!</p>
</c:if>
<br>
<a href="input">返回输入页面</a>
</body>
</html>
六、完整运行步骤
- 打开 Eclipse,新建 Dynamic Web Project,项目名
springmvc; - 按照上面的目录结构,创建包、Java 类、JSP 页面;
- 将所有 SpringMVC 依赖 Jar 包放入
WEB-INF/lib,并添加到项目构建路径; - 依次编写
web.xml和springmvc-servlet.xml两份配置文件; - 在 Eclipse 中配置 Tomcat 9.0 服务器,将项目部署到服务器;
- 右键 Tomcat →
Clean清理缓存,再点击Start启动服务器; - 查看控制台日志,出现
Server startup in xxx ms代表启动成功; - 浏览器访问地址:
http://localhost:8080/springmvc/input,进行功能测试。
七、开发过程遇到的问题及解决方案(重点排坑记录)
这是本次项目最耗时的部分,也是新手最容易出错的地方,逐一记录:
问题1:Tomcat 8080 端口被占用,服务器启动失败
现象:启动 Tomcat 提示端口冲突,无法正常监听。
原因:电脑上其他程序、残留 Tomcat 进程占用了默认 8080 端口。
解决办法:
- 打开 CMD 命令提示符;
- 执行命令查询占用进程:
netstat -ano | findstr "8080"; - 记下最后一列 PID 进程号;
- 结束进程:
taskkill /PID 进程号 /F; - 重新启动 Tomcat 即可。
备选方案:直接修改 Tomcat 端口为 9090、8081 等。
问题2:Jar 包出现红色叉号,项目报错
现象:WEB-INF/lib 下的 Jar 包全部带红叉,类无法识别。
原因:
- Jar 包放在
lib的子文件夹中,Tomcat 不加载子目录 Jar; - 移动文件后,Eclipse 构建路径引用失效。
解决办法: - 把所有 Jar 包剪切到
WEB-INF/lib根目录,删除多余子文件夹; - 右键项目 →
Build Path→Configure Build Path; - 删除所有带红叉的旧 Jar 引用;
- 重新
Add JARs,选中lib下所有 Jar 包添加进来。
问题3:项目部署失败,控制台提示 Context[/springmvc] 启动失败
现象:Tomcat 启动成功,但项目加载失败。
原因:web.xml 中过滤器、Servlet 配置错误,或 Jar 包缺失。
解决办法:
- 临时注释掉过滤器代码,测试项目能否启动;
- 检查所有 Jar 包是否完整、无红叉;
- 清理 Tomcat 工作目录与缓存,重新发布项目。
问题4:浏览器访问出现 404 页面找不到
现象:地址正确但页面无法访问。
原因:
- SpringMVC 配置文件扫描包名与实际包名不一致;
- 视图解析器路径、JSP 存放路径不匹配;
- 控制器请求地址书写错误。
解决办法: - 核对
springmvc-servlet.xml中base-package与控制器包名完全一致; - 检查视图解析器
prefix路径和 JSP 真实存放路径; - 查看控制台日志,确认
/input、/calculate请求是否被正常映射。
问题5:XML 配置文件标签、命名空间报错
现象:XML 文件标红,框架无法解析配置。
原因:命名空间地址被截断、标签书写不全。
解决办法:直接使用文中完整的 XML 代码,不要手动简写命名空间与类名。
八、项目运行效果
- 访问首页后,正常展示边长输入表单;
- 输入
3、4、5等合法边长,页面正常计算并展示周长、面积; - 输入
1、2、4等不合法边长,页面提示无法构成三角形; - 页面无中文乱码,跳转、提交功能全部正常。
九、学习总结与个人感悟
本次使用 SpringMVC 开发三角形计算器,是一次非常完整的 Java Web 入门实战。从理论到落地,我真切体会到 MVC 分层模式的优势:职责分离、代码清晰、便于后期维护。
SpringMVC 框架简化了原生 Servlet 的大量重复代码,通过注解和配置实现请求分发与视图跳转,但配置文件的严谨性是框架运行的前提,一个字符、一条路径出错,都会导致项目瘫痪。
整个排错过程虽然繁琐,但也是提升调试能力最快的方式。学会看懂 Tomcat 控制台日志、使用命令排查端口、处理 Jar 包依赖问题,这些经验在后续 Web 开发中都非常实用。
后续我会继续深入学习 SpringMVC 进阶功能、拦截器、数据校验等内容,不断积累实战经验。也希望这篇详细的笔记能帮到正在学习框架的同学,大家一起进步!

浙公网安备 33010602011771号