当前位置: 首页 > news >正文

网站开发软件三剑客厦门网站建设工作

网站开发软件三剑客,厦门网站建设工作,速卖通,网站改版新闻前些天发现了一个巨牛的人工智能学习网站#xff0c;通俗易懂#xff0c;风趣幽默#xff0c;忍不住分享一下给大家。点击跳转到教程。 在开始之前#xff0c;我们先把需要的jar包添加到工程里。新增Maven依赖如下#xff1a; dependencygroupIdorg.spri…前些天发现了一个巨牛的人工智能学习网站通俗易懂风趣幽默忍不住分享一下给大家。点击跳转到教程。 在开始之前我们先把需要的jar包添加到工程里。新增Maven依赖如下 dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-aop/artifactId /dependency 接下来我们进入正题。这里的涉及的通知类型有前置通知、后置最终通知、后置返回通知、后置异常通知、环绕通知下面我们就具体的来看一下怎么在SpringBoot中添加这些通知。 首先我们先创建一个Aspect切面类Component Aspect public class WebControllerAop { } 指定切点//匹配com.zkn.learnspringboot.web.controller包及其子包下的所有类的所有方法 Pointcut(execution(* com.zkn.learnspringboot.web.controller..*.*(..))) public void executeService(){ } 接着我们再创建一个Controller请求处理类 package com.zkn.learnspringboot.web.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * Created by zkn on 2016/11/19. */ RestController RequestMapping(/aop) public class AopTestController { } 前置通知 配置前置通知/** * 前置通知方法调用前被调用 * param joinPoint */ Before(executeService()) public void doBeforeAdvice(JoinPoint joinPoint){ System.out.println(我是前置通知!!!); //获取目标方法的参数信息 Object[] obj joinPoint.getArgs(); //AOP代理类的信息 joinPoint.getThis(); //代理的目标对象 joinPoint.getTarget(); //用的最多 通知的签名 Signature signature joinPoint.getSignature(); //代理的是哪一个方法 System.out.println(signature.getName()); //AOP代理类的名字 System.out.println(signature.getDeclaringTypeName()); //AOP代理类的类class信息 signature.getDeclaringType(); //获取RequestAttributes RequestAttributes requestAttributes RequestContextHolder.getRequestAttributes(); //从获取RequestAttributes中获取HttpServletRequest的信息 HttpServletRequest request (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST); //如果要获取Session信息的话可以这样写 //HttpSession session (HttpSession) requestAttributes.resolveReference(RequestAttributes.REFERENCE_SESSION); EnumerationString enumeration request.getParameterNames(); MapString,String parameterMap Maps.newHashMap(); while (enumeration.hasMoreElements()){ String parameter enumeration.nextElement(); parameterMap.put(parameter,request.getParameter(parameter)); } String str JSON.toJSONString(parameterMap); if(obj.length 0) { System.out.println(请求的参数信息为str); } } 注意这里用到了JoinPoint和RequestContextHolder。通过JoinPoint可以获得通知的签名信息如目标方法名、目标方法参数信息等。通过RequestContextHolder来获取请求信息Session信息。接下来我们在Controller类里添加一个请求处理方法来测试一下前置通知RequestMapping(/testBeforeService.do) public String testBeforeService(String key,String value){ return keykey valuevalue; } 前置通知拦截结果如下所示后置返回通知 配置后置返回通知的代码如下/** * 后置返回通知 * 这里需要注意的是: * 如果参数中的第一个参数为JoinPoint则第二个参数为返回值的信息 * 如果参数中的第一个参数不为JoinPoint则第一个参数为returning中对应的参数 * returning 限定了只有目标方法返回值与通知方法相应参数类型时才能执行后置返回通知否则不执行对于returning对应的通知方法参数为Object类型将匹配任何目标返回值 * param joinPoint * param keys */ AfterReturning(value execution(* com.zkn.learnspringboot.web.controller..*.*(..)),returning keys) public void doAfterReturningAdvice1(JoinPoint joinPoint,Object keys){ System.out.println(第一个后置返回通知的返回值keys); } AfterReturning(value execution(* com.zkn.learnspringboot.web.controller..*.*(..)),returning keys,argNames keys) public void doAfterReturningAdvice2(String keys){ System.out.println(第二个后置返回通知的返回值keys); } Controller里添加响应的请求处理信息来测试后置返回通知RequestMapping(/testAfterReturning.do) public String testAfterReturning(String key){ return key: key; } RequestMapping(/testAfterReturning01.do) public Integer testAfterReturning01(Integer key){ return key; } 当发送请求为http://localhost:8001/aop/testAfterReturning.do?keytestsssvalue855sss时处理结果如图所示当发送请求为http://localhost:8001/aop/testAfterReturning01.do?key55553value855sss时处理结果如图所示后置异常通知 后置异常通知的配置方式如下 /** * 后置异常通知 * 定义一个名字该名字用于匹配通知实现方法的一个参数名当目标方法抛出异常返回后将把目标方法抛出的异常传给通知方法 * throwing 限定了只有目标方法抛出的异常与通知方法相应参数异常类型时才能执行后置异常通知否则不执行 * 对于throwing对应的通知方法参数为Throwable类型将匹配任何异常。 * param joinPoint * param exception */ AfterThrowing(value executeService(),throwing exception) public void doAfterThrowingAdvice(JoinPoint joinPoint,Throwable exception){ //目标方法名 System.out.println(joinPoint.getSignature().getName()); if(exception instanceof NullPointerException){ System.out.println(发生了空指针异常!!!!!); } } Controller里配置响应的请求处理类 RequestMapping(/testAfterThrowing.do) public String testAfterThrowing(String key){ throw new NullPointerException(); } 后置异常通知方法的处理结果如下所示 后置最终通知 后置最终通知的配置方式如下 /** * 后置最终通知目标方法只要执行完了就会执行后置通知方法 * param joinPoint */ After(executeService()) public void doAfterAdvice(JoinPoint joinPoint){ System.out.println(后置通知执行了!!!!); } Controller类配置相应的请求处理类 RequestMapping(/testAfter.do) public String testAfter(String key){ throw new NullPointerException(); } RequestMapping(/testAfter02.do) public String testAfter02(String key){ return key; } 当发送请求为http://localhost:8001/aop/testAfter.do?key55553value855sss 当发送请求为http://localhost:8001/aop/testAfter02.do?key55553value855sss  环绕通知 环绕通知的配置方式如下/** * 环绕通知 * 环绕通知非常强大可以决定目标方法是否执行什么时候执行执行时是否需要替换方法参数执行完毕是否需要替换返回值。 * 环绕通知第一个参数必须是org.aspectj.lang.ProceedingJoinPoint类型 */ Around(execution(* com.zkn.learnspringboot.web.controller..*.testAround*(..))) public Object doAroundAdvice(ProceedingJoinPoint proceedingJoinPoint){ System.out.println(环绕通知的目标方法名proceedingJoinPoint.getSignature().getName()); try { Object obj proceedingJoinPoint.proceed(); return obj; } catch (Throwable throwable) { throwable.printStackTrace(); } return null; } Controller对应的请求处理类如下RequestMapping(/testAroundService.do) public String testAroundService(String key){ return 环绕通知key; } 当发送请求为http://localhost:8001/aop/testAroundService.do?key55553当发送请求为:http://localhost:8001/aop/testAfter02.do?key55553value855sss时不符合环绕通知的切入规则所以环绕通知不会 执行。完整的AOP配置代码如下package com.zkn.learnspringboot.aop; import com.alibaba.fastjson.JSON; import com.google.common.collect.Maps; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.util.Enumeration; import java.util.Map; /** * Created by zkn on 2016/11/18. */ Component Aspect public class WebControllerAop { //匹配com.zkn.learnspringboot.web.controller包及其子包下的所有类的所有方法 Pointcut(execution(* com.zkn.learnspringboot.web.controller..*.*(..))) public void executeService(){ } /** * 前置通知方法调用前被调用 * param joinPoint */ Before(executeService()) public void doBeforeAdvice(JoinPoint joinPoint){ System.out.println(我是前置通知!!!); //获取目标方法的参数信息 Object[] obj joinPoint.getArgs(); //AOP代理类的信息 joinPoint.getThis(); //代理的目标对象 joinPoint.getTarget(); //用的最多 通知的签名 Signature signature joinPoint.getSignature(); //代理的是哪一个方法 System.out.println(signature.getName()); //AOP代理类的名字 System.out.println(signature.getDeclaringTypeName()); //AOP代理类的类class信息 signature.getDeclaringType(); //获取RequestAttributes RequestAttributes requestAttributes RequestContextHolder.getRequestAttributes(); //从获取RequestAttributes中获取HttpServletRequest的信息 HttpServletRequest request (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST); //如果要获取Session信息的话可以这样写 //HttpSession session (HttpSession) requestAttributes.resolveReference(RequestAttributes.REFERENCE_SESSION); EnumerationString enumeration request.getParameterNames(); MapString,String parameterMap Maps.newHashMap(); while (enumeration.hasMoreElements()){ String parameter enumeration.nextElement(); parameterMap.put(parameter,request.getParameter(parameter)); } String str JSON.toJSONString(parameterMap); if(obj.length 0) { System.out.println(请求的参数信息为str); } } /** * 后置返回通知 * 这里需要注意的是: * 如果参数中的第一个参数为JoinPoint则第二个参数为返回值的信息 * 如果参数中的第一个参数不为JoinPoint则第一个参数为returning中对应的参数 * returning 限定了只有目标方法返回值与通知方法相应参数类型时才能执行后置返回通知否则不执行对于returning对应的通知方法参数为Object类型将匹配任何目标返回值 * param joinPoint * param keys */ AfterReturning(value execution(* com.zkn.learnspringboot.web.controller..*.*(..)),returning keys) public void doAfterReturningAdvice1(JoinPoint joinPoint,Object keys){ System.out.println(第一个后置返回通知的返回值keys); } AfterReturning(value execution(* com.zkn.learnspringboot.web.controller..*.*(..)),returning keys,argNames keys) public void doAfterReturningAdvice2(String keys){ System.out.println(第二个后置返回通知的返回值keys); } /** * 后置异常通知 * 定义一个名字该名字用于匹配通知实现方法的一个参数名当目标方法抛出异常返回后将把目标方法抛出的异常传给通知方法 * throwing 限定了只有目标方法抛出的异常与通知方法相应参数异常类型时才能执行后置异常通知否则不执行 * 对于throwing对应的通知方法参数为Throwable类型将匹配任何异常。 * param joinPoint * param exception */ AfterThrowing(value executeService(),throwing exception) public void doAfterThrowingAdvice(JoinPoint joinPoint,Throwable exception){ //目标方法名 System.out.println(joinPoint.getSignature().getName()); if(exception instanceof NullPointerException){ System.out.println(发生了空指针异常!!!!!); } } /** * 后置最终通知目标方法只要执行完了就会执行后置通知方法 * param joinPoint */ After(executeService()) public void doAfterAdvice(JoinPoint joinPoint){ System.out.println(后置通知执行了!!!!); } /** * 环绕通知 * 环绕通知非常强大可以决定目标方法是否执行什么时候执行执行时是否需要替换方法参数执行完毕是否需要替换返回值。 * 环绕通知第一个参数必须是org.aspectj.lang.ProceedingJoinPoint类型 */ Around(execution(* com.zkn.learnspringboot.web.controller..*.testAround*(..))) public Object doAroundAdvice(ProceedingJoinPoint proceedingJoinPoint){ System.out.println(环绕通知的目标方法名proceedingJoinPoint.getSignature().getName()); try {//obj之前可以写目标方法执行前的逻辑 Object obj proceedingJoinPoint.proceed();//调用执行目标方法 return obj; } catch (Throwable throwable) { throwable.printStackTrace(); } return null; } } 完整的Controller类代码如下:package com.zkn.learnspringboot.web.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * Created by zkn on 2016/11/19. */ RestController RequestMapping(/aop) public class AopTestController { RequestMapping(/testBeforeService.do) public String testBeforeService(String key,String value){ return keykey valuevalue; } RequestMapping(/testAfterReturning.do) public String testAfterReturning(String key){ return key: key; } RequestMapping(/testAfterReturning01.do) public Integer testAfterReturning01(Integer key){ return key; } RequestMapping(/testAfterThrowing.do) public String testAfterThrowing(String key){ throw new NullPointerException(); } RequestMapping(/testAfter.do) public String testAfter(String key){ throw new NullPointerException(); } RequestMapping(/testAfter02.do) public String testAfter02(String key){ return key; } RequestMapping(/testAroundService.do) public String testAroundService(String key){ return 环绕通知key; } } 代码地址 https://github.com/zhangconan/LearnSpringBoot/tree/master/src/main/java/com/zkn/learnspringboot/aop  转自https://blog.csdn.net/zknxx/article/details/53240959
http://www.pierceye.com/news/559027/

相关文章:

  • 做网站seo赚钱吗平面广告设计作品集
  • 购物中心网站建设六安政务中心网站
  • 做网站公司赚钱吗?抖音小程序推广怎么挂才有收益
  • 滁州网站建设建设银行租房平台网站6
  • h5自适应网站模板下载阿里云域名注册好了怎么做网站
  • 德州做网站多少钱网站实现搜索功能
  • 帝国cms7.0网站搬家换域名换空间等安装教程万网云虚拟主机上传网站
  • 网站建设推广接单语wordpress 所有文章
  • 申请域名后怎么做网站网站建设与维护中国出版社
  • 洛阳做网站那家好课程网站建设开题报告
  • 到哪里建网站商务网站建设学期总结
  • 铜陵app网站做营销招聘网站开发公司需要投入什么资源
  • 建购物的网站需要多少钱wordpress不显示头像
  • 如何做一个个人网站长春网站建设wang
  • 湖南省做网站的网站资讯建设
  • 滨江网站建设制作如何建设网站方便后期维护
  • dedecms手机网站插件wordpress模板中文
  • 网站建设合同封面模板下载天津专业网站设计
  • 毕业设计网站做几个2345浏览器网页版
  • 南阳市网站建设国家建设协会工程质量分会网站
  • 苗木网站开发需求自己做网站转发新闻违法么
  • 招商网站建设解决方案wordpress页面转移
  • 门户网站开发方案文档做网站切片
  • 中国房地产新闻关键词seo排名优化如何
  • 网站大型网页游戏上海装修公司排名统帅
  • hostinger建站wordpress互联网营销方案策划
  • 门户网站维护方案杭州网站建设公司哪家好
  • 深泽网站建设在wordpress加入文件管理器
  • 国外社交网站建设福州市工程建设质量管理网站
  • 建设网站怎样分配给用户空间做网站优化有什么方法