springmvc 响应,同步-页面跳转,异步-网络请求返回数据 ; ajax异步交互; restful前后端分离开发风格;
异常统一处理;拦截器
(1)页面跳转=====转发
方式一:简单方式
方式 二: forward关键字:
此关键字的底层就是:request.getRequestDispatcher("跳转路径").forward(req,resp);
此关键字在使用后,不在经过视图解析器进行字符串的拼接...
@RequestMapping("/quick")
public String quick(){
// return "success"; //方式一
// int i=1/0;
return "forward:/WEB-INF/pages/success.jsp"; //方式二
}
方式三:servlet原生API
转发携带数据:(request域)
方式一:ServletAPI
@RequestMapping("/requestApiData") //
public void requestApiData(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws ServletException, IOException{
request.setAttribute("message","requestApiData==方式四转发携带数据:");
request.getRequestDispatcher("/WEB-INF/pages/successData.jsp").forward(request,response);
}
方式二:ModelAndView对象
@RequestMapping("/modelAndView")
public ModelAndView modelAndView(ModelAndView modelAndView){
modelAndView.addObject("message","modelAndView==方式四转发携带数据:");
modelAndView.setViewName("successData");
return modelAndView;
}
方式三:Model对象:
@RequestMapping("/quickModel")
public String quickModel(Model model){
model.addAttribute("message","quickModel==b不会收到的");
return "successData";
}
(2)页面跳转---重定向
方式一:redirect 关键字
此关键字的底层:response.sendRedirect("web项目地址+重定向地址");
而且还在此技术上进行了优化,我们不需要再去编写web项目地址,直接编写重定向地址.
//方式一
@RequestMapping("/redirect")
public String redirect(){
return "redirect:/index.jsp";
}
方式二:servlet原生API
@RequestMapping("/responseRedirect")
public void responseRedirect(HttpServletRequest request,HttpServletResponse response,HttpSession session) throws ServletException ,IOException{
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
需求:
发送$.ajax()
响应new ObjectMapper().writeValueAsString()
关于SpringMVC框架,ajax异步请求,后端响应json
在SpringMVC中,这个功能主要是通过两个注解@RequestBody 和 @ResponseBody实现的
注意:
SpringMVC默认用MappingJackson2HttpMessageConverter对json数据进行转换,需要加入jackson的包
com.fasterxml.jackson.core
jackson-databind
2.9.9
(1)RequestBody
用于接收前端传递的请求体中的json数据, 并可以自动转换封装进指定的对象中。
开启静态资源放行:
页面引入jquery文件
编写ajax代码:
编写User实体类:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String username;
private Integer age;
}
获取请求体的json数据
(2)@ResponseBody
用于将controller方法返回的对象通过转换器转换为指定的格式(通常为json)之后,写入到response对象的响应体中。
总结:
@RequestBody:将请求体中的json字符串,转为指定类型的java对象
@ResponseBody:将java对象转为json字符串,再设置到响应体中,返回到浏览器(客户端)
Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。
应用场景:前(html)后端(servlet)分离开发的架构中(ajax交互)
Restful规范了HTTP请求动作,使用四个词语分别表示对资源的CRUD操作:
GET(获取)、POST(新建)、PUT(更新)、DELETE(删除)
模拟Restful风格代码:ajax交互
/*@Controller
@ResponseBody*/
@RestController
public class RestFulController {
// 查询所有
// @RequestMapping(value = "/user", method = RequestMethod.GET)
@GetMapping("/user")
// @ResponseBody // 就相当于 response.getWriter().write()
public String findAll() {
System.out.println("查询所有");
return "findAll";
}
// 查询一个
// @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
@GetMapping("/user/{id}")
// @ResponseBody
public String findById(@PathVariable Integer id) {
System.out.println("查询一个");
return "findById:" + id;
}
// 新增
// @RequestMapping(value = "/user", method = RequestMethod.POST)
@PostMapping("/user")
// @ResponseBody
public String save(User user) {
System.out.println("新增");
return "save";
}
// 修改
// @RequestMapping(value = "/user", method = RequestMethod.PUT)
@PutMapping("/user")
// @ResponseBody
public String update(User user) {
System.out.println("新增");
return "update";
}
// 删除
// @RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)
@DeleteMapping("/user/{id}")
// @ResponseBody
public String delete(@PathVariable Integer id) {
System.out.println("删除");
return "delete:" + id;
}
}
测试:浏览器默认只能发送:get、post请求
进入公司,如何测试自己后端代码?借助于postman工具,它可以模拟浏览器发送请求(get、post、put、delete)等请求方式...
java对于异常的处理一般有两种方式:
一种是当前方法处理(try-catch),这种处理方式会造成业务代码和异常处理代码的耦合。
一种是当前方法不处理, 出现异常后直接抛给调用者处理。
使用Spring框架后,我们的代码最终是由框架来调用的。也就是说,异常最终会抛到框架中, 然后由框架指定异常处理器来统一处理异常。
(1)自定义异常处理器:
编写异常处理器类:
// 全局异常处理器
public class GlobalExceptionResolver implements HandlerExceptionResolver {
/**
*
* @param request 请求对象
* @param response 响应对象
* @param handler 处理器对象(某一个方法method对象)
* @param ex 异常对象
* @return ModelAndView
*/
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
// 获得异常信息
String message = ex.getMessage();
// 创建 ModelAndView
ModelAndView modelAndView = new ModelAndView();
// 将异常信息存储到model中
modelAndView.addObject("message", message);
// 指定异常友情提示页面
modelAndView.setViewName("forward:/error.jsp");
return modelAndView;
}
}
将对对象交给ioc容器:
注意:
全局异常处理器:
错误页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
error
错误页面...
${message}
(2)@ControllerAdvice
对所有的controller(控制器)进行异常捕获的增强,捕获什么异常自己来定,方法自己写...
/*
对所有controller进行异常增强,底层就是AOP
*/
@ControllerAdvice
public class GlobalControllerAdvie {
// 捕获所有异常(如果没有子异常捕获,老大哥来兜底....)
@ExceptionHandler(Exception.class)
public String resolverHandler(Exception ex, Model model) {
model.addAttribute("message", "捕获所有异常..");
return "forward:/error.jsp";
}
// 捕获空指针异常
@ExceptionHandler(NullPointerException.class)
public String resolverNullPointHandler(NullPointerException npe, Model model) {
model.addAttribute("message", "捕获空指针异常..");
return "forward:/error.jsp";
}
// 捕获数学异常
// 捕获数组越界异常
// 捕获内存溢出异常
}
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class MyGlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public String resolverHandler(Exception ex, Model model){
model.addAttribute("message","捕获异常");
return "forward:/error.jsp";
}
@ExceptionHandler(NullPointerException.class)
public String resolverNullPointHandler(NullPointerException point,Model model){
model.addAttribute("message","空指针异常");
return "forward:/error.jsp";
}
@ExceptionHandler(ArithmeticException .class)
public String resolverNAttHandler(NullPointerException point,Model model){
model.addAttribute("message","算术异常");
return "forward:/error.jsp";
}
}
注意:这个只能捕获SpringMVC的异常问题、
(3)Web.xml (tomcat提供异常处理) 使用web提供的异常机制:
404
/404.jsp
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
CharacterEncodingFilter
/*
DispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:applicationContext.xml
4
DispatcherServlet
/
404
/404.jsp
Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
(1)入门:
编写目标资源(TargetController)
@Controller
public class TargetController {
@RequestMapping("/target")
public String target() {
System.out.println("目标方法执行了...");
return "success";
}
}
自定义拦截器:
// 自定义拦截器
public class MyIntercepter1 implements HandlerInterceptor {
/*
在controller目标方法执行之前,拦截
返回值:
true 放行
false 拦截
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("preHandle1...");
// request 转发
// response 重定向
// handler 获取目标方法的一切信息,进行增强...
return true;
}
}
定义拦截器拦截规则(spring-mvc.xml)
测试:
(2)拦截器API介绍
// 自定义拦截器
public class MyIntercepter1 implements HandlerInterceptor {
/*
在controller目标方法执行之前,拦截
返回值:
true 放行
false 拦截
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("preHandle1...");
// request 转发
// response 重定向
// handler 获取目标方法的一切信息,进行增强...
return true;
}
/*
在controller目标方法执行之后,进行增强
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
System.out.println("postHandle1...");
}
/*
在视图渲染完毕后,进行资源释放
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("afterCompletion1....");
}
}
(3)拦截器链
开发中拦截器可以单独使用,也可以同时使用多个拦截器形成一条拦截器链。
开发步骤和单个拦截器是一样的,只不过注册的时候注册多个,注意这里注册的顺序就代表拦截器执行的顺序。
例子和入门案例一致,创建另外一个MyIntercepter2,对象
1.拦截器执行先后问题:mvc:interceptor 谁先声明,谁先拦截
拦截器方法的执行顺序:先进后出
Spring-mvc.xml
pom.xml
mysql
mysql-connector-java
5.1.47
com.alibaba
druid
1.1.15
org.springframework
spring-jdbc
5.1.5.RELEASE
org.springframework
spring-context
5.1.5.RELEASE
junit
junit
4.12
org.springframework
spring-test
5.1.5.RELEASE
org.springframework
spring-orm
5.1.5.RELEASE
org.aspectj
aspectjweaver
1.9.5
org.springframework
spring-webmvc
5.1.5.RELEASE
javax.servlet
servlet-api
2.5
provided
javax.servlet
jsp-api
2.0
provided
org.projectlombok
lombok
1.18.10
commons-fileupload
commons-fileupload
1.4
com.fasterxml.jackson.core
jackson-databind
2.9.9
org.apache.maven.plugins
maven-compiler-plugin
3.1
1.8
UTF-8
web.xml
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
CharacterEncodingFilter
/*
DispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:applicationContext.xml
4
DispatcherServlet
/
404
/404.jsp