JAVA Spring MVC路由写法

本文介绍了一些SpringMVC中的路由配置方法及参数传递方式,包括使用ModelAndView、Model进行视图处理,响应JSON数据,以及通过路径变量、请求参数等多种方式接收客户端输入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常用的一些Spring MVC的路由写法以及参数传递方式。

这是一些测试代码:

复制代码
package com.my.controller;

import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(value="/default")
public class TestController {

    /**
     * 使用ModelAndView
     * @return
     */
    @RequestMapping("/")
    public ModelAndView index() {
        ModelAndView mv = new ModelAndView();
        mv.addObject("message", "This is index!");
        mv.setViewName("index");
        return mv;
    }
    
    /**
     * 使用Model
     * @param model
     * @return
     */
    @RequestMapping("/index2")
    public String index2(Model model) {
        model.addAttribute("message", "This is index2!");
        return "index2";
    }
    
    /**
     * 直接返回内容
     * @return
     */
    @RequestMapping(value="/index3", method=RequestMethod.GET)
    @ResponseBody
    public String index3() {
        return "This is index3!";
    }
    
    /**
     * 直接返回对应的index4的view
     */
    @RequestMapping(value="/index4", method=RequestMethod.GET)
    public void index4() {
    }
    
    /**
     * 直接返回index5的view,注意方法后缀:Handler
     * 比较与index4的区别
     */
    @RequestMapping(value="/index5", method=RequestMethod.GET)
    public void index5Handler() {
    }
    
    /**
     * 传参方式调用
     * @param message
     * @return
     */
    @RequestMapping(value="/index6/{message}", method=RequestMethod.GET)
    public ModelAndView index6(@PathVariable String message) {
        ModelAndView view = new ModelAndView("index6");
        view.addObject("message", message);
        return view;
    }
    
    /**
     * 传参方式调用,使用Model
     * 注意方法内的Model是直接addAttribute,没有key
     * 区别index6
     * @param message
     * @param model
     * @return
     */
    @RequestMapping(value="/index7/{message}", method=RequestMethod.GET)
    public String index7(@PathVariable String message, Model model) {
        model.addAttribute(message);
        return "index6";
    }
    
    /**
     * 传参调用
     * 指定参数名称
     * @param userName
     * @param password
     * @return
     */
    @RequestMapping(value="/index8/{username}/{password}")
    public ModelAndView index8(@PathVariable("username") String userName, @PathVariable("password") String password) {
        ModelAndView view = new ModelAndView("index8");
        view.addObject("userName", userName);
        view.addObject("password", password);
        return view;
    }
    
    /**
     * 使用request/response取得参数
     * @param request
     * @param response
     * @return
     */
    @RequestMapping(value="/index9")
    public String index9(HttpServletRequest request, HttpServletResponse response) {
        String message = request.getParameter("message");
        request.setAttribute("message", message);
        return "index9";
    }
    
    /**
     * 使用@RequestParam方式取得参数
     * @param message
     * @return
     */
    @RequestMapping(value="/index10")
    public ModelAndView index10(@RequestParam("message") String message) {
        ModelAndView view = new ModelAndView("index10");
        view.addObject("message", message);
        return view;
    }
    
    /**
     * 默认传参方式
     * @param message
     * @param model
     * @return
     */
    @RequestMapping(value="/index11")
    public String index11(String message, Model model) {
        model.addAttribute("message", message);
        return "index10";
    }
    
    /**
     * 传入PrintWriteer,也可以传入@CookieValue
     * @param out
     * @param message
     * @param model
     * @return
     */
    @RequestMapping(value="/index12")
    public String index12(PrintWriter out, String message, Model model) {
        out.println(message);
        model.addAttribute("message", message);
        return "index10";
    }
    
    /**
     * 日期参数
     * @param day
     * @return
     */
    @RequestMapping(value="/index13")
    public ModelAndView index13(@RequestParam("day") @DateTimeFormat(pattern="yyyy-MM-dd") Date day) {
        ModelAndView view = new ModelAndView("index10");
        view.addObject("message", day.toString());
        return view;
    }
    
    /**
     * 默认action
     * @param message
     * @return
     */
    @RequestMapping
    public ModelAndView index14(String message) {
        ModelAndView view = new ModelAndView("index");
        view.addObject("message", message);
        return view;
    }
    
