目录
Spring MVC基本概念
Spring MVC主要工作
一:实现连接
二:获取参数
1.获取一个或多个参数
2.通过HttpServletRequest对象获取参数
3.获取一个对象
4.使用@RequestBody注解,获取json格式的对象
获取上传文件
获取Header
返回数据
返回静态页面
请求转发和请求重定向
请求转发(forward)
请求重定向(redirect)
请求转发和请求重定向的区别
Spring MVC 是基于 Servlet API 构建原始的 Web 框架,可以实现 http 响应,内置在 Spring 框架中
MVC:Model View Controller缩写,是软件工程中的一种软件架构模式,把系统软件分为模型,视图,控制器三个部分
1.建立连接:将用户(浏览器) 和 Java 程序连接起来,当浏览器访问一个地址的时候,能够调用到 Spring程序
2.获取参数:前端用户访问会带一些参数,在程序中要获取到这些参数
3.输出数据:执行业务逻辑后,把程序的执行结果返回给用户
@Controller // 把当前类加载到 SpringIoc容器中
@ResponseBody // 返回的是数据,不是页面
@RequestMapping("/user") // 路由规则注册
public class UserController {
@RequestMapping("/say") //路由规则注册
public String sayHi(){
return "hi mvc";
}
}
在一些场景中,我们需要限定只有一种或多种http请求方式才可以访问当前方法,例如现在要求只有 post 请求才可以访问到当前sayHi方法,就需要在RequestMapping 括号里设置method 参数
@Controller // 把当前类加载到 SpringIoc容器中
@ResponseBody // 返回的是数据,不是页面
@RequestMapping("/user") // 路由规则注册
public class UserController {
@RequestMapping(value = "/say",method = RequestMethod.POST) //路由规则注册
public String sayHi(){
return "hi mvc";
}
}
此时我们再在浏览器中输入url时(默认是get请求),就访问不到sayHi方法了
当然我们也可以直接使用注解的方式@PostMapping @GetMapping...
@Controller // 把当前类加载到 SpringIoc容器中
@ResponseBody // 返回的是数据,不是页面
@RequestMapping("/user") // 路由规则注册
public class UserController {
@PostMapping(value = "/say") //路由规则注册
public String sayHi(){
return "hi mvc";
}
}
@RequestMapping("/sayName")
public String sayName(String name){
return "hi " + name;
}
这里查询字符串的key 要和方法里面的参数相同,如果不同,或者没有传参,参数为默认值.注意如果方法里面需要传入的参数是基本类型,又没有传参或传入的key和参数不同,此时会报错
@RequestMapping("/sayId")
public String sayId(int id){
return "hi " + id;
}
所以我们在参数传递不要使用基本数据类型,基础数据类型不传传参时会报错
@RequestMapping("/sayName2")
public String sayName2(HttpServletRequest request){
return "hi " + request.getParameter("name");
}
先创建一个类,用来接收传过来的对象
@Data
public class Userinfo {
private int id;
private String name;
public String password;
private int age;
}
把这个对象作为一个形参,传递到对应方法中就可以了
@RequestMapping("/reg")
public Object reg(Userinfo userinfo){
System.out.println(userinfo);
return userinfo;
}
有些场景下,前端传递的key名和后端的参数名不一样,我们可以使用@RequestParam注解,使用了该注解默认必须要传递这个参数(required = true),如果不想这样就要手动把required设置成false
@RequestMapping("/sayName3")
public String sayName3(@RequestParam(value = "uname",required = false) String name){
return "hi " + name;
}
这里我们传的key是uname,而参数是name,仍然可以获取到,就是因为使用了@RequestParam注解
@RequestMapping("/reg2")
public Object reg2(@RequestBody Userinfo userinfo){
System.out.println(userinfo);
return userinfo;
}
获取url中文件资源路径中的参数
把参数放在文件资源路径中,搜索引擎在抓包抓取关键字时权重比把参数放在查询字符串中权重高
我们在RequestMapping 路由规则注册中使用{参数名称(前端的参数名称)}的方式,再在方法中的参数前加上@PathVariable的注解方式,如果这里写需要重命名就需要在注解中写好要把前端的哪个参数赋值给当前参数,同样和@RequestParam一样,该注解默认必须要传递这个参数(required = true),如果不想这样就要手动把required设置成false
@RequestMapping("/reg3/{name}/{pwd}")
public Object reg3(@PathVariable("name") String name,@PathVariable("pwd") String password){
return "name: "+name + " password: "+password;
}
这里就要求名称和密码的输入顺序不能改变了
首先我们需要使用@RequestPart注解,输入要上传的文件的前端key值,使用MultipartFile接口,创建一个file对象来接收.再创建一个文件来指定,我们需要把传过来的文件放入到哪个位置,并传入到这个文件.
@RequestMapping("myupload")
public Object upload(@RequestPart("myimg")MultipartFile file){
File saveFile = new File("E:/java/myimg.png");
try {
file.transferTo(saveFile);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
使用PostMan传入文件
但这种方式会有一个问题:后面上传的文件会覆盖前面上传的文件,原因是我们指定的文件名相同都是myimg.png
使用UUID,保证文件名不重复,获取原生文件的格式(后缀),(file.getOriginalFilename通过获取原生文件名,再使用substring截取最后一个点号及以后的内容(后缀))
@RequestMapping("myupload")
public Object upload(@RequestPart("myimg")MultipartFile file){
String fileName = UUID.randomUUID()+
file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
File saveFile = new File("E:/java/"+fileName);
try {
file.transferTo(saveFile);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
获取所有的cookie
@RequestMapping("getcookie")
public void getCookie(HttpServletRequest request, HttpServletResponse response){
//获取所有Cookie信息
Cookie[] cookies = request.getCookies();
}
获取一个cookie
@RequestMapping("getcookie2")
public Object getCookie2(@CookieValue(value = "java",required = false)String java1){
return java1;
}
使用Cookievalue注解,这里段代码的意思是,在前端的众多Cookie中寻找一个叫java的cookie,并把它的值赋值给java1.
@RequestMapping("getHeader")
public Object getHeader(@RequestHeader("User-Agent") String ua){
return "header "+ua;
}
使用RequestHeader注解来获取请求头,此处是在Header中,把key为User-Agent的值赋值给ua
Session的存储和获取
private static final String SESSION_KEY = "USERINFO_SESSION-KEY";
@RequestMapping("/setsession")
public void setSession(HttpServletRequest request){
HttpSession session = request.getSession();
session.setAttribute(SESSION_KEY,"白杨");
}
@RequestMapping("/getsession")
public Object getSession(@SessionAttribute(SESSION_KEY)String name){
return "session "+name;
}
在static的底下创建一个名为index的html
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/index")
public Object getIndex(){
return "/index.html";
}
}
return后面index.html之前加"/",是因为加了/表示在根路径找index.html,如果不加,就是在当前目录"test"底下找index.html
@RequestMapping("/fw")
public Object fw(){
return "forward:/index.html";
}
@RequestMapping("rd")
public Object rd(){
return "redirect:/index.html";
}
请求转发:发生在服务器程序内部,当服务器收到一个客户端的请求后,会先将请求转发给目标地址,再将目标地址返回的结果转发给客户端
请求重定向:请求重定向指的是服务器端接收到客户端的请求后,会给客户端返回一个临时的响应头(Location),这个临时响应头中记录了,客户端需要再次发送请求(重定向)的URL地址,客户端在收到了地址后,会将请求发送到新的地址上.
请求转发地址不改变,请求重定向地址改变