SpringMVC之:常用注解
@Controller
在 SpringMVC 中,控制器 Controller 负责处理由 DispatcherServlet 分发的请求,SpringMVC 中提供了一个非常简便的定义 Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用 @Controller 标记一个类是 Controller ,这样的 Controller 就能被外界访问到。
先来看一下不使用 @Controller 注解的情况,我们通常要写一个类去实现 Controller 接口:
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "Hello SpringMVC");
mv.setViewName("hello");
return mv;
}
}
然后需要将这个类交给 SpringIOC 容器,在 xml 中注册 bean:
<bean id="/hello" class="com.jackma.controller.HelloController" />
你会发现,实现 Controller 接口的方式使得每个类只能有一个方法用来处理返回一个视图,并且每写一个Controller 就要注册一次 bean 。若直接使用 @Controller 注解就十分地省心,可以在一个类中处理返回多个视图:
@Controller
public class HelloController {
@RequestMapping("/hello1")
public String hello1(Model model) {
model.addAttribute("msg", "Hello,SpringMVC1!");
return "hello";
}
@RequestMapping("/hello2")
public String hello2(Model model) {
model.addAttribute("msg", "Hello,SpringMVC2!");
return "hello";
}
@RequestMapping("/hello3")
public String hello3(Model model) {
model.addAttribute("msg", "Hello,SpringMVC3!");
return "hello";
}
}
同时搭配上 SpringIOC 的自动扫描,可以省去注册 bean 的步骤:
<!-- 自动扫描:注意修改包名 -->
<context:component-scan base-package="com.jackma.controller"/>
@RequestMapping
基本使用
SpringMVC 使用 @RequestMapping 注解为控制器指定可以处理哪些 URL 请求,DispatcherServlet 截获请求后,就通过控制器上 @RequestMapping 提供的映射信息确定请求所对应的处理方法。该可以定义在类或者方法处,二者的区别是:
- 类定义处:提供初步的请求映射信息。相对于 WEB 应用的根目录
- 方法处:提供进一步的细分映射信息。相对于类定义处的 URL。若类定义处未标注 @RequestMapping,则方法处标记的 URL 相对于 WEB 应用的根目录
看不懂直接看例子:
@Controller
@RequestMapping("hello") // 定义在类上
public class HelloController {
@RequestMapping("/h1") // 定义在方法上
public String hello(Model model) {
model.addAttribute("msg", "Hello,SpringMVC!");
return "hello";
}
}
属性
- value:指定请求的实际地址。
- method: 指定请求的method类型, GET、POST、PUT、DELETE 等。
- params:指定处理请求的提交内容类型(Content-Type),例如 application/json ,text/html。
- headers:指定返回的内容类型,仅当 request 请求头中的(Accept)类型中包含该指定类型才返回。
- consumes:指定 request 中必须包含某些参数值时,才让该方法处理。
- produces:指定 request 中必须包含某些指定的 header 值,才能让该方法处理请求。
@PathVariable
通过 @PathVariable 注解可以将 URL 中占位符参数绑定到控制器处理方法的入参中:
@Controller
@RequestMapping("hello")
public class HelloController {
@RequestMapping("/h2/{name}")
public String hello2(@PathVariable String name, Model model) {
String str = "欢迎光临 " + name + " ~~~";
model.addAttribute("msg", str);
return "hello";
}
}
然后在 http://localhost:8080/hello/h2/ 后填写 name:
换一个 name:
与此类似的有百度百科,修改 URL 最后的名字,就能跳转到相应的资料: