@Controller:修饰类,表示这个类可以作为动态资源的承载容器
这个类下允许出现一些方法,这些方法最终表现成Web动态资源
被这些注解中一个修饰的方法(并且存在于@Controller修饰的类中),会被作为一个动态资源存在,资源最终的URL路径,就是注解中标注的路径.
@RequestMapping:这个动态资源支持所有的HTTP方法
@GetMapping:这个动态资源只支持HTTP的GET方法
@PostMapping:这个动态资源只支持HTTP的POST方法
@Controller
public class Web2 {
@GetMapping("/demo")
@ResponseBody
public String name(@RequestParam("age") String age){
System.out.println(age);
return "<h1>成功</h1>";
}
}
@ResponseBody: 这个注解修饰的方法,表示该方法完整的返回了整个响应体的内容,方法返回的String类型的值,会被当做HTTP的响应的响应体
这个类从没被实例化过web2,方法也没有被调用过name.
其实是Ioc在做事情
1. run方法会扫描web1包下的所有类文件(*.class),找到被@Controller注解修饰的类
2.利用Java的反射机制(运行期间操作类文件的能力),将刚才得到的类实例化.
3. 扫描该类下的所有方法反射机制,找到所有被@RequestMapping修饰的方法
读取资源路径,最终得到类似该结构的Map
Map<String,方法> key是资源路径 value是具体哪个方法
4. 当请求来临时,Sping通过HTTP请求的标准格式,可以解析出本次请求的资源路径是什么,记为path,根据path去第三步map中找到对应的方法
5.调用该方法
我们在浏览器中输入URL都是GET方法访问.
POST请求:不借助第三方工具只有两种方法1.form表单2.使用JS发起HTTP请求(ajax)
通过ajax发送请求
//1.实例化一个XMLHttpReques对象,简称XHR对象
var xhr = new XMLHttpRequest()
//2.调用对象的open()方法,设置发起请求1.方法2.资源路径
xhr.open('post','/demo')
//3.设置回调函数,当/demo资源响应返回时,应该干什么
//通过事件绑定机制
xhr.onload = function(){
console.log(xhr.status)
console.log(xhr.responseText)
}
// 4. 真正发送请求出去
xhr.send()
执行顺序:1,3,4,2
GET VS POST区别
1.get是幂等的无副作用:每次查询的结果都一样,不会改变表中的数据
post是不幂等的有副作用: 第一次执行成功,不代表以后会成功,并且会修改表中的数据
2.幂等性 + 无副作用的HTTP请求是可以被缓存的,反之不允许
3.get把数据携带在URL中,post携带在请求体中
4.post比get安全,get放在URL中容易被看到
5. get是key-value形式,post比较灵活