未配置web.xml或@WebServlet,能否从JSP页面调用Servlet?
JSP-Servlet映射问题解决方案:注解 vs web.xml配置
嘿,我明白你在JSP-Servlet映射这块的困惑了——注解和web.xml二选一的配置逻辑确实容易让人卡壳,结合你提到的test.jsp页面,我来给你捋清楚两种配置方式的具体操作,帮你解决问题:
一、使用@WebServlet注解实现Servlet映射
这种方式不需要配置web.xml,是Servlet 3.0及以上版本推荐的简化配置方式:
- 第一步:编写带注解的Servlet类
直接在Servlet类上添加@WebServlet注解,指定访问路径(urlPatterns):import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet("/testServlet") // 这里的路径就是浏览器访问该Servlet的URL public class TestServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<h1>从TestServlet返回的内容</h1>"); } } - 第二步:修改你的test.jsp页面,添加访问Servlet的入口
可以用超链接或者表单,示例如下(顺便帮你修正了编码为UTF-8,避免乱码):<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>测试页面</title> </head> <body> <h3>测试Servlet映射</h3> <a href="testServlet">点击访问TestServlet(GET请求)</a> <br><br> <form action="testServlet" method="post"> <input type="submit" value="提交到TestServlet(POST请求)"> </form> </body> </html> - 注意事项:确保你的项目依赖的是Servlet 3.0及以上版本,服务器会自动扫描项目中带
@WebServlet注解的类并完成映射。
二、使用web.xml配置Servlet映射
如果你的项目是Servlet 3.0以下版本,或者更习惯XML配置方式,可以完全依靠web.xml来实现映射:
- 第一步:编写无注解的Servlet类
去掉@WebServlet注解,只保留核心逻辑:import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class TestServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<h1>从TestServlet返回的内容</h1>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { doGet(request, response); // 复用GET请求逻辑,也可以写单独的POST处理逻辑 } } - 第二步:在WEB-INF目录下的web.xml中添加配置
要确保web.xml放在WEB-INF目录下,配置内容如下:<?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"> <!-- 注册Servlet --> <servlet> <servlet-name>TestServlet</servlet-name> <servlet-class>com.yourpackage.TestServlet</servlet-class> <!-- 替换成你的Servlet完整包路径 --> </servlet> <!-- 配置映射路径 --> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/testServlet</url-pattern> <!-- 和注解方式的访问路径一致 --> </servlet-mapping> </web-app> - 第三步:test.jsp的修改和注解方式完全一致,不需要额外调整。
三、常见问题排查
如果配置后访问不到Servlet,可以从这几个方向检查:
- 注解方式排查:
- 确认项目的Servlet版本是否≥3.0,低于该版本不支持注解映射。
- 检查
@WebServlet的路径是否拼写正确,比如有没有多写/漏写斜杠。 - 确保Servlet类已经被正确编译到项目的
WEB-INF/classes目录下。
- web.xml方式排查:
- 检查
servlet-class的完整包路径是否正确,大小写和实际类名一致。 - 确认
servlet-name在<servlet>和<servlet-mapping>中完全匹配(大小写敏感)。 - 检查web.xml的位置是否在
WEB-INF目录下,文件名是否为web.xml(不能改名)。
- 检查
内容的提问来源于stack exchange,提问作者SKL
相关产品推荐
相关产品推荐

