基于 JSP 和 Servlet 的数字信息分析小应用
Java Web 实验:基于 JSP 和 Servlet 的数字信息分析小应用
一、实验目的
实现一个简单的 Java Web 应用,通过 JSP 表单收集用户输入的文本信息,提交至 Servlet 分析其中是否包含数字,并返回结果。掌握 JSP 与 Servlet 的协同工作、Web 项目部署及常见问题排查。
二、实验环境
- 开发工具:Eclipse 2025-3
- 服务器:Tomcat 9
- JDK:Java 8(JDK 1.8)
- 技术栈:JSP、Servlet、HTML/CSS
三、实现步骤
1. 项目结构
webapp/
├─ index.jsp # 表单页面
├─ result.jsp # 结果展示页面
├─ styles.css # 样式文件
└─ WEB-INF/├─ web.xml # 部署描述文件└─ classes/ # 编译后的 Servlet 类(自动生成)
2. JSP 表单页面(index.jsp
)
设计一个包含文本输入框和提交按钮的表单,提交至 Servlet:
<form action="NumberAnalyzed" method="post"><label>请输入文本信息:</label><input type="text" name="inputText" required><button type="submit">提交</button>
</form>
3. Servlet 处理逻辑(NumberAnalyzed.java
)
接收表单数据,遍历字符判断是否包含数字,通过 request
对象传递结果至 JSP:
@WebServlet("/NumberAnalyzed")
public class NumberAnalyzed extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String input = request.getParameter("inputText");StringBuilder numbers = new StringBuilder();for (char c : input.toCharArray()) {if (Character.isDigit(c)) {numbers.append(c).append(" ");}}request.setAttribute("numbers", numbers.toString());request.setAttribute("hasNumber", numbers.length() > 0);request.getRequestDispatcher("result.jsp").forward(request, response);}
}
4. 结果展示页面(result.jsp
)
从 request
中获取数据,根据结果显示不同提示信息:
<% if (Boolean.TRUE.equals(request.getAttribute("hasNumber"))) { %><p class="success">包含的数字:<%= request.getAttribute("numbers") %></p>
<% } else { %><p class="error">未检测到数字</p>
<% } %>
5. 样式文件(styles.css
)
使用 CSS 美化页面,包括表单布局、响应式设计和动画效果:
/* 全局变量定义 */
:root {--primary-color: #007BFF;--secondary-color: #6c757d;--success-color: #28a745;--error-color: #dc3545;--background-color: #f4f4f9;--text-color: #333;--card-background: #ffffff;--box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);--animation-duration: 0.5s;
}/* 全局样式 */
body {font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;background-color: var(--background-color);display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;
}/* 表单容器样式 */
.form-container {background-color: var(--card-background);padding: 2rem;border-radius: 8px;box-shadow: var(--box-shadow);width: 300px;
}/* 表单标题样式 */
.form-title {font-size: 1.5rem;font-weight: 600;text-align: center;margin-bottom: 1.5rem;color: var(--text-color);
}/* 表单标签样式 */
.form-label {display: block;font-size: 0.9rem;margin-bottom: 0.5rem;color: #0f0f0f;
}/* 表单输入框样式 */
.form-input {width: 100%;padding: 0.75rem;margin-bottom: 1rem;border: 1px solid #ccc;border-radius: 4px;box-sizing: border-box;
}/* 表单按钮样式 */
.form-button {width: 100%;padding: 0.75rem;background-color: var(--primary-color);color: white;border: none;border-radius: 4px;cursor: pointer;transition: background-color var(--animation-duration) ease;
}.form-button:hover {background-color: #0056b3;
}
6. web.xml 配置
在 WEB-INF/web.xml
中配置 Servlet 映射(若未使用注解):
<servlet><servlet-name>NumberAnalyzed</servlet-name><servlet-class>NumberAnalyzed</servlet-class>
</servlet>
<servlet-mapping><servlet-name>NumberAnalyzed</servlet-name><url-pattern>/NumberAnalyzed</url-pattern>
</servlet-mapping>
也可以在下图所示的图形化界面进行配置
四、遇到的问题及解决方法
1. Servlet 映射失败
- 问题:访问 Servlet 时提示“404 Not Found”。
- 原因:
web.xml
配置错误或 Servlet 类路径不正确。 - 解决:
- 使用 Eclipse 图形化编辑器配置 Servlet:在
web.xml
的 “Servlets” 标签页中添加 Servlet 名称和类全限定名(若有包名,需包含包路径)。 - 确保
@WebServlet
注解路径与web.xml
中的<url-pattern>
一致,避免配置冲突。
- 使用 Eclipse 图形化编辑器配置 Servlet:在
2. 类版本不兼容异常
- 问题:部署后服务器报错
UnsupportedClassVersionError
,提示类文件版本为 61.0(Java 17),但服务器仅支持 52.0(Java 8)。报错信息如下
类型 异常报告
消息 实例化Servlet类[NumberAnalyzed]异常
描述 服务器遇到一个意外的情况,阻止它完成请求。
例外情况
javax.servlet.ServletException: 实例化Servlet类[NumberAnalyzed]异常
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:396)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
org.apache.coyote.AbstractProtocol C o n n e c t i o n H a n d l e r . p r o c e s s ( A b s t r a c t P r o t o c o l . j a v a : 937 ) o r g . a p a c h e . t o m c a t . u t i l . n e t . N i o E n d p o i n t ConnectionHandler.process(AbstractProtocol.java:937) org.apache.tomcat.util.net.NioEndpoint ConnectionHandler.process(AbstractProtocol.java:937)org.apache.tomcat.util.net.NioEndpointSocketProcessor.doRun(NioEndpoint.java:1793)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)
org.apache.tomcat.util.threads.ThreadPoolExecutor W o r k e r . r u n ( T h r e a d P o o l E x e c u t o r . j a v a : 659 ) o r g . a p a c h e . t o m c a t . u t i l . t h r e a d s . T a s k T h r e a d Worker.run(ThreadPoolExecutor.java:659) org.apache.tomcat.util.threads.TaskThread Worker.run(ThreadPoolExecutor.java:659)org.apache.tomcat.util.threads.TaskThreadWrappingRunnable.run(TaskThread.java:63)
java.lang.Thread.run(Thread.java:748) 根本原因。java.lang.UnsupportedClassVersionError: NumberAnalyzed has been
compiled by a more recent version of the Java Runtime (class file
version 61.0), this version of the Java Runtime only recognizes class
file versions up to 52.0 (无法载入的类 [NumberAnalyzed])
org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2347)
org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2212)
org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:823)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1314)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1162)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:396)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
org.apache.coyote.AbstractProtocol C o n n e c t i o n H a n d l e r . p r o c e s s ( A b s t r a c t P r o t o c o l . j a v a : 937 ) o r g . a p a c h e . t o m c a t . u t i l . n e t . N i o E n d p o i n t ConnectionHandler.process(AbstractProtocol.java:937) org.apache.tomcat.util.net.NioEndpoint ConnectionHandler.process(AbstractProtocol.java:937)org.apache.tomcat.util.net.NioEndpointSocketProcessor.doRun(NioEndpoint.java:1793)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)
org.apache.tomcat.util.threads.ThreadPoolExecutor W o r k e r . r u n ( T h r e a d P o o l E x e c u t o r . j a v a : 659 ) o r g . a p a c h e . t o m c a t . u t i l . t h r e a d s . T a s k T h r e a d Worker.run(ThreadPoolExecutor.java:659) org.apache.tomcat.util.threads.TaskThread Worker.run(ThreadPoolExecutor.java:659)org.apache.tomcat.util.threads.TaskThreadWrappingRunnable.run(TaskThread.java:63)
java.lang.Thread.run(Thread.java:748) ):注意 主要问题的全部 stack 信息可以在 server
logs 里查看
- 原因:Eclipse 编译器默认使用高版本 JDK 编译,而 Tomcat 配置的 JRE 为 Java 8。
- 解决:
- 配置 Eclipse 编译器:
- 进入
Window > Preferences > Java > Compiler
,将Compiler compliance level
设置为1.8
。
- 进入
- 指定 Tomcat JRE:
- 在
Servers
视图中右键 Tomcat 服务器,选择Properties > Java
,指定 Java 8 JRE。
- 在
- 配置 Eclipse 编译器:
4. web.xml 图形化编辑器使用不习惯
- 问题:Eclipse 默认打开
web.xml
的图形化编辑器,手动编辑代码不便。 - 解决:右键
web.xml
文件,选择Open With > Text Editor
,直接编写 XML 代码,确保标签闭合和命名空间正确。
五、实验总结
1. 核心收获
- MVC 模式应用:JSP 负责视图(View),Servlet 处理逻辑(Controller),实现了业务逻辑与页面展示分离。
- 环境配置关键:JDK 版本一致性至关重要,需确保 Eclipse 编译器、Tomcat 服务器和项目构建路径均使用同一版本(如 Java 8)。
- 异常排查方法:通过服务器日志(如 Tomcat 的
catalina.log
)定位错误,结合类文件版本对照表(如 Java 8 对应类版本 52.0)解决兼容性问题。
2. 改进方向
- 使用 Maven 管理依赖和构建项目,避免手动配置
web.xml
和类路径。 - 引入 Filter 处理字符编码,确保中文输入正确解析。
- 优化 Servlet 代码,将数字分析逻辑封装为工具类,提高可复用性。
通过本次实验,深入理解了 Java Web 开发中 JSP 与 Servlet 的协同机制,掌握了环境配置、异常处理和 Web 项目部署的核心技能,为后续开发复杂 Web 应用奠定了基础。