您现在的位置是:首页 >学无止境 >Spring Mvc网站首页学无止境
Spring Mvc
一.什么是SpringMVC
SpringMVC是对MVC思想的具体实现,它是一个继承Servlet API的框架,是一个Web框架,当我们在地址栏输入URL的时候,SpringMVC项目就能感知到我们的请求
MVC其实就是Model、View、Controller的缩写,它是一种设计思想,是一种软件架构模式
用户发送请求给Controller,Controller主要是用来安全校验的,来验证前端传来的参数是否合法,
然后Controller把请求信息在转发给Model,Model是一种数据模式(把Controller发送过来的数据进行计算,然后把结果返回给控制器),这时控制器并不会直接把结果给用户,因为Model传过来的数据用户可能看不懂,因此Controller会把Model返回来的结果先交给View(进行数据解析,然后渲染,)把能看懂的数据交给用户。
二.SpringMVC项目的创建
SpringMVC项目的创建
三 @RequestMapping注解
是Spring Web应用程序最常见的注解之一,它用来注册接口的路由映射,
路由映射指的是当一个用户访问url的时候,将用户的请求对应到程序中某个类的某个方法的过程
@RequestMapping("/up") //路由注册
@RestController
public class Hello {
@RequestMapping("/say")
public String sayhi(String name)
{
return name;
}
@ RequestMapping可以修饰类,也可以修饰方法,当修饰类和方法时,访问的地址是类+方法
也可以直接修饰在方法上,类上不加
@RequestMapping("/say")
public String sayhi(String name)
{
return name;
}
此时访问的地址是方法
四. 获取参数
(1)获取单个参数
@RequestMapping("/say")//路由注册
public String sayhi(String name)
{
return name;
}
(2)获取多个参数
@RequestMapping("/saye")
public String saye(String name,Integer age)
{
return "姓名是:"+name+"年龄是"+age;
}
这里注意一点,age我们最好是声明它为Integer 类型,这样当我们不给它传参数的时候它会默认为null,如果是int类型,我们不给它传参数则会报错
(3)获取普通对象
import lombok.Data;
@Data
public class Student {
public String name;
public Integer age;
public Integer id;
}
@RequestMapping("/sayu")
public Object sayu(Student student)
{
return student;
}
()
(4)用RequestBody获取json对象
@RequestMapping("/sayp")
public Object sayp(@RequestBody Student student)
{
return student;
}
@RequestMapping默认支持那些请求方法呢?我们用postman测试一下
这种情况下默认支持所有的请求方法,
那如何指定请求方法呢?
以指定get方法为例
(1)通过注解指定相应的请求方法
(2) 通过给method赋值的方式指定
(5) 后端参数重命名的获取
受实际业务场景的需要,前端传过来的参数和后端实际接收的不一样,这时候我们@RequestPara
这个注解
在@RequestParam注解中我们用value声明前端的参数,然后再把这个参数赋给name,这样就解决了前后端参数不一致的问题
@RequestMapping("/saym")
public Object saym(@RequestParam(value = "username") String name)
{
return name;
}
这里其实还涉及到另一个参数required,默认情况下required为true,当前端传过来的参数不是username的时候就会报错
此时如果我们把required设置为false,此时意味着前端可传可不传username参数,此时如果我们不传username此时不会报错,但是因为没拿到这个参数,最后返回的name是null
(6)@PathVariable获取基础Url中的参数
@RequestMapping("/sayo/{name}/{password}")
public String saye(@PathVariable String name,@PathVariable String password )
{
return name+password;
}
当前端和后端参数不一致时,
用value重命名一下
@RequestMapping("/sayo/{name}/{pwd}")
public String saye(@PathVariable String name,@PathVariable(value="pwd") String password )
{
return name+password;
}
当前端参数可传可不传,我们可以将required置为false
@RequestMapping("/sayo/{name}/{pwd}")
public String saye(@PathVariable String name,@PathVariable(required = false) String password )
{
return name+password;
}
这时password值为null
(7)cookie和header的获取
传统获取cookie和header
@RequestMapping("/getck2")
public Object getck2(HttpServletResponse response,HttpServletRequest request)
{
String name=request.getParameter("name");
Cookie[]cookies=request.getCookies();
String useragent=request.getHeader("User-Agent");
return name+" "+useragent;
}
我们发送一个请求,然后看一下返回结果
然后我们在抓一下包,看一下信息
更简单的方式通过注解@CookieValue获取cookie
@RequestMapping("/getck")
public Object getck(@CookieValue(value ="Cookie_1",required = false) String cookie)
{
return cookie;
}
更简单的方式通过注解@RequestHeader方式获取Header
@RequestMapping("/getheader")
public Object m(@RequestHeader("User-Agent") String useragent)
{
return useragent;
}
(8)session的获取
传统的获取session的方式
@RequestMapping("/setsession")
public void set(HttpServletRequest request)
{
//参数设置为true,如果不存在session,就创建一个session
HttpSession session= request.getSession(true);
if(session!=null)
{
session.setAttribute("username","java");
}
}
@RequestMapping("/getsession")
public String get(HttpServletRequest request)
{
HttpSession session= request.getSession();
String username="";
if(session!=null&&(String)session.getAttribute("username")!=null)
{
username=(String)session.getAttribute("username");
}
return username;
}
更简洁地通过 @SessionAttribute注解来获取
@RequestMapping("/getsess")
public Object getsess(@SessionAttribute("username") String name)
{
return name;
}
(9)上传文件:@RequestPart
我们使用postman发送请求
前端三要素:
1.请求方法:get
2.设置key:myfile
3.选择要上传的文件
那么服务器这边接收到文件如何存储呢?这里我们介绍一下本地存储的方式
本地存储:将文件存储到本地服务器磁盘里
(1)指定路径和文件名
这里要注意一点,如果我们上传的文件比较大的话,会报错,在SpringBoot中,文件上传,默认单个文件大小为10MB,如果上大文件的话,我们在application.properties配置文件里进行一下配置:
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB
这种写法是存在问题的,当我们再重新上传图片的时候,后面的图片会覆盖前面的,因为它们的路径和文件名相同 ,要解决这一问题,我们,可以随机生成文件名
(2)randomUUID()方法随机生成文件名
@RequestMapping("/hii")
public Object hii(@RequestPart("myfile") MultipartFile file)
{
//randomUUID()方法随机生成文件名
String newflie= UUID.randomUUID()+file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
System.out.println(newflie);
File fileave=new File("D:\123\student\"+newflie);
try {
file.transferTo(fileave);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
五. 返回数据
(1).返回前端页面
在static文件夹底下,我们建一个hi.html文件
然后我们通过代码的方式返回这个页面:
@RequestMapping("/gethtml")
public Object gethtml()
{
return "hi.html";
}
然后我们输入url访问发现报错了
这时因为我们get.html底下并没有hi.html这个文件,这时我们再加上一个/,返回一个/hi.html(表示从从根目录下去找这个界面)
(2)返回数据
类外添加@ResponseBody这个注解表示返回数据而不是界面,当类使用@Controller这个注解的时候,我们还可以使用@RestController(相当于@Controller@ResponseBody)
@RestController
RestController
public class Hello {
@RequestMapping("/say")
public String sayhi(String name)
{
return name;
}
@Controller@ResponseBody
@Controller
@ResponseBody
public class Hello {
@RequestMapping("/say")
public String sayhi(String name)
{
return name;
}
六.请求转发或请求重定向
请求转发和请求重定向的区别:
含义不同
(1)请求转发指的是客户端发送一个请求给服务器,然后服务器会将请求转发给目标地址,然后再将目标地址返回的结果返回给服务器
(2)请求重定向指的是:客户端发送一个请求给服务器,然后服务器会向客户端返回一个临时响应头,这个响应头里记录了再次发送请求的URL地址,然后客户端重新发送请求到这个新的URL地址
请求方不同
(1)请求转发服务器的行为,服务器代替客户端发送请求,然后把结果返回给客户端
(2)重定向是客户端的行为,服务器将目标地址返回给客户端,然后客户端再重新发送请求到目标地址
(3)数据共享不同
请求转发:客户端只发送一次请求,所以客户端发送请求到服务器返回结果的过程中数据是共享的,请求重定向:客户端一共发送两次请求,所以两次请求的数据是不共享的。
(4)最终的url不同
请求转发的URL不变,而请求重定向的URL会变成服务器返回的地址
(5)代码实现方式不同
请求转发
@RequestMapping("/get")
public Object get()
{
return "forward:/hi.html";
}
我们看到请求转发的URL不变
请求重定向
@RequestMapping("/gete")
public Object gete()
{
return "redirect:/hi.html";
}
而请求重定向的URL是要变的