    /**
     * 限制访问的地址,必需有参数p=1才能触发
     * @param message
     * @param model
     * @return
     */
    @RequestMapping(value="/index15/{message}", params="p=1", method=RequestMethod.GET)
    public String index15(@PathVariable("message") String message, Model model) {
        model.addAttribute("message", message);
        return "index";
    }
    
}
复制代码

 


<think>好的,用户遇到了Spring MVC中的404错误,需要排查原因,特别是FrameworkServlet的源代码第1127行的问题。首先,我需要回忆Spring MVC处理请求的流程,以及可能引发404错误的常见原因。根据引用内容,Spring MVC的核心是DispatcherServlet,它负责将请求路由到对应的控制器方法。如果出现404,通常是因为没有找到对应的处理器。 用户提到FrameworkServlet的dispatch方法在第1127行退出,这可能是请求处理链结束的地方。根据引用[3],DispatcherServlet会通过HandlerMapping查找对应的HandlerMethod,如果没找到,就会返回404。这时候需要检查控制器是否正确定义,URL映射是否正确。例如,@GetMapping的路径是否正确,或者是否存在包扫描的问题。 另外,引用[1]中提到了注入HttpServletRequest的例子,这可能与控制器是否被正确识别有关,比如是否有@RestController或@Controller注解。同时,引用[2]指出FrameworkServlet实现了doGet和doPost方法,如果请求方法不匹配,也可能导致404。例如,POST请求访问了一个只支持GET的端点。 下来,用户需要检查日志,看看DispatcherServlet是否找到了处理器。如果没有,可能需要检查URL映射、控制器配置、组件扫描等。另外,检查Spring MVC的配置,比如WebMvcConfigurer中是否有路径配置错误,或者静态资源处理覆盖了请求路径。 可能还需要查看FrameworkServlet的源码,特别是dispatch方法中的逻辑,确认是否在找不到处理器时返回了404。例如,在doDispatch方法中,如果没有找到handler,就会设置响应状态为404。用户提到的第1127行可能对应这一逻辑,需要确认此时请求的URL是否确实没有对应的处理器。 最后,常见的解决方案包括检查注解是否正确、路径是否正确、组件扫描是否包含控制器类,以及是否存在库版本冲突导致映射失效。通过这些步骤,应该可以定位并解决404错误。</think>根据Spring MVC请求处理流程,FrameworkServlet的404错误通常与处理器映射(HandlerMapping)未找到匹配的请求路径有关[^3]。在源码层面,可以按照以下步骤排查: ### 一、定位源码关键点 在`FrameworkServlet`的子类`DispatcherServlet`中,404错误通常发生在`doDispatch`方法的以下阶段: ```java protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { // Line 1127附近可能对应以下逻辑: mappedHandler = getHandler(processedRequest); if (mappedHandler == null) { noHandlerFound(processedRequest, response); // 这里触发404响应 return; } } ``` ### 二、常见原因分析 1. **未注册请求处理器** - 检查控制器类是否有`@Controller`或`@RestController`注解 - 确认方法使用`@GetMapping`/`@PostMapping`等映射注解 - 示例正确写法: ```java @RestController public class MyController { @GetMapping("/valid-path") public String handle() { return "OK"; } } ``` 2. **组件扫描范围问题** - 检查`@ComponentScan`是否包含控制器所在包 - 确认Spring Boot的默认扫描未被自定义配置覆盖 3. **路径匹配问题** - URL包含多余空格或特殊字符 - 检查是否配置了`spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER`[^1] 4. **过滤器/拦截器阻断** - 检查是否在`HandlerInterceptor`中提前返回响应 - 确认安全框架(如Spring Security)未拦截请求 ### 三、验证方法 1. 查看应用启动日志: ``` Mapped "{[/api/test],methods=[GET]}" onto public java.lang.String com.example.MyController.test() ``` 2. 使用`curl -v`测试请求,观察响应头: ``` < HTTP/1.1 404 < X-Content-Type-Options: nosniff < X-Application-Context: application ``` ### 四、特殊场景排查 若使用RESTful风格口,注意: - 路径变量需完整匹配:`@GetMapping("/user/{id}")` - Content-Type需匹配(对POST/PUT请求) - 检查是否遗漏`@ResponseBody`注解(非@RestController类)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值