谁能解释一下班级控制器和方法级控制器之间的区别?

时间:2012-05-03 05:49:25

标签: java spring spring-mvc annotations spring-annotations

我是Spring框架的新手....在google上搜索时...我发现很少有在课堂级别注释了@RequestMapping的例子,很少有例子在menthod级别显示

何时使用类级别RequestMapping和menthod级别RequestMapping注释...任何人都可以解释我在类级别RequestMapping和方法级别RequestMapping之间的区别.. ??

所以我对他们的应用有点困惑:

a)班级

b)方法级别

我还发现了一些@Requestmapping类型:GET / Post,而某些示例没有类型参数。

哪种方法更好.. ??

较新的版本(> Spring 2.5)是否需要参数类型来进行请求映射???

3 个答案:

答案 0 :(得分:16)

控制器必须在班级别标记为@Controller@RequestMapping注释可以在类和方法级别应用。如果是,则方法注释将被解释为相对URL(相对于类级URL)。但是,必须存在方法级别注释,否则将不会映射该方法。

在注释中,可以使用默认值将参数标记为可选。方法参数是这样的情况:它默认为GET,但可以显式设置为POST或其他。

请参阅:

答案 1 :(得分:1)

Spring MVC 中最重要的区别之一是绝对 RELATIVE 路径。

如您所知:
在Spring MVC中,您可以将视图作为StringModelAndView对象返回。

重要说明:
在这两种情况下,您都必须注意相对/绝对路径

  1. 如果您在视图名称的开头声明/,则说明您使用的是绝对路径
    也就是说,类级别 @RequestMapping无关紧要,直接将其自身作为最终视图名称
  2. 如果您在视图名称的开头声明/,则说明您使用的是相对路径(相对于类路径),因此附加类级别 @RequestMapping以构造最终视图名称

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

示例:
1.在spring(boot)结构的test1.html文件夹中创建两个HTML文件test2.htmlstatic
请注意,在相对路径的情况下,类级别 @RequestMapping表现为文件夹路径。

--- 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. 创建如下所示的控制器类。此示例显示了在相对绝对路径中都返回StringModelAndView的不同情况。

@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中指定视图文件的后缀(例如,Spring Boot InternalResourceViewResolver文件中的spring.mvc.view.suffix=.htmlappliction.properties,而不必声明.html以上代码的后缀。

最好的问候

答案 2 :(得分:-1)

要回答你的最后一个问题,即哪一个更好,我会说在生产中我们使用这两者的组合。例如,如果有用户控制器,我们将类映射到" / user"并且getSettings()的方法说明将映射到" / settings",getPermissions()的方法将映射到" / permissions"等。

您可以将这些方法直接映射到" / user / settings"和" / user / permissions"以及跳过类映射。但大多数情况下我们更喜欢第一种方法。