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

时间:2015-01-20 10:30:47

标签: java spring spring-mvc java-ee

我使用spring做了一个简单的程序。当我没有使用类级别RequestMapping时,我得到了方法级别RequestMapping的答案。但我想同时使用类级别和方法级别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>

当我在地址栏中提供此网址时。我得到了确切的输出。 http:localhost:8888/classLevel/spring?name=john

但是当我按下我在html页面设计的按钮时,就会出错。

2 个答案:

答案 0 :(得分:1)

问题就在于您的表单操作问题,您action="/classLevel"应该是action="/classLevel/spring",因为您的方法有/spring作为RequestMapping,所以更改:

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

致:

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

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

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

答案 1 :(得分:0)

如您所知:
在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以上代码的后缀。

最好的问候