序言
Spring通过@Controller注解找到相应的控制器类后,还需要知道控制器内部对每一个请求是如何处理的,这就需要使用@RequestMapping注解类型,它用于映射一个请求或一个方法。使用时,可以标注在一个方法或一个类上。
在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置的映射作用一致。
<servlet>
<servlet-name>servletName</servlet-name>
<servlet-class>ServletClass</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletName</servlet-name>
<url-pattern>url</url-pattern>
</servlet-mapping>
1、标注在方法上
作为请求处理方法在程序接收到对应的URL请求时被调用:
package com.itheima.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
...
@Controller
public class FirstController{
@RequestMapping(value="/firstController")
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) {
...
return mav;
}
}
此时,可以通过地址:http://localhost:8080/chapter12/firstController访问该方法!
2、标注在类上
该类中的所有方法都将映射为相对于类级别的请求,表示该控制器所处理的所有请求都被映射到value属性值所指定的路径下。
package com.itheima.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
...
@Controller
@RequestMapping(value="/hello")
public class FirstController{
@RequestMapping(value="/firstController")
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) {
...
return mav;
}
}
由于在类上添加了@RequestMapping注解,并且其value属性值为“/hello”,所以上述代码方法的请求路径将变为:http://localhost:8080/chapter12/hello/firstController。
@RequestMapping注解除了可以指定value属性外,还可以指定其他一些属性,如下表所示。
表中所有属性都是可选的,但其默认属性是value。当value是其唯一属性时,可以省略属性名。下面两种标注的含义相同:
@RequestMapping(value=”/firstController”)
@RequestMapping(“/firstController”)
1.RequestMapping最基础的用法就是实现类或者方法的访问控制
例如下面案例就是方法上面的控制:
@RequestMapping(value = "testlogin.do",method = RequestMethod.POST)
public String testLogin(){
return "redirect:login";
}
<form id="loginTestForm" action="testlogin.do" method="post">
<input type="submit" value="submit">
</form>
从代码上面就可以很明显的看出来,在表单中提交action地址,通过SpringMVC框架会自动找到value值等于action地址的方法然后就会执行这个方法。
这里需要注意的是form表单中提交的方式要和方法里面的method一直,否则就会报错。上面的例子中两个都是post方法提交的。
2.RequestMapping带参数的情况:
@RequestMapping(value = "testlogin.do",method = RequestMethod.POST)
public String testLogin(@RequestParam("departmentId") String departmentId){
System.out.println("输入的参数为:"+departmentId);
return "redirect:login";
}
第一种表单形式:
<form id="loginTestForm" action="testlogin.do" method="post">
<input type="text" name="departmentId" id="departmentId"></br>
<input type="submit" value="submit">
</form>
第二中表单形式:
form id="loginTestForm" action="testlogin.do?departmentId=123" method="post">
<input type="submit" value="submit">
</form>
以上两种的结果是一样的,都可以执行方法中内容。其中@RequestParam还有其他的写法,我这里就不多介绍了,有兴趣的可以自己去了解一下。
3.RequestMapping中获取URL中的参数信息:
<form id="loginTestForm" action="testlogin.do/adc" method="post">
<input type="submit" value="submit">
</form>
通过{变量名称}这样的写法,就可以在@PathVariable(“变量名”) 实现参数的调用了。
当然也可以绑定多个参数,例如:
@RequestMapping(value = "testlogin.do/departmentId/{departmentId}/departmentName/{departmentName}",method = RequestMethod.POST)
public String testLogin(@PathVariable("departmentId") String departmentId,@PathVariable("departmentName") String departmentName){
System.out.println("输入的URL参数为1:"+departmentId);
System.out.println("输入的URL参数为2:"+departmentName);
return "redirect:login";
}