Spring MVC访问/add接口出现HTTP 404错误,请求排查解决方案
Spring MVC访问/add出现404错误排查
问题详情
访问URL http://localhost:8080/DemoMVC/add?t1=2&t2=4 时返回HTTP 404错误,服务器无法找到请求资源。该URL应匹配Spring控制器中的/add映射,但Spring未识别到该映射。
已尝试的操作
- 创建了带有
@RequestMapping("/add")注解的控制器,用于处理/add请求; - 确认控制器在Spring的
@ComponentScan扫描包范围内; - 控制器方法已实现处理参数t1、t2并返回结果的逻辑;
- 验证了Spring DispatcherServlet的web.xml配置及视图解析相关配置。
代码文件
display.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here </title> </head> <body> RESULT IS:<%= request.getAttribute("result")%> </body> </html>
index.jsp
<html> <body> <h2>Hello World!</h2> <form action="add"> <input type="text" name="t1"><br> <input type="text" name="t2"><br> <input type="submit"> </form> </body> </html>
web.xml
<?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_3_1.xsd" version="3.1"> <display-name>DemoMVC</display-name> <servlet> <servlet-name>student</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>student</servlet-name> <url-pattern>/add</url-pattern> </servlet-mapping> </web-app>
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.student</groupId> <artifactId>DemoMVC</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>DemoMVC Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <!-- Or 3.1.0 or 2.5 based on your server --> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.1.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.1.8.RELEASE</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.36</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <finalName>DemoMVC</finalName> </build> </project>
AddController.java
package com.student; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class AddController { @RequestMapping("/add") public ModelAndView add(HttpServletRequest req, HttpServletResponse res) { int i=Integer.parseInt(req.getParameter("t1")); int j=Integer.parseInt(req.getParameter("t2")); int k=i+j; ModelAndView mv= new ModelAndView(); mv.setViewName("display.jsp"); mv.addObject("result", k); return mv; } }
student-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:ctx="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd "> <ctx:annotation-config></ctx:annotation-config> <ctx:component-scan base-package="com.student"></ctx:component-scan> </beans>
问题根源及修复方案
1. DispatcherServlet映射范围错误
当前web.xml中DispatcherServlet的url-pattern仅配置为/add,导致只有/add路径会被DispatcherServlet接管,但Spring控制器内部的@RequestMapping("/add")会匹配相对于DispatcherServlet的路径,最终实际匹配路径变为/add/add,因此出现404。
修复:修改web.xml中的servlet-mapping,让DispatcherServlet处理所有请求:
<servlet-mapping> <servlet-name>student</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
2. 缺少视图解析器配置
student-servlet.xml中未配置视图解析器,控制器返回的display.jsp无法被Spring正确解析路径。
修复:在student-servlet.xml中添加InternalResourceViewResolver:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <!-- 根据JSP实际存放路径调整 --> <property name="suffix" value=".jsp"/> </bean>
同时将display.jsp移动到WEB-INF/views/目录下,修改控制器中的视图名称为display:
mv.setViewName("display");
3. 可选优化:简化控制器参数获取
可以使用@RequestParam替代HttpServletRequest获取参数,代码更简洁:
@RequestMapping("/add") public ModelAndView add(@RequestParam("t1") int t1, @RequestParam("t2") int t2) { int k = t1 + t2; ModelAndView mv = new ModelAndView("display"); mv.addObject("result", k); return mv; }
内容的提问来源于stack exchange,提问作者Gina_Linetti
相关产品推荐
相关产品推荐

