前言:
作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年!
相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法系列等,大家有兴趣的可以看一看。
有兴趣的话关注博主一起学习,一起进步吧!
在 Spring MVC 中可以直接用方法中的参数来实现传参,比如以下代码:
@RequestMapping("/m1")
public Object method_1(String name){
System.out.println("参数 name:"+name);
return "/index.html";
}
并且 Spring MVC 可以自动实现参数对象的赋值,比如 Person 对象:
@RestController
@RequestMapping("/test2")
public class TestController {
@RequestMapping("/getName3")
public String getName3(String name,int age){
return "Name:"+name+",age:"+age;
}
}
由于不是通过对象的方式传递,若后期参数发生变化,导致代码会报错,所以代码的维护性不是特别好。那如何接收对象呢?
@Data
public class User {
private int id;
private String name;
private String password;
private int age;
}
@RestController
@RequestMapping("/test2")
public class TestController {
@RequestMapping("/getName3")
public String getName3(String name,int age){
return "Name:"+name+",age:"+age;
}
}
通过属性值和传递值进行对比,如果相互匹配则进行赋值。而多余的属性是无法进行赋值的---》提升了开发的效率。
通过postman实现:
某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,比如前端传递了一个time 给后端,而后端又是有 createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用 @RequestParam 来重命名前后端的参数值。
@RequestMapping("/name")
public String name(@RequestParam("n") String name){
return name;
}
此处必须传n,传name=李四会报错。 此时如何解决呢?
@RequestMapping("/name")
public String name(@RequestParam(value = "n",required = false) String name){
return name;
}
JSON对象:对于前端来说就是JSON对象
对象:是具有多个属性值的
如何传递JSON对象?
//获取前端json对象
@RequestMapping("/add_json")
public User addByJson(@RequestBody User user){
return user;
}
框架判断并转换为相应的类型
//从Path中取到该变量赋值给aid
@RequestMapping("/detail/{aid}")
public Integer detail(@PathVariable("aid") Integer aid){
return aid;
}
@RequestMapping("/detail2/{aid}/{name}")
public String detail2(@PathVariable("aid")Integer aid,@PathVariable("name") String name){
return "aid:"+aid+",name:"+name;
}
@RequestMapping("/upload")
public String upload(@RequestPart("myfile")MultipartFile file) throws IOException {
String path="D:\\image\\img.png";
//保存文件
file.transferTo(new File("path"));
return path;
}
获取 Request 和 Response 对象
@RequestMapping("/param10")
public String param10(HttpServletResponse response, HttpServletRequest requ
est) {
String name = request.getParameter("name");
// 获取所有 cookie 信息
Cookie[] cookies = request.getCookies();
return name + " 你好.";
}
传统获取 header/cookie
@RequestMapping("/param10")
@ResponseBody
public String param10(HttpServletResponse response, HttpServletRequest requ
est) {
String name = request.getParameter("name");
// 获取所有 cookie 信息
Cookie[] cookies = request.getCookies();
String userAgent = request.getHeader("User-Agent");
return name + ":"+userAgent;
}
简洁的获取 Cookie—@CookieValue
@RequestMapping("/getcookie")
public String getCookie(@CookieValue("java") String ck){
return ck;
}
Session 存储和获取
//存session
@RequestMapping("/set_sess")
public String setSess(HttpServletRequest request){
HttpSession session= request.getSession();
if(session!=null){
session.setAttribute("SESSION_KEY","张三");
return "session set success";
}
else{
return "session set fail";
}
}
//获取Session
@RequestMapping("/get_sess")
public String getSess(@SessionAttribute(required = false,value = "SESSION_KEY")String name){
return name;
}
简洁获取 Header—@RequestHeader
@RequestMapping("/header")
@ResponseBody
public String header(@RequestHeader("User-Agent") String userAgent) {
return "userAgent:"+userAgent;
}
//不使用RestController
@Controller
public class TestController2 {
@RequestMapping("/index")
public String index(){
return "hello";
}
}
默认在Resource中寻找 hello.html 的页面(背景:MVC起初是前后端不分离的框架),由于没有找到,访问一级路由会发生报错:
通过创建hello.html进行验证:
Title
I am hello 的配置
@Controller
public class TestController2 {
@RequestMapping("/index")
public String index(){
return "hello.html";
}
}
如何返回一个数据呢?通过添加注解
@Controller
@ResponseBody
public class TestController2 {
@RequestMapping("/index")
public String index(){
return "hello.html";
}
}
可使用 postman 传递参数,或使用 form 表单的方式提交参数。前端页面:
计算器示例
controller 代码:
@ResponseBody
@Controller
@RequestMapping("/calc")
public class CalcController {
@RequestMapping("/sum")
public String sum(Integer num1,Integer num2){
return String.format("计算的结果是:%d
返回",num1+num2);
}
}
@RequestMapping(value = "/login")
@ResponseBody
public HashMap login(String username, String password){
HashMap res = new HashMap<>();
int succ = 200;
if(username!=null && password!=null &&
username.equals("admin") && password.equals("admin")){
res.put("msg","登录成功");
}else{
res.put("msg","登录失败");
}
res.put("succ",succ);
return res;
}
前端代码:
Document
登录
用户:
密码:
return 不但可以返回一个视图,还可以实现跳转,跳转的方式有两种:
请求转发和重定向的使用对比:
// 请求重定向
@RequestMapping("/index")
public String index(){
return "redirect:/index.html";
}
// 请求转发
@RequestMapping("/index2")
public String index2(){
return "forward:/index.html";
}
forward(请求转发)和 redirect(请求重定向)的区别,举例来说,例如,你告诉你妈妈,你想吃辣条,如果你妈妈,说好,我帮你去买,这就是 forward 请求转发;如果你妈妈让你自己去买,那么就是请求 redirect 重定向。
“转发”和“重定向”理解:在中国官方发布的内容越少事也越大,“转发”和“重定向”也是一样:字越少,责任越大。转发是服务器帮转的,而重定向是让浏览器重新请求另一个地址。
forward 和 redirect 具体区别如下:
1. 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
2. 请求重定向地址发生变化,请求转发地址不发生变化。
3. 请求重定向与直接访问新地址效果一直,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问。
请求转发如果资源和转发的页面不在一个目录下,会导致外部资源不可访问,演示示例如下。
controller 示例代码:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/index")
public String sayHi(){
return "forward:/index.html";
}
}
尝试将转发 foward 换成重定向 redirect,如下代码所示:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/index")
public String sayHi(){
return "redirect:/index.html";
}
}
页面就可以正常获取到外部资源 js 了。
@ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成
application/json 返回给前端。
@ResponseBody 可以用来修饰方法或者是修饰类,修饰类表示类中的所有方法都会返回 html 或者json,而不是视图。