Controller注解
在Spring中 Controller注解用于指示Spring类的实例是一个控制器,相对于实现Controller接口变得更加简单。并且实现Controller接口只能处理一个单一的请求,而是用@Controller注解能够支持同时处理多个请求动做,更加灵活。
@Controller用于标记一个类,使用他标记的类就是一个SpringMVC Controller对象,即一个控制器类,Spring使用扫描机制查找应用程序中全部基于注解的控制器类。分发处理器会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解的方法才是真正处理请求的处理器。
在使用Controller注解前,须要在Spring配置文件中打开注解扫描html
Controller 注解用法
在使用注解前,建立一个 SpringMVC工程:【SpringMVC】SpringMVC入门实例java
@Controller
public class LoginControl {
@RequestMapping(value = "/index/login")
public String login(){
return "login";
}
}
@Controller表示该类是一个控制器类,@RequestMapping注解用来映射一个请求,value="/index/login"表示请求由该注解下的login方法进行处理。
因此当请求’/index/login’的地址,能够转发到LoginControl的login()方法进行处理
web
前面的RequestMapping注解也能够加到Controller类上 ,以下所示,请求获得一样的结果app
@Controller
@RequestMapping("/index")
public class LoginControl {
@RequestMapping(value = "/login")
public String login(){
return "login";
}
}
Controller 接收请求参数
经过形参接收请求参数
首先在以前的工程(【SpringMVC】SpringMVC入门实例)上增长以下修改
login.jsp修改以下:jsp
Title名字:
年龄:
增长success.jspide
Title添加成功
在LoginControl中添加 add()方法,该方法增长两个参数age和name,该参数名称须要和表单input中name的名称一致。svg
@Controller
@RequestMapping("/index")
public class LoginControl {
@RequestMapping(value = "/login")
public String login(){
return "login";
}
@RequestMapping(value = "/add")
public String add(int age,String name){
System.out.println("age:"+age+" name:"+name);
return "success";
}
}
请求结果以下:
post
控制台打印了请求参数信息
ui
经过实体Bean 接收请求参数
在前面工程基础上新建实体类Userthis
public class User {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
将LoginControl中 的add()方法参数修改以下:
@Controller
@RequestMapping("/index")
public class LoginControl {
@RequestMapping(value = "/login")
public String login(){
return "login";
}
@RequestMapping(value = "/add")
public String add(User user){
System.out.println("user:"+user );
return "success";
}
}
执行结果:
经过HttpServletRequst接收请求参数
将LoginControl中 的add()方法参数修改以下:
@Controller
@RequestMapping("/index")
public class LoginControl {
@RequestMapping(value = "/login")
public String login(){
return "login";
}
@RequestMapping(value = "/add")
public String add(HttpServletRequest request){
System.out.println("request age:"+ request.getParameter("age") );
System.out.println("request name:"+ request.getParameter("name") );
return "success";
}
}
打印以下:
经过RequestParam注解接收请求参数
RequestParam注解做用:把请求中的指定名称的参数传递给控制器中的形参赋值
注解属性
value:请求参数中的名称
required:请求参数中是否必须提供此参数,默认值是true,必须提供
将LoginControl中 的add()方法参数修改以下:
@Controller
@RequestMapping("/index")
public class LoginControl {
@RequestMapping(value = "/login")
public String login(){
return "login";
}
@RequestMapping(value = "/add")
public String add(@RequestParam(value="name",required=false)String username,@RequestParam(value="age",required=false)String age){
System.out.println("RequestParam age:"+ age);
System.out.println("RequestParam name:"+ username );
return "success";
}
}
打印以下:
经过PathVariable注解接收请求参数
PathVariable注解做用:拥有绑定url中的占位符的。例如:url中有/delete/{id},{id}就是占位符
注解属性 value:指定url中的占位符名称
优势:Restful风格的URL 请求路径同样,能够根据不一样的请求方式去执行后台的不一样方法
在login.jsp中添加一个a标签
Title名字:
年龄:
将LoginControl中 添加sayHello()方法:
@Controller
@RequestMapping("/index")
public class LoginControl {
@RequestMapping(value = "/login")
public String login(){
return "login";
}
@RequestMapping(value = "/add")
public String add(@RequestParam(value="name",required=false)String username,@RequestParam(value="age",required=false)String age){
System.out.println("RequestParam age:"+ age);
System.out.println("RequestParam name:"+ username );
return "success";
}
@RequestMapping(path="/hello/{id}")
public String sayHello(@PathVariable(value="id") String id) {
System.out.println("id="+id);
return "success";
}
}
经过ModelAttribute注解接收请求参数
ModelAttribute注解做用
出如今方法上:表示当前方法会在控制器方法执行前线执行。
出如今参数上:获取指定的数据给参数赋值。
修饰的方法有返回值
给User中添加一个id属性,再到UserController中添加一个parameterUser()方法,给user添加id,
在add方法中user已经被上面的parameterUser先执行了修改,已经给id赋值
@Controller
@RequestMapping("/index")
public class LoginControl {
@RequestMapping(value = "/login")
public String login(){
return "login";
}
@ModelAttribute
public User parameterUser(){
User user = new User();
user.setId(1);
return user;
}
@RequestMapping(value = "/add")
public String add(User user){
System.out.println("user :"+ user);
return "success";
}
}
修饰的方法没有返回值
在上面案例基础上,把parameterUser的返回值去掉,增长一个Map来存储数据,存储的key为user,在add方法中使用@ModelAttribute(“user”)User user获取在parameterUser()方法中赋值的数据。程序运行后,add方法的user参数能取到parameterUser方法赋值的数据。 执行结果同上
@Controller
@RequestMapping("/index")
public class LoginControl {
@RequestMapping(value = "/login")
public String login(){
return "login";
}
@ModelAttribute
public void parameterUser(Map userMap){
User user = new User();
user.setId(2);
userMap.put("user",user);
}
@RequestMapping(value = "/add")
public String add(@ModelAttribute("user")User user){
System.out.println("user :"+ user);
return "success";
}
}