一、实验背景与目的
本次实验旨在深入理解Servlet工作原理,掌握JSP与Servlet的协同开发,实现前端表单与后端数据处理的交互。具体目标包括:设计包含文本输入框和按钮的表单,通过Servlet分析用户输入的字符串,提取其中的数字信息并返回结果。
二、实验设计与实现思路
1. 功能架构
- 前端(JSP页面):提供用户输入界面,包含一个文本输入框和提交按钮,通过表单的
action
属性指定数据提交路径为/tq
,采用POST方法发送请求。 - 后端(Servlet):接收表单数据,遍历字符串逐个字符判断是否为数字,提取所有数字后通过请求属性传递回JSP页面,最终转发回前端显示结果。
2. 核心代码实现
(1)web.xml配置
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>tqServlet</servlet-name>
<servlet-class>tqServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>tqServlet</servlet-name>
</servlet-mapping>
</web-app>
(2)Servlet逻辑
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class tqServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String text= req.getParameter("text");
System.out.println("text:"+text);
String num="";
for(int i=0;i<text.length();i++){
char c=text.charAt(i);
if(c>='0'&&c<='9'){
num=num+c;
}
}
if(num.length()==0){num="字符串不包含数字";}
System.out.println("num:"+num);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
(3)JSP页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>数字提取</title>
<script src="js/sub.js"></script>
<link rel="stylesheet" href="css/login.css" type="text/css">
</head>
<body>
<div class="login">
<form action="tq" method="post" id="myform" name="myform">
<div class="container">
<input type="text" name="text" placeholder="请输入字符串">
<span class="left"></span>
</div>
<div class="result"><%=request.getAttribute("num")==null?"":request.getAttribute("num")%></div>
<div class="btn"><input type="submit" value="提取数字"></div>
</form>
</div>
</body>
</html>
3. 测试用例
- 全数字输入:如“12345”,输出“12345”。
- 数字与其他字符混合:如“a1b2c3”,输出“123”。
- 无数字输入:如“abc汉字”,输出“字符串不包含数字”。
总结
本三种情况运行结果清晰。且错误输入的运行后提示信息正确。
遇到符合情况会直接输出数字。
输入字符和数字结合,会自动提取数字,实现全数字输出的结果。
若是输出中没有数字,会提示字符串不包含数字。
- 遇到的问题
1.编码问题:在Servlet中通过req.setCharacterEncoding("utf-8")
解决中文乱码,确保前端表单数据与后端处理编码一致。
2.请求转发与参数传递:使用request.setAttribute()
存储处理结果,通过getRequestDispatcher().forward()
将数据回传至JSP,避免直接响应输出导致的页面跳转数据丢失。
3.字符遍历效率:最初考虑使用正则表达式\\d
匹配数字,后选择逐字符判断,在简单场景下更易理解和维护,体现了“合适技术优于复杂方案”的工程思维。 - 心得:我深刻理解Servlet作为“请求-响应”处理器的生命周期,
doGet
与doPost
方法的差异化处理,以及通过web.xml
配置URL映射的底层逻辑。
本次实验让我从“理论认知”过渡到“实战落地”。过去认为Servlet只是JavaEE的一个组件,实际操作中却发现它是连接前端页面与后端逻辑的核心桥梁。每一次请求的接收、处理与响应,都涉及网络通信、数据解析、业务逻辑和视图渲染的协同,这让我对Web开发的分层架构有了更立体的理解。
实验中实现的数字提取功能虽简单,但为复杂Web应用奠定了基石。未来我计划深入学习Spring MVC等框架,探索RESTful接口设计和异步请求处理,同时加强前端技术(如Vue.js)的学习,成为能兼顾前后端的全栈开发者。这次实验不仅是一次课程作业,更是我踏入Web开发领域的起点——让我明白,真正的技术成长,始于对每一个小功能的认真打磨。