三. 实现 HandlerExceptionResolver 接口,构建全局异常处理器
保留上面写的那些异常类和后端。
三.一 构建全局异常处理器 MyExceptoinResolver
在 com.yjl.resolver 包里面。
public class MyExceptoinResolver implements HandlerExceptionResolver{ @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) { ModelAndView mv=new ModelAndView(); mv.addObject("ex",exception); //2. 设置默认页面 mv.setViewName("errors/default"); //3. 根据异常的类型的所属类,来进行返回不同的提示信息,要取出提示语句。 String message=""; if(exception instanceof InputException){ mv.setViewName("errors/inputError"); InputException exc=(InputException)exception; message=exc.getMessage(); }else if(exception instanceof DataException){ mv.setViewName("errors/dataError"); DataException exc=(DataException)exception; message=exc.getMessage(); }else{ message="未知错误"; } mv.addObject("message",message); return mv; } }
三.二 后端和前端的那几个.jsp 页面保持不变
三.三 springmvc.xml 中配置 全局异常处理器
<mvc:annotation-driven></mvc:annotation-driven> <bean class="com.yjl.resolver.MyExceptoinResolver"></bean>
三.四 重启服务器,进行验证
与 二.七 显示的结果一样。
上面同样也会跳转,可以自己进行定义,设置信息。 但一般,并不是返回ModelAndView, 而是返回json数据。
三.五 返回JSON 数据
重写 MyExceptoinResolver 里面的 HandlerExceptionResolver 接口里面的方法,采用json返回的形式。
用的是fastjson.jar , 关于json的内容,可以看老蝴蝶前面写的json文章。
@Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) { //有时候,会返回一个JSON字符串。 Map<String,Object> errorMap=new HashMap<String,Object>(); //System.out.println("输出值:"+exception.getClass().getSuperclass().getSimpleName()); errorMap.put("request_state",false); errorMap.put("error_code","500"); errorMap.put("error_exception",exception.getClass().getSimpleName()); try { Method method=exception.getClass().getMethod("getMessage"); errorMap.put("message",method.invoke(exception)); //json 形式的打印响应 response.setContentType("text/html;charset=UTF-8"); PrintWriter write=response.getWriter(); write.write(JSON.toJSONString(errorMap)); } catch (Exception e) { e.printStackTrace(); } return null; }
三.六 重启服务器,进行验证
会在页面上打印相应的json数据,即响应 json 字符串。
这就是 SpringMVC的异常的简单的功能。
四. REST
REST 全称是 Representational State Transfer,是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
它进行了三个层面的划分。
1 . 对url 进行规范,要写rest 风格的url
如登录时,以前的url 是: http://localhost:8027/SpringMVC08/user/login.action?name=两个蝴蝶飞&password=1234,
那么写成 url 的风格 便是: http://localhost:8027/SpringMVC08/user/login/两个蝴蝶飞/1234
注意,没有.action
url简洁了, 直接将参数 通过url 传递到了后端。
后端接收参数时,要注意顺序性的接收。
2 . 对http 方法进行规范。
以前HTTP 的方法,常用的是 get 和post, 而get 和post 也没有进行任何区分, 通过在 get 中直接调用 toPost(), 或者是在post 中直接调用 toGet() 方法,
REST 风格,对http 方法进行了扩展。
对数据库的操作 通常是 CRUD, 前端对后端的操作也是 CRUD, 添加,读取,更新,删除。
POST方式, 为插入
GET 方法, 为 查询
PUT 方法, 为 更新
DELETE 方法, 为删除。
3 . 对HTTP 的contentType 文档类型进行了规范。
设置成 json 的格式。
由于 url为REST 风格的,不能在方法中出现 .action,所以需要将 web.xml 中的 DispatcherServlet 地址映射改一下。
以前 url-pattern 为 *.action, 现在改成 /
<!-- 过滤器 --> <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
改成了 / 之后,对静态的资源路径也进行了解析, 此时访问 jquery.js 的,是访问不出来的, 将将其当成方法进行处理。 所以,要在springmvc.xml 配置静态资源路径。
<!--静态资源处理--> <mvc:resources location="/js/" mapping="/js/**"></mvc:resources> <mvc:resources location="/css/" mapping="/css/**"></mvc:resources> <mvc:resources location="/image/" mapping="/image/**"></mvc:resources>
一般,设置这三个, js,css和image .