Servlet 项目结构搭建
一个标准的 Servlet 项目通常遵循 Java Web 应用的目录结构规范,以下是常见的项目结构示例:
ProjectName
├── src
│ └── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── servlet
│ │ └── MyServlet.java
│ ├── resources
│ └── webapp
│ ├── WEB-INF
│ │ ├── web.xml
│ │ └── classes
│ ├── index.jsp
│ └── static
│ ├── css
│ ├── js
│ └── images
└── pom.xml (如果使用 Maven)
核心目录说明
src/main/java
存放 Java 源代码,包括 Servlet 类和其他业务逻辑代码。Servlet 类需继承 javax.servlet.http.HttpServlet。
src/main/webapp
Web 应用的根目录,包含前端资源(JSP/HTML/CSS/JS)和配置文件。
WEB-INF
受保护的目录,客户端无法直接访问。包含以下关键文件:
- web.xml:部署描述符(Servlet 3.0+ 后可省略,改用注解)。
- classes:编译后的 Java 类文件(自动生成)。
配置步骤
Servlet 类示例
使用 @WebServlet 注解或 web.xml 配置 Servlet:
java
// 注解方式(Servlet 3.0+)
@WebServlet(name = "MyServlet", urlPatterns = {"/myServlet"})
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().println("Hello, Servlet!");
}
}
web.xml 配置(传统方式)
若使用 XML 配置,需在 WEB-INF/web.xml 中添加:
XML
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>
依赖管理
Maven 依赖
在 pom.xml 中添加 Servlet API 依赖(以 Jakarta EE 为例):
XML
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>
部署方式
- IDE 集成
使用 Eclipse/IntelliJ IDEA 直接部署到 Tomcat 等服务器。 - 手动打包
将项目编译后打包为 WAR 文件,复制到服务器的webapps目录。
注意事项
- 确保 Servlet 类路径与注解或
web.xml中的配置一致。 - 静态资源(如 CSS/JS)应放在
webapp/static下,避免被误认为 Servlet 路径。 - 使用 Servlet 3.0+ 时,可完全依赖注解,无需
web.xml。
数据库操作流程
- 创建MysqlUtil工具类
java
public class MysqlUtil {
public static String getJsonBySql(String sql, String[] cols){
// JDBC操作...
return jsonStr;
}
}
Servlet标准写法
java
@WebServlet("/showData")
public class DataServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
String json = MysqlUtil.getJsonBySql("SELECT...", new String[]{"id","name"});
resp.setContentType("application/json;charset=utf-8");
resp.getWriter().print(json);
}
}
前端AJAX调用
javascript
$.ajax({
url: "/项目名/showData",
success: function(data){
// 渲染表格逻辑
}
});
Tomcat 部署配置要点详解
1. Application Context 配置要求
在 Tomcat 服务器部署项目时,Application context(应用上下文路径)必须与项目名称保持一致。这是确保应用能够被正确识别和访问的关键配置。
配置方法:
- 在 IntelliJ IDEA 中:
- 打开"Run/Debug Configurations"
- 在"Deployment"选项卡下
- 确保"Application context"字段值与项目名称完全一致
示例:
- 如果项目名为"mywebapp",则 Application context 应配置为"/mywebapp"
- 错误配置示例:项目名为"mywebapp"但 Application context 设为"/webapp"将导致404错误
2. 部署方式选择
推荐使用"war_exploded"部署方式,这是开发阶段最常用的部署模式。
war_exploded 方式的优势:
- 自动解压war包并部署
- 支持热部署(修改文件后无需重新部署整个应用)
- 便于调试,可直接查看部署目录中的文件结构
配置步骤:
- 在部署配置中选择"Artifact"
- 选择"Web Application: Exploded"类型
- 确保输出目录指向项目的webapp目录
3. 访问URL格式规范
项目部署成功后,访问URL需遵循特定格式才能正确加载页面资源。
标准URL格式:
http://localhost:8080/项目名/page.html
详细说明:
localhost:8080:默认的Tomcat服务器地址和端口/项目名:必须与Application context配置完全一致/page.html:webapp目录下的具体页面文件路径
访问示例:
- 项目名:salesystem
- 页面路径:webapp/index.html
- 正确访问URL:
http://localhost:8080/salesystem/index.html
常见错误及详细说明:
-
遗漏项目名导致的404错误
- 错误示例:http://localhost:8080/index.html
- 正确形式:http://localhost:8080/项目名/index.html
- 问题分析:直接访问文件而忽略项目名会导致服务器无法定位正确的Web应用上下文路径
- 典型场景:在Eclipse/IDEA中部署Web项目后,忘记在URL中包含项目名称
-
项目名大小写不一致问题
- 错误示例:http://localhost:8080/Salesystem/index.html(实际项目名为salesystem)
- 正确形式:http://localhost:8080/salesystem/index.html
- 问题分析:Tomcat等服务器对项目名称大小写敏感,特别是在Linux环境下
- 注意事项:
- 部署时项目名称最好统一使用小写
- 检查server.xml中的Context path配置
- 项目文件夹名称与URL中的名称要保持一致
-
文件扩展名错误
- 错误示例:http://localhost:8080/salesystem/index.jsp(实际为HTML文件)
- 正确形式:http://localhost:8080/salesystem/index.html
- 问题分析:服务器会根据扩展名使用不同的处理器,错误的扩展名会导致:
- 无法正确解析文件内容
- 可能触发错误的Servlet映射
- 返回404或500错误
- 解决方案:
- 检查文件实际扩展名
- 确认web.xml中的mime-mapping配置
- 静态资源应使用正确的.html/.css/.js扩展名
其他相关注意事项:
- 路径分隔符应使用正斜杠(/),而非反斜杠()
- 避免在URL中使用中文或特殊字符
- 检查项目部署是否成功(查看Tomcat的webapps目录)
- 确保文件确实存在于项目的WebContent或WEB-INF目录下
常见问题解决方案
404错误处理
问题描述 :访问页面时出现404 Not Found错误
解决方案:
- 检查URL路径是否包含项目名(如
/projectName/xxx.jsp) - 确认web.xml中配置的servlet映射路径是否正确
- 检查部署目录下是否存在目标文件
- 示例:若项目名为"shop",访问
index.jsp的正确路径应为http://localhost:8080/shop/index.jsp
数据未显示问题
问题描述 :后端数据未在前端页面显示
解决方案:
- 确认servlet中调用了
resp.getWriter()方法 - 检查是否执行了
writer.write()或writer.print()输出数据 - 使用浏览器开发者工具查看网络请求是否成功
- 示例代码:
java
PrintWriter writer = response.getWriter();
writer.write("Hello World");
writer.close();
乱码问题处理
问题描述 :页面显示乱码或数据传输乱码
解决方案:
- 统一使用UTF-8编码:
- JSP页面:
<%@ page contentType="text/html;charset=UTF-8" %> - Servlet:
request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); - HTML:
<meta charset="UTF-8">
- JSP页面:
- 数据库连接字符串添加编码参数:
jdbc:mysql://...?useUnicode=true&characterEncoding=UTF-8 - 文件读写指定编码:
new InputStreamReader(new FileInputStream(file), "UTF-8")
跨域问题解决
问题描述 :前端请求后端接口时出现跨域错误
解决方案:
-
确保前后端同源访问(协议、域名、端口相同)
-
后端解决方案:
- 添加CORS响应头:
javaresponse.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "GET,POST");- 使用@CrossOrigin注解(Spring框架)
-
前端解决方案:
- 使用JSONP(仅限GET请求)
- 配置代理服务器
-
开发环境可临时禁用浏览器安全策略(仅限测试)
测试验证步骤
-
直接访问Servlet URL验证JSON输出
- 在浏览器地址栏直接输入Servlet的完整URL(如:http://localhost:8080/api/data)
- 检查返回的JSON数据结构是否符合预期格式
- 验证关键字段是否存在且值正确
- 示例:检查返回的JSON是否包含{"status":200,"data":[...]}结构
-
检查浏览器控制台网络请求
- 打开浏览器开发者工具(F12)
- 切换到Network(网络)选项卡
- 触发前端请求操作
- 查看XHR/fetch请求的详细信息:
- 请求URL是否正确
- 请求头(Headers)是否包含必要信息
- 响应状态码是否为200
- 响应体(Response)内容是否完整
-
逐步调试前端数据渲染逻辑
- 在开发者工具中切换到Sources(源代码)选项卡
- 找到处理API响应的JavaScript代码
- 在关键位置设置断点:
- 请求发送处
- 响应接收处
- 数据处理处
- DOM渲染处
- 单步执行代码,观察变量值变化
- 检查数据转换是否正确
- 验证最终渲染到页面的内容是否与原始数据匹配
补充说明:
- 对于复杂场景,建议使用Postman等工具单独测试API
- 可结合单元测试框架编写自动化测试用例
- 注意跨域问题可能导致请求失败
- 生产环境需额外验证HTTPS和安全性相关配置