一、准备工作
相关配置类导包请参考另一篇文章
可以基于Servlet开发比较。SpringMVC基于“方法”处理请求,一个请求对应的就是一个方法进行处理;Servlet基于”类“处理请求,一个请求对应的就是一个Servlet进行处理。
SpringMVC——基于Servlet开发https://mp.youkuaiyun.com/mp_blog/creation/editor/139779731
二、相关代码
1.接受请求
前端控制器DispatcherServlet接收请求,SpringMVC已提供
@RestController 等价于@Controller + @ResponseBody , 更适用于前后端分离项目,意味着本Controller所有方法都返回json数据
@Controller 等价于@Component,标识当前组件注册至IOC容器中,更适用于前后端不分离项目
@RequestMapping("/user") 使用在类上,窄化命名空间
@RequestMapping("/login") 使用在方法上,url映射
2.请求参数
参数绑定
1.简单类型
@RequestParam("xxx") 简单类型 xxx
@RequestParam("username") String username,RequestParam可写可不写,方法形参和绑定数据相同即可。
@RequestMapping("/login1")
public String login1(@RequestParam("username") String username, String password , Model model){
User user = userService.login(username, password);
if(user!=null){
//将登陆者信息存储至请求作用域
model.addAttribute("username" , username);
//登陆成功 请求转发"forward:xxx"
return "/success.jsp";
}else{
//登陆失败
return "/fail.jsp";
}
}
2.pojo类型
XxxQueryVO 传递的数据key必须与VO类中属性名一致
可以创建一些VO类数据,如登录时使用UserVO,只需要在里面放置username和password即可,无需接受其余参数。
@RequestMapping("/login2")
public String login2(UserQueryVO queryVO , Model model){
User user = userService.login(queryVO.getUsername(), queryVO.getPassword());
if(user!=null){
//将登陆者信息存储至请求作用域
model.addAttribute("username" , user.getName());
//登陆成功 请求转发"forward:xxx"
return "/success.jsp";
}else{
//登陆失败
return "/fail.jsp";
}
}
3.路径变量
路径变量 /url/{xxx} @PathVariable("xxx") 数据类型 xxx
例如删除数据常用,根据id删除数据,将数据唯一标识放在url路劲中,@PathVariable("key")可将路径中的 key 去除。 @PathVariable("id") Integer id
@RequestMapping("/del/{id}")
public String del(@PathVariable("id") Integer uid){
boolean flag = userService.delete(uid);
if(flag){
return "/success.jsp";
}
return "/fail.jsp";
}
4.json数据
可通过@RequestBody,将json数据转换成java对象。
@RequestMapping("/login3")
public String login3(@RequestBody UserQueryVO queryVO , Model model){
User user = userService.login(queryVO.getUsername(), queryVO.getPassword());
if(user!=null){
//将登陆者信息存储至请求作用域
model.addAttribute("username" , user.getName());
//登陆成功 请求转发"forward:xxx"
return "/success.jsp";
}else{
//登陆失败
return "/fail.jsp";
}
}
5.默认支持
HttpServletRequest:request,请求;
HttpServletResponse response,响应;
HttpSession session 会话,可将数据数据存储至会话作用域(session.setAttribute());
Model/ModelMap model,将数据存储至请求作用域(model.addAttribute());
3.页面跳转
1.请求转发
适用于前后端不分离项目
return "xxx"; return "forward:xxx"; retuen ModelAndView对象(mv.setViewName("/success.jsp"));
当客户端发送http请求,Web服务器接收此请求并调用内部的一个方法在容器内部完成请求处理和转发动作,然后将目标资源发送给客户。需要注意的是,这里转发的路径必须是在同一个Web容器下的URL,它不能转向到其他的Web路径上。此时客户端浏览器的地址栏中显示的是第一次访问的路径,也就是说客户端察觉不到服务器的转发操作。请求转发是浏览器只做了一次请求。如果为form表单提交数据,页面刷新后仍会在同一页面中,同时会再次提交一次数据,有一定风险。
2.重定向
return "redirect:xxx"
当客户端发送http请求,Web服务器接收此请求后发送302状态码响应,并将新的location给客户端。客户端发现是302响应,则自动再发送一个新的http请求,请求的URL是新的location地址,服务器根据此请求寻找资源并发送给客户。
这里的location可以重定向到任意的URL,由于浏览器重新发出了新的请求,所以在客户端浏览器的地址栏中显示的是重定向后的路径,客户端可以观察到地址的变化。重定向行为是浏览器做了至少两次的访问请求。
4.响应json数据
适用于前后端分离项目。
方法上:使用@ResponseBody 将当前方法放啊会的Java对象转成Json数据格式返回;
类上:使用@RestController 将当前类中的所有方法返回值都以Json数据格式进行返回。
5.从后台将数据传递给前端
Model model model.addAttribute("username" , username); 数据存储至请求作用域;
HttpSession session session.setAttribute("msg2" , "msg2信息"); 数据存储至会话作用域
@RequestMapping("/find1")
public String find1(HttpServletRequest request , HttpServletResponse response , HttpSession session , Model model){
//将数据存储至请求作用域
model.addAttribute("msg1" , "msg1信息");
//将数据存储至会话作用域
session.setAttribute("msg2" , "msg2信息");
return "/success.jsp";
}
ModelAndView mv = new ModelAndView(); mv.addObject("msg1" , "msg1信息"); 数据存储至请求作用域。
@RequestMapping("/find2")
public ModelAndView find2(HttpSession session){
//将数据存储至会话作用域
session.setAttribute("msg2" , "msg2信息");
ModelAndView mv = new ModelAndView();
//将数据存储至请求作用域
mv.addObject("msg1" , "msg1信息");
//设置跳转逻辑视图名
mv.setViewName("/success.jsp");
return mv;
}