spring mvc 中有很多的注解,每个注解都有自己的功能,下面我们就对spring mvc中的注解一一作出介绍。关于spring的注解还没有总结,请等待后续blog更新。
@controller
org.springframework.stereotype.Controller注解类型用于指示当前类是一个控制器。 Spring使用扫描机制查找应用程序中所有基于注解的控制器类,分发器会扫描使用该注解类的方法,并检测方法是否使用了@RequestMapping注解,只用使用了@RequestMapping注解的方法才能用来处理请求。
为了保证spring能找到控制器,需要完成两件事情:
- 在spring mvc的配置文件的头文件中引入spring-context。
- 在spring mvc 的配置文件中使用,该元素的功能是齐东东包扫描功能,以便注册有@Controller、@Service、@Repository、@Component等注解的类成为spring的bean。
<context:component-scan base-package = "com.chris.controller"/>
@RequestMapping
该注解类型指示spring用哪一个类或方法来处理请求动作,可以用于类或方法。
@Controller
// RequestMapping可以用来注释一个控制器类,此时,所有方法都将映射为相对于类级别的请求,
// 表示该控制器处理所有的请求都被映射到 user属性所指示的路径下
@RequestMapping(value="/user")
public class UserController{
// 映射请求 user/register
@RequestMapping(value="/register",method=RequestMethod.GET)
public String registerForm() {
// 跳转到注册页面
return "registerForm";
}
// 映射请求 user/login
@RequestMapping("/login")
public String login( Model model) {
return "loginForm";
}
}
@RequestMapping可以指定一些属性
- value:用来映射一个请求和一个方法,是其默认属性,如果在使用@RequestMapping时只有这个属性,则可以省略关键字value.
- method:该属性用来指定该方法仅仅处理哪些HTTP请求的处理方式,例如GET、POST。
- consumes:用来指定处理请求提交内容的类型。
- produces:用来指定返回的内容类型,返回的内容类型必须是request请求头(Accept)中包含的类型。
- params:指明request中必须包含哪些参数时,才让该方法处理。例如下面的代码指明方法只处理其中名为"myParam",值为"myValue"的请求。
@RequestMapping(value="/hello", method = RequestMethod.POST, params = "myParam = myValue")
- headers 指明request中必须包含某些header值,才能让该方法处理请求,例如
@RequestMapping(value="/hello", method = RequestMethod.POST, header = "bolgID = http://www.cnblogs.com/arax/")
在使用@RequestMapping指定的方法中,如果要访问HttpServletRequest或HttpSession,可以将其直接作为参数,Spring会将对象传递给方法。
@RequestMapping("/hello") public String login(HttpSession session) { return "hello"; }
@RequestParam
该注解将指定的请求参数赋值给方法中的形参。
java @RequestMapping("/hello") { public String login( @RequestParam("loginName") String loginName, @RequestParam("password") String password ) { return "login"; } }
在执行上面函数时,springmvc 会将Request中的loginName,password从参数中取出来赋值给函数的形参。
@RequestParam中的属性如下:
- name:绑定参数在Request中的名称。
- value:name属性的别名。
- required:参数是否必须绑定。
- defaultValue:如果没有传递参数而使用的默认值。
@RequestParam(value="loginname",required=true,defaultValue="admin")
@PathVariable
@PathVariable只支持一个属性value,类型为String,表示绑定的名称,如果省略则表示绑定同名参数。
@RequestMapping("path/{userId}")
public String login(@PathVariable Integer userId) {
return "login";
}
加入请求url为http://localhost:8080/path/3,则上述函数在执行时会自动将userId值映射为3。
@RequestHeader
将请求头信息区书记映射到处理方法上。其主要有如下属性
- name:指定请求头绑定的名称。
- value:name属性的别名。
- required:参数是否必须绑定。
- defaultValue:如果没有传递参数而使用的默认值。
和@PathVariable的属性相同。下面给出用法实例
java @RequestMapping("/hello") { public String login( @RequestHeader("User-Agent") String userAgent, @RequestHeader(value="Accept") String[] accepts ) { return "login"; } }
@CookieValue
将请求的Cookie书记映射到功能处理方法参数上。其支持的属性如下:
- name:指定请求头绑定的名称。
- value:name属性的别名。
- required:参数是否必须绑定。
- defaultValue:如果没有传递参数而使用的默认值。
用法和@RequestParam相同,这里不再赘述。
@SessionAttribute
该注解允许我们有选择的将指定Model
中的哪些属性转存到HttpSession对象中。其只能声明在类上。他包含3个属性。
使用如下
@Controller
// 将Model中的属性名为user的放入HttpSession对象当中
@SessionAttributes("user")
public class SessionAttributesController{
@RequestMapping(value="/{formName}")
public String loginForm(@PathVariable String formName){
// 动态跳转页面
return formName;
}
@RequestMapping(value="/login")
public String login(
@RequestParam("loginname") String loginname,
@RequestParam("password") String password,
Model model ) {
User user = new User();
user.setLoginname(loginname);
user.setPassword(password);
user.setUsername("admin");
model.addAttribute("user",user);
return "welcome";
}
}
@ModelAttribute
@ModelAttribute只有一个属性value,类型为String,表示绑定数据类型的名称。其使用方法以及表现形式比较多变,容我娓娓道来。@ModelAttribute主要用来修饰方法,被其修饰的方法会在Controller中每个方法执行前被执行,因此在一个Controller类要映射多个URL时,要谨慎使用。
我个人理解被@ModelAttribute修饰的方法,是在执行映射方法前对Model的预处理。
注解返回具体类的方法
@Controller
public class ModelAttribute1Controller{
// 使用@ModelAttribute注释的value属性,
// 来指定model属性的名称,model属性对象就是方法的返回值
@ModelAttribute("loginname")
public String userModel(
@RequestParam("loginname") String loginname){
return loginname;
}
@RequestMapping(value="/login1")
public String login() {
return "result1";
}
}
userModel会先于login执行,并在Model中以loginname为属性名称,userModel返回值为属性值,在Model中放入了一个属性。
注解无返回值的方法
@Controller
public class ModelAttribute2Controller{
// model属性名称和model属性对象由model.addAttribute()实现,
// 前提是要在方法中加入一个Model类型的参数。
// 注意:当URL或者post中不包含对应的参数时,程序会抛出异常。
@ModelAttribute
public void userModel(
@RequestParam("loginname") String loginname,
@RequestParam("password") String password,
Model model){
model.addAttribute("loginname", loginname);
model.addAttribute("password", password);
}
@RequestMapping(value="/login2")
public String login() {
return "result2";
}
}
在这个例子中userModel先于login执行,相当于将一段对model的预处理逻辑单独放到一个函数中。
注解返回具体类的方法
@Controller
public class ModelAttribute3Controller{
// model属性的名称没有指定,它由返回类型隐含表示,
// 如这个方法返回User类型,那么这个model属性的名称是user。
// 这个例子中model属性名称由返回对象类型隐含表示,
// model属性对象就是方法的返回值。它不需要指定特定的参数。
@ModelAttribute
public User userModel3(
@RequestParam("loginname") String loginname,
@RequestParam("password") String password){
return new UserUpperCase(loginname, password);
}
@RequestMapping(value="/login3")
public String login3() {
return "result3";
}
}
例子中@ModelAttribue没有参数,修饰的函数的返回值为User的对象,这时会以类名的首字母小写为属性名,返回值为属性值,在Model中放入一个属性。
@ModelAttribute和@RequestMapping同时注解同一个方法
@Controller
public class ModelAttribute4Controller{
// 这时这个方法的返回值并不是表示一个视图名称,而是model属性的值,
//视图名称是@RequestMapping的value值。
// Model属性名称由@ModelAttribute(value="")指定,相当于在request中封装了
//username(key)=admin(value)。
@RequestMapping(value="/login")
@ModelAttribute(value="username")
public String login() {
return "admin";
}
}
此时login方法的返回值不在是一个视图的名称,而是model属性的值,视图的名称仍然是@RequestMapping的value值"/login"。处理结束后页面继续跳转到login.jsp。
至此,SpringMVC中注解基本介绍完,后续请关注spring注解介绍。
原文地址:https://www.cnblogs.com/arax/p/8505093.html