顶层JSP向WEB-INF下JSP传参遇404及旧版Servlet创建指导
解决方案
一、无需Servlet的实现方式(服务器端转发)
WEB-INF目录下的资源不允许客户端直接访问,这是Java Web的安全规则,所以你用AJAX直接POST到WEB-INF/000010/item.jsp必然返回404。要绕过这个限制,只能通过服务器端的转发操作。
你之前尝试的JSP转发无效,可能是写法有误,正确的实现方式如下:
- 修改前端AJAX的请求目标,改为当前index.jsp或者一个专门的转发JSP,而非直接指向WEB-INF下的文件:
var http = new XMLHttpRequest(); // 请求当前index.jsp,或单独的转发页面 http.open("POST", "index.jsp", true); http.setRequestHeader("Content-type","application/x-www-form-urlencoded"); var params = "newMarkerCoords=" + newMarkerCoords+"&fildmarkertype="+fildmarkertype; http.send(params);
- 在index.jsp的顶部添加服务器端转发逻辑,当检测到POST请求时,将请求转发到WEB-INF下的item.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <% // 仅当是POST请求时执行转发 if ("POST".equals(request.getMethod())) { // 将请求参数传递到item.jsp request.getRequestDispatcher("/WEB-INF/000010/item.jsp").forward(request, response); return; // 转发后终止当前页面的执行 } %> <!-- 原有的HTML内容继续保留 --> <html> ...
这样,当你点击提交按钮发送POST请求时,服务器会先接收请求,再内部转发到WEB-INF下的item.jsp,此时item.jsp可以通过request.getParameter("newMarkerCoords")获取参数,同时客户端不会直接访问WEB-INF路径,避免404错误。
二、旧版Servlet的创建步骤(无@WebServlet注解)
如果需要用Servlet处理请求(比如复杂业务逻辑),Servlet 3.0之前的版本需要通过web.xml手动配置,步骤如下:
1. 创建Servlet类
新建一个Java类,继承HttpServlet,重写doPost方法:
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class CoordsServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { // 获取请求参数 String newMarkerCoords = request.getParameter("newMarkerCoords"); String fildmarkertype = request.getParameter("fildmarkertype"); // 可在此添加业务处理逻辑 // 转发到WEB-INF下的item.jsp try { request.getRequestDispatcher("/WEB-INF/000010/item.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); } } }
2. 在web.xml中配置Servlet映射
找到项目的WEB-INF/web.xml文件,添加以下配置:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <!-- 对应Servlet 2.5版本,无注解支持 --> <!-- 配置Servlet --> <servlet> <servlet-name>CoordsServlet</servlet-name> <servlet-class>com.yourpackage.CoordsServlet</servlet-class> <!-- 替换为你的Servlet完整类名 --> </servlet> <!-- 配置Servlet映射路径 --> <servlet-mapping> <servlet-name>CoordsServlet</servlet-name> <url-pattern>/coords-submit</url-pattern> <!-- 前端请求的路径 --> </servlet-mapping> </web-app>
3. 修改前端AJAX请求路径
将AJAX的请求目标改为Servlet的映射路径:
var http = new XMLHttpRequest(); http.open("POST", "coords-submit", true); // 对应web.xml中的url-pattern http.setRequestHeader("Content-type","application/x-www-form-urlencoded"); var params = "newMarkerCoords=" + newMarkerCoords+"&fildmarkertype="+fildmarkertype; http.send(params);
这样配置后,前端请求会被Servlet接收处理,再转发到WEB-INF下的item.jsp,同样可以避免404错误。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

