● @RequestMapping 它的作用就是与请求相匹配,如果匹配上了,所修饰的方法才会被执行。
例如:
@RequestMapping(path = “/admin”)发过来的请求就要找这个admin的路径。
● 在日常的使用过程中,我们只要关注两个属性就可以了:
◆ value :(它是 path 的别名)意为请求的路径,这个路径相对于应用的上下文。类型是 一个 String[] ,可以理解为数组。也就是说它可以匹配多个请求路径。
例如: @RequestMapping(value = {"/test","/test2"}),通过test和test2都是可以访问到的。
◆ method: 请求的方法。我们知道 HTTP 协议的请求方式是有 GET 和 POST。或者使用
@GetMapping, @PostMapping
这个两个标签替换@RequestMapping标签,他们就分别表示了GET和POST的请求。
当前的请求只有与@RequestMapping 上指定的属性都匹配的时候,才会执行它所标注的方法。
下面分析几个例子:
①:@RequestMapping(value = “/admin”)请求的方式是没有限制的。即可以是 GET 也可以是 POST,还能是其它的几个。
②:@RequestMapping(value = “/admin”, method = RequestMethod.GET) method给出了请求路径。请求方式只能是 GET。
③:@RequestMapping(value="/admin", method={ RequestMethod.GET , RequestMethod.POST}) method是String[]型的,所以也可以定义多个,这定义的请求方式就只能是 GET 或者 POST。
④:@GetMapping(value = “/test”)接受的都是GET的请求
⑤:@PostMapping(value = “/test”)接受的都是POST的请求
获取请求数据我们编写处理器方法的目的,就是为了处理客户端提交的数据,而客户端的提交是按照 HTTP 协议报文格式来提交的,下面我们分析一段常见的 HTTP 提交的报文来理解报文的各个部分与处理器方法参数的对应关系:
先大概写个页面代码:
Title admin
GET请求:
- 最老式的获取请求数据的方式:(不用了)
参数列表中就直接内置HttpServletRequest,HttpSession,HttpServletResponse 等对象. 使用 request 对象也可以接收
package com.wang.ssm.controller; import com.wang.ssm.service.AdminService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Controller//表示这个类是一个控制层的类,只能在类上添加,表示Spring生成此类的对象 @RequestMapping(path = "/admin")//请求映射,表示路径,也可以添加到方法上面去,提供的是一个映射地址 // 在类上标记映射地址时,整个应用程序中不能重复 //这两个标签是输入Spring MVC的标签内容 public class AdminController { @Autowired//Spring的标签,表示将对象注入进来 AdminService adminService; //SpringMVC可以将HttpServletRequest,HttpServletResponse直接注入到我们的方法当中 @GetMapping(value = "/getAdmin") public void getAdmin(HttpServletRequest request, HttpServletResponse response){ System.out.println(request.getParameter("id")); System.out.println(request.getParameter("name")) } }
点击超链接就可以获得选中这个get请求的发过来的数据:
使用SpringMVC框架中提供的方法使用
- 如果请求的数据和后端接受的名字不一样,可以用
● @RequestParam(“id”) Integer adminId
RequestParam中的是前端发来请求的键名,adminId是后端接受的命名
● @RequestHeader(“User-Agent”) String userAgent接受的请求头中的数据
package com.wang.ssm.controller; import com.wang.ssm.service.AdminService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Controller//表示这个类是一个控制层的类,只能在类上添加,表示Spring生成此类的对象 @RequestMapping(path = "/admin")//请求映射,表示路径,也可以添加到方法上面去,提供的是一个映射地址 // 在类上标记映射地址时,整个应用程序中不能重复 //这两个标签是输入Spring MVC的标签内容 public class AdminController { @Autowired//Spring的标签,表示将对象注入进来 AdminService adminService; @GetMapping(value = "/getAdmin") public void getAdmin(@RequestParam("id") Integer adminId, @RequestParam("name") String adminName, @RequestHeader("User-Agent") String userAgent){ System.out.println(adminId); System.out.println(adminName); System.out.println(userAgent); } }
结果:
如果请求参的名与处理器方法的参数名称相同,那么在使用 @RequestParam 绑定的时候,可以省略参数,甚至连@RequestParam 都可 以省略:
@GetMapping(value = "/getAdmin") public void getAdmin(Integer id, String name){ System.out.println(id); System.out.println(name); }
- 参数绑定与类型转换(这里采用post请求)
当请求参数比较多,通常是将这些参数放到一个实体中,然后只需要在处理器 方法上定义这个实体作为参数。HandlerAdapter 会将这个对象的实例创建出来,然后从请求参数中取出这些参数然后放到实体对象中,需要注意的是请求参数的名字需要与实体类中的属性一对一对应,只有对应的属性才会提取参数的值。
package com.wang.ssm.controller; import com.wang.ssm.service.AdminService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Controller//表示这个类是一个控制层的类,只能在类上添加,表示Spring生成此类的对象 @RequestMapping(path = "/admin")//请求映射,表示路径,也可以添加到方法上面去,提供的是一个映射地址 // 在类上标记映射地址时,整个应用程序中不能重复 //这两个标签是输入Spring MVC的标签内容 public class AdminController { @Autowired//Spring的标签,表示将对象注入进来 AdminService adminService; @PostMapping(value = "/getAdmin") public void getAdmin(Admin admin){ System.out.println(admin); } }
定义好封装的类:
package com.wang.ssm.model; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.stereotype.Component; import java.util.Date; @Component(value = "admin") public class Admin { private Integer id; private String account; private String password; @DateTimeFormat(pattern = "YYYY-MM-dd") private Date birthday; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String toString() { return "Admin{" + "id=" + id + ", account='" + account + ''' + ", password='" + password + ''' + ", birthday=" + birthday + '}'; } }
也是可以从前端接受到数据的:
在这里要注意一下对时间的传递
是要在封装类中对时间定义一下格式的
@DateTimeFormat(pattern = "YYYY-MM-dd") private Date birthday;
封装后应该就不会在日期上出现什么影响。
页面打不开或者书籍传输乱码的问题,请看这一篇:
SpringMVC的过滤静态资源问题和中文乱码处理
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)