如何通过class级RequestMapping调用请求映射方法级

how to call request mapping method level through class level RequestMapping

我使用 spring 编写了一个简单的程序。当我没有使用 class 级别 RequestMapping 时,我得到了方法级别 RequestMapping 的答案。但我想同时使用 class 级别和方法级别的 RequestMapping。

这是我的控制器代码

package com.birthid;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("/classLevel")
public class Controaller1 
{
     @RequestMapping("/spring")
     public ModelAndView display(@RequestParam("name") String name)
     {
         ModelAndView model=new ModelAndView("view");
         model.addObject("msg", name);
         return model;
     }      
}

html代码

<html>
<head>
   <meta http-equiv="content-type" content="text/html; charset=UTF-8">
   <title>Hello App Engine</title>
</head>

<body>
   <h1>valith web application!</h1>
   <form action="/classLevel" method="get">
      name:<input type="text" name="name"/><br>
      <input type="submit" value="clik me"/>
   </form>
</body>
</html>

当我在地址栏中输入 url 时。我得到了准确的输出。 http:localhost:8888/classLevel/spring?name=john

但是当我按下我在 html 页面中设计的按钮时,出现错误。

好吧,问题出在你的表单操作上,你有 action="/classLevel" 应该是 action="/classLevel/spring" 因为你的方法有 /spring 作为 RequestMapping 所以改变 :

<form action="/classLevel" method="get">

收件人:

<form action="/classLevel/spring" method="get">

因为正如您在 url 测试中所做的那样,方法调用应该是:/classLevel/spring.

查看 Spring 文档Mapping Requests With @RequestMapping 部分以获取更多信息。

众所周知:
在 Spring MVC 中,您可以 return 作为 StringModelAndView 对象查看。

重要提示:
在这两种情况下,您都必须注意 relative/absolute path:

  1. 如果您在视图名称的开头声明 /,则您使用的是 绝对路径
    即无所谓class级别@RequestMapping直接介绍自己为最终视图名.
  2. 如果您在视图名称的开头声明/,则您使用的是相对路径(相对到 class 路径),因此它 附加 class 级别 @RequestMapping 以构造 最终视图名称.

因此,在使用Spring MVC时必须考虑以上注意事项。

示例:
1. 在spring(boot)结构的static文件夹中创建两个HTML文件test1.htmltest2.html
请注意 class level @RequestMappingrelative 的情况下表现为 folder 路径路径。

--- resources
    --- static
        --- classLevelPath     //behaves as a folder when we use relative path scenario in view names   
            --- test2.html      //this will be used for relative path [case (2)]
        --- test1.html          //this will be used for absolute path [case (1)]

  1. 创建一个控制器 class 如下所示。此示例显示 return StringModelAndViewrelativeabsolute 路径中的不同情况。

@Controller
@RequestMapping("/classLevelPath")
public class TestController {

    //case(1)
    @RequestMapping("/methodLevelAbsolutePath1")
    public String absolutePath1(Model model){
        //model.addAttribute();
        //...
        return "/test1.html";  
    }

    //case(1)
    @RequestMapping("/methodLevelAbsolutePath2")
    public ModelAndView absolutePath2(Model model){
        ModelAndView modelAndView = new ModelAndView("/test1.html");
        //modelAndView.addObject()
        //....
        return modelAndView; 
    }

    //case(2)
    @RequestMapping("/methodLevelRelativePath1")
    public String relativePath1(Model model){
        //model.addAttribute();
        //...
        return "test2.html";
    }

    //case(2)
    @RequestMapping("/methodLevelRelativePath2")
    public ModelAndView relativePath2(Model model){
        ModelAndView modelAndView = new ModelAndView("test2.html");
        //modelAndView.addObject()
        //....
        return modelAndView;  
    }


}

注:
您可以通过 ViewResolver 指定视图文件的后缀(例如 InternalResourceViewResolverspring.mvc.view.suffix=.html 在 Spring Boot 的 appliction.properties 文件中并且不要声明 .html 后缀在上面的代码中。

此致