SpringMVC拦截器

SpringMVC拦截器SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。拦截器和过滤器的功能比较类似,有区别1. 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。 2. 拦截器是SpringMVC框架独有的,因此只对控制器方法产生作用。 3. 过滤器配置了/*,可以拦截任何资源,因此静态资源需要在配置中排除。springmvc.xml配置静态资源过滤<!-- location 表示路径,mapping 表示文件,**表示该目录下的文件以及子目录的文件 --><mvc:resources location="/css/" mapping="/css/**"/><mvc:resources location="/images/" mapping="/images/**"/><mvc:resources location="/scripts/" mapping="/javascript/**"/>拦截器只会对控制器中的方法进行拦截。拦截器也是AOP思想的一种实现方式想要自定义拦截器,需要实现HandlerInterceptor接口,然后根据需要重写里面方法。简而言之拦截器就是对控制层执行前后进行处理的工具,之前学过的@ModelAttribute注解也可以对Controller参数进行预处理,只是@ModelAttribute只是将处理好参数返给控制器了。拦截器明显可以做更多事,例如看请求中是否包含某信息,不包含则跳转到错误页面,包含则正常执行控制层。自定义拦截器步骤创建类,实现HandlerInterceptor接口,idea按ctrl+o重写需要方法,返回true放行,反之拦截。可以做登录前的验证,未登录预处理重定向或转发跳转到登录页面。public class MyInterceptor1 implements HandlerInterceptor {    /**     * controller方法执行前,进行拦截的方法     * return true放行     * return false拦截     * 可以使用转发或者重定向直接跳转到指定的页面。     */    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,                             Object handler)            throws Exception {        System.out.println("拦截器执行了...");        return true;    }}配置springmvc.xml,以下配置了两拦截器,执行顺序,12->Controller->21->JSP->21<!-- 配置拦截器 --><mvc:interceptors>    <mvc:interceptor>        <!-- 哪些方法进行拦截 -->        <mvc:mapping path="/user/*"/>        <!-- 哪些方法不进行拦截        <mvc:exclude-mapping path=""/>        -->        <!-- 注册拦截器对象 -->        <bean class="cn.cheng.demo1.MyInterceptor1"/>    </mvc:interceptor>            <mvc:interceptor>        <!-- 哪些方法进行拦截 -->        <mvc:mapping path="/**"/>        <!-- 哪些方法不进行拦截        <mvc:exclude-mapping path=""/>        -->        <!-- 注册拦截器对象 -->        <bean class="cn.cheng.demo1.MyInterceptor2"/>    </mvc:interceptor></mvc:interceptors>preHandle方法是controller方法执行前拦截的方法可以使用request或者response跳转到指定的页面return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。return false不放行,不会执行controller中的方法。postHandle是controller方法执行后执行的方法,在JSP视图执行前。可以使用request或者response跳转到指定的页面如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。afterHandle方法是在JSP执行后执行request或者response不能再跳转页面了

SpringMVC异常处理

异常处理系统的 dao、service、controller 出现都通过 throws Exception 向上抛出,最后由 springmvc 前端控制器交由异常处理器进行异常处理。编写异常类public class CustomException extends Exception {    private String message;    public CustomException(String message) {        this.message = message;    }    public String getMessage() {        return message;    }}自定义异常处理器设置如果是指定错误跳转到指定错误页面,并返回相应错误信息public class CustomExceptionResolver implements HandlerExceptionResolver {    @Override    public ModelAndView resolveException(HttpServletRequest request,                                         HttpServletResponse response, Object handler, Exception ex) {        ex.printStackTrace();        CustomException customException = null;//如果抛出的是系统自定义异常则直接转换        if (ex instanceof CustomException) {            customException = (CustomException) ex;        } else {//如果抛出的不是系统自定义异常则重新构造一个系统错误异常。            customException = new CustomException("系统错误,请与系统管理 员联系!");        }        ModelAndView modelAndView = new ModelAndView();        //存入错误信息        modelAndView.addObject("message", customException.getMessage());        //跳转错误页面        modelAndView.setViewName("error");        return modelAndView;    }}配置异常处理器<!-- 配置异常处理器 --><bean id="sysExceptionResolver" class="com.cheng.exception.CustomExceptionResolver"/>异常处理在控制层使用在控制层的try...catch中throw new CustomException("系统错误")即可

SpringMVC响应数据与视图

响应数据与视图返回字符串Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。    @RequestMapping(value="/hello")    public String sayHello() {        // 跳转到success页面        return "success";    }返回void1、默认会跳转到同mapping同名的页面,如@RequestMapping(value="/hello") 默认跳转到hello页面,不存在报4042、已知道Servlet 原始 API 可以作为控制器中方法的参数,可使用其做转发或重定向    @RequestMapping(value = "/initAdd")    public void initAdd(HttpServletRequest request, HttpServletResponse response) throws            Exception {        System.out.println("请求转发或者重定向");// 请求转发 转发网址栏地址不变 页面变// request.getRequestDispatcher("/WEB-INF/pages/add.jsp").forward(request,response);// 重定向 跳转网址会产生变化// response.sendRedirect(request.getContextPath()+"/add2.jsp");        response.setCharacterEncoding("UTF-8");        response.setContentType("text/html;charset=UTF-8");// 用getWriter()直接响应数据        response.getWriter().print("你好");        return;    }3、使用SpringMVC关键字进行转发与重定向如下重定向与转发不仅仅可以跳页面也能跳到其他Controller的mapping//"forward:转发的JSP路径",不走视图解析器了,所以需要编写完整的路径//转发 @RequestMapping("/delete")    public String delete() throws Exception {// return "forward:/WEB-INF/pages/success.jsp";        return "forward:/user/findAll";    }//重定向 到本机不需要完整路径    @RequestMapping("/count")    public String count() throws Exception {        return "redirect:/add.jsp";// return "redirect:/user/findAll";    }Model与ModelAndViewModelModel作为参数可调用其addAttribute方法添加数据到request域,如下:    @RequestMapping(value = "/initUpdate")    public String initUpdate(Model model) {// 模拟从数据库中查询的数据        User user = new User();        user.setUsername("张三");        model.addAttribute("user", user);        return "update";    }在jsp页面可通过${ requestScope }或${ user.username }调用request中内容。ModelAndViewModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图。它可以同时传入跳转页面名与数据对象,与上方Model功能差不多。只是Model将数据存在Model中,返回String页面名称,一般作为参数,但ModelAndView是作为返回值的。    /**     * 返回ModelAndView对象     * 可以传入视图的名称(即跳转的页面),还可以传入对象。     *     * @return     * @throws Exception     */    @RequestMapping(value = "/findAll")    public ModelAndView findAll() throws Exception {        ModelAndView mv = new ModelAndView();// 跳转到list.jsp的页面        mv.setViewName("list");// 模拟从数据库中查询所有的用户信息        List<User> users = new ArrayList<>();        User user1 = new User();        user1.setUsername("张三");        user1.setPassword("123");        User user2 = new User();        user2.setUsername("赵四");        user2.setPassword("456");        users.add(user1);        users.add(user2);// 添加对象        mv.addObject("users", users);        return mv;    }JSP页面开启c标签调用<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>获取集合中值通过forEach遍历<c:forEach items="${ users }" var="user">${ user.username }</c:forEach>ResponseBody返回json@ResponseBody注解写在方法上或者方法返回的类型前,或者写在类上或者使用@RestCotroller注解public @ResponseBody Address testJson(@RequestBody String body) {}RequestBody转对象上述代码如果@RequestBody注解修饰的String变量封装成JavaBean对象public @ResponseBody Address testJson(@RequestBody Address address) {}使用jackson添加jar包即可,Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换<dependency>    <groupId>com.fasterxml.jackson.core</groupId>    <artifactId>jackson-databind</artifactId>    <version>2.9.0</version></dependency><dependency>    <groupId>com.fasterxml.jackson.core</groupId>    <artifactId>jackson-core</artifactId>    <version>2.9.0</version></dependency><dependency>    <groupId>com.fasterxml.jackson.core</groupId>    <artifactId>jackson-annotations</artifactId>    <version>2.9.0</version></dependency>

分享几个免费 IP 归属地查询 API

太平洋电脑:https://whois.pconline.com.cn/ipJson.jsp?ip=127.0.0.1淘宝:http://ip.taobao.com/service/getIpInfo.php?ip=127.0.0.1淘宝的对请求间隔时间有要求短时间请求可能会报错。