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

叶县建设局网站答题做任务网站

叶县建设局网站,答题做任务网站,wordpress 自带的ajax,定制软件开发方案前言 在尼恩读者50交流群中#xff0c;尼恩经常指导小伙伴改简历。 改简历所涉及的一个要点是#xff1a; 在 XXX 项目中#xff0c;完成了 XXX 模块的代码优化 另外#xff0c;在面试的过程中#xff0c;面试官也常常喜欢针对提问#xff0c;来考察候选人对代码质量的追…前言 在尼恩读者50交流群中尼恩经常指导小伙伴改简历。 改简历所涉及的一个要点是 在 XXX 项目中完成了 XXX 模块的代码优化 另外在面试的过程中面试官也常常喜欢针对提问来考察候选人对代码质量的追求、对设计模式的应用能力 你做过哪些代码优化 大家一般的套路都是通过模板模式、策略模式等完成 XXXXX 模块的重构提升代码的可扩展行可维护性。 如果有类似的扩展场景还好头疼的是很多小伙伴确实没有。然后无奈的说没有做过代码的优化。 尼恩告诉大家如果你作为一个高手连代码优化都没有做过是不可能的。 尼恩本人从2006开始做Java开发就一直生活在代码优化的路上。 如果这个问题答不好你就不是高手不具备拿高薪的条件。 那么该在哪里找点代码优化的需求呢 这里尼恩给大家展示一个简单、又可以称之为极品、又是人人用得着的案例 后端接口返回结果的二次封装优化 此案例既能展示大家对代码优雅的追求也能展示大家对spring框架的雄厚内功如果面试的时候如数家珍能让面试官爱到 “刮目相看”。 同时尼恩一并把这个题目以及参考答案收入咱们的 《尼恩Java面试宝典》供后面的小伙伴参考提升大家的 3高 架构、设计、开发水平。 注本文以 PDF 持续更新最新尼恩 架构笔记、面试题 的PDF文件请从这里获取码云 场景 在移动互联网分布式、微服务盛行的今天现在项目绝大部分都采用的微服务框架前后端分离方式一般系统的大致整体架构图如下 Rest API接口 前端和后端进行交互前端按照约定请求URL路径并传入相关参数后端服务器接收请求进行业务处理返回数据给前端。 针对URL路径的restful风格以及传入参数的公共请求头的要求如app_version,api_version,device等这里就不介绍了小伙伴们可以来尼恩的尼恩读者50交流群中交流 着重介绍一下后端服务器如何实现把数据返回给前端 返回格式 后端返回给前端我们一般用JSON体方式定义如下 {#返回状态码code:integer, #返回信息描述message:string,#返回值data:object }CODE状态码 code返回状态码一般小伙伴们是在开发的时候需要什么就添加什么。 如接口要返回用户权限异常我们加一个状态码为101吧下一次又要加一个数据参数异常就加一个102的状态码。这样虽然能够照常满足业务但状态码太凌乱了 我们应该可以参考HTTP请求返回的状态码 下面是常见的HTTP状态码 200 - 请求成功 301 - 资源网页等被永久转移到其它URL 404 - 请求的资源网页等不存在 500 - 内部服务器错误分类区间分类描述1**100~199信息服务器收到请求需要请求者继续执行操作2**200~299成功操作被成功接收并处理3**300~399重定向需要进一步的操作以完成请求4**400~499客户端错误请求包含语法错误或无法完成请求5**500~599服务器错误服务器在处理请求的过程中发生了错误 我们可以参考这样的设计这样的好处就把错误类型归类到某个区间内如果区间不够可以设计成4位数。 #10001999 区间表示参数错误 #20002999 区间表示用户错误 #30003999 区间表示接口异常这样前端开发人员在得到返回值后根据状态码就可以知道大概什么错误再根据message相关的信息描述可以快速定位。 Message 这个字段相对理解比较简单就是发生错误时如何友好的进行提示。一般的设计是和code状态码一起设计如 //状态码枚举 public enum ResultCode {private Integer code;private String message;ResultCode(Integer code String message) {this.code code;this.message message;} }再在枚举中定义状态码 返回状态码 public enum ResultCode {privateInteger code;private String message;ResultCode(Integer codeString message) {this.code code;this.message message;}public Integer code(){return this.code;}public String message() {return this.message;}/* 成功状态码 */SUCCESS(1成功),/* 参数错误: 1001-1999 */PARAM IS INVALID(1001,参数无效),PARAM IS BLANK(1002,参数为空),PARAM TYPE BIND ERROR(1003参数类型错误),PARAM NOT_COMPLETE(1004,参数缺失),/* 用户错误: 2001-2999*/USER NOT_LOGGED IN(2001,用户未登录,访问的路径需要验证,请登录),USER LOGIN ERROR(2002,账号不存在或密码错误),USER ACCOUNT FORBIDDEN(2003,账号已被禁用),USER NOT_EXIST(2004,用户不存在),USER HAS EXISTED(2005用户已存在) }状态码和信息就会一一对应比较好维护。 Data 返回数据体JSON格式根据不同的业务又不同的JSON体。 我们要设计一个返回体类Result aData public class Result implements Serializable {private Integer code;private String message;private Object data;public Result(ResultCode resultCode, Object data) {this.code resultCode.code;this.message resultCode.message();this.data data;} }控制层Controller 我们会在controller层处理业务请求并返回给前端以order订单为例 RestController RequestMapping(/orders) public class OrderController {Autowiredprivate OrderService orderService;GetMapping({id})public Result getOrder(PathVariable(id) Integer id) {Order order orderService.getOrderById(id);Result result new Result(ResultCode.SUCCESS,order);return result;} }我们看到在获得order对象之后我们是用的Result构造方法进行包装赋值然后进行返回。 小伙伴们有没有发现构造方法这样的包装是不是很麻烦我们可以优化一下。 美观优化 我们可以在Result类中加入静态方法一看就懂 Data public class Result implements Serializable {//省。。//返回成功public static Result success() {Result result new Result();result.setResultCode(ResultCode.SUCCESS);return result;}//返回成功public static Result success(Object data) {Result result new Result();result.setResultCode(ResultCode.SUCCESS);result.setData(data);return result;}//返回失败public static Result failure(ResultCode resultCode) {Result result new Result();result.setResultCode(resultCode);return result;}//返回失败public static Result failure(ResultCode resultCode, Obiect data){Result result new ResultO;result.setResultCode(resultCode);result.setData(data);return result;} }那我们来改造一下Controller RestController RequestMapping(/orders) public class OrderController [Autowiredprivate OrderService orderService;GetMapping({id})public Result getOrder(PathVariable(id) Integer id) {if(id null){return Result.failure(ResultCode.PARAM IS INVALID);}Order order orderService.getOrderById(id);return Result.success(order);} }代码比较简洁了也美观了。 尼恩的SpringCloud开发脚手架是这么做的。 尼恩公司的那些亿级RMP大项目也是这么做的。 那么有没有优化的空间呢 当然有。 切面式思想优化 上面我们看到在Result类中增加了静态方法使得业务处理代码简洁了。但小伙伴们有没有发现这样有几个问题 1、每个方法的返回都是Result封装对象没有业务含义 2、在业务代码中成功的时候我们调用Result.success异常错误调用Result.failure。是不是很多余 3、上面的代码判断id是否为null其实我们可以使用hibernate validate做校验没有必要在方法体中做判断。 具体怎么解决呢宏观的思路如下 可以应用切面式的思想把Rest外层包装抽取到切面中而不是放在业务代码中从而让业务代码回归业务本身更为逻辑清晰、结构简单。 优化之后的效果是业务Controller直接返回真实业务对象最好不要改变之前的业务方式如下图 RestController RequestMapping(/orders) public class OrderController {Autowiredprivate OrderService orderService;GetMapping({id})public Order getOrder(aPathVariable(id) Integer id) {Order order orderService.getOrderById(id);return roder;} }业务代码我们平时的代码是一样的非常直观直接返回order对象这样是不是很完美。 切面式的思想的实现方案是什么呢 切面式的实现方案 小伙伴们怎么去实现是不是有点思路在这个过程中我们需要做几个事情 1、定义一个注解ResponseResult表示这个接口返回的值需要包装一下 2、拦截请求判断此请求是否需要被ResponseResult注解 3、核心步骤就是实现接口ResponseBodyAdvice和ControllerAdvice判断是否需要包装返回值如果需要就把Controller接口的返回值进行重写。 注解类 定义一个注解类用来标记方法的返回值是否需要包装 Retention(RUNTIME) Target({ TYPEMETHOD }) Documented public interface ResponseResult { }拦截器 拦截请求是否此请求返回的值需要包装 其实就是运行的时候解析ResponseResult注解 //请求拦截器 slf4j Component public class ResponseResultInterceptor implements HandlerInterceptor{//标记名称public static final String RESPONSE_RESULT_ANN RESPONSE-RESULT-ANN;Overridepublic boolean preHandle(HttpServletRequest reguest, HttpServletResponse response, Object handler)throws Exception {//请求的方法if(handler instanceof HandlerMethod){final HandlerMethod handlerMethod (HandlerMethod)handler;final Class? clazz handlerMethod.getBeanType();final Method method handlerMethod.getMethod();//判断是否在类对象上面加了注解if (clazz.isAnnotationPresent(ResponseResult.class)) {//设置此请求返回体需要包装往下传递在ResponseBodyAdvice接口进行判断request.setAttribute(RESPONSE_RESULTANN,clazz.getAnnotation(ResponseResult.class));}else if (method.isAnnotationPresent(ResponseResult,class)) { //方法体上是否有注解//设置此请求返回体需要包装往下传递在ResponseBodyAdvice接口进行判断request.setAttribute(RESPONSE_RESULT_ANN,method.getAnnotation(ResponseResult.class));}}return true;} }此代码核心思想就是获取此请求根据注解判断是否需要返回值包装并且在request上设置一个属性标记。 重写返回体 slf4j ControllerAdvice public class ResponseResultHandler implements ResponseBodyAdviceObject{//标记名称public static final String RESPONSE_RESULTANN RESPONSE-RESULT-ANN;//是否请求 包含了 包装注解 标记没有就直接返回不需要重写返回体Overridepublic boolean supports (MethodParameter returntype, Class? extends HttpMessagelonverter? convertertype){ServletRequestAttributes ra ((ServletRequestAttributes) RequestContextHolder getRequestAttributes());HttpServletRequest request sra.getRequest();//判断请求 是否有包装标记ResponseResult responseResultAnn (ResponseResult) request,getAttribute(RESPONSE RESULT_ANN);return responseResultAnn null ? false : true;}Overridepublic Object beforeBodyWrite(0bject body, MethodParameter returnType, MediaType selectedContentTypeClass? extends HttpMessageConverter? selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {log.info(进入 返回体 重写格式 处理中。。。。。);return Result.success(body);} }上面supports 代码就是判断是否需要返回值包装如果需要support返回true就直接进入 beforeBodyWrite包装。 这里我们只处理了正常成功的包装如果方法体报异常怎么办 处理异常也比较简单只要判断body是否为异常类。 Override public Object beforeBodywrite(0bject body, MethodParameter returnType, MediaType selectedContentType, Class? extends HttpMessageConverter? selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {log.info(进入 返回体 重写格式 处理中。。。。);if (body instanceof ErrorResult) {log.info(返回值 异常 作包装 处理中。。。);ErrorResult errorResult (ErrorResult) body;return Result.failure(errorResult.getCode(),errorResult, getMessage ),errorResult, getErrors());}return Result.success(body); }怎么做全局的异常处理实现方式有两种 第一种使用ControllerAdvice和ExceptionHandler注解第二种: 使用ErrorController类来实现。 参考ResponseBodyAdvice对返回结果进行二次包装就可以了。 篇幅原因这里就不做介绍了只要思路理清楚了自行改造就行。 重写Controller RestController RequestMapping(/orders) ResponseResult public class OrderController {Autowiredprivate OrderService orderService;GetMapping({id})public Order getOrder(aPathVariable(id) Integer id) {Order order orderService.getOrderById(id);return roder;} }在控制器类上或者方法体上加上ResponseResult注解这样就ok了简单吧。 到此返回结果的代码优化完成经过代码优化之后咱们的代码是不是又简洁又优雅。 那么这个方案还有没有别的优化空间当然是有的。 如每次请求都要反射一下获取请求的方法是否需要包装其实可以做个缓存不需要每次都需要解析。 当然整体思路了解小伙伴们就可以在此基础上面自行扩展。具体的进一步优化方案也可以来尼恩读者50交流群中交流 总结 代码优化是一个高手的必须课基本功。这里尼恩给大家展示一个简单、又可以称之为极品、又是人人用得着的案例。 此案例既能展示大家对代码优雅的追求也能展示大家对spring框架的雄厚内功如果面试的时候如数家珍能让面试官爱到 “刮目相看”。 推荐阅读 《响应式圣经10W字实现Spring响应式编程自由》 《全链路异步让你的 SpringCloud 性能优化10倍》 《Linux命令大全2W多字一次实现Linux自由》 《网易二面CPU狂飙900%该怎么处理》 《阿里二面千万级、亿级数据如何性能优化 教科书级 答案来了》 《峰值21WQps、亿级DAU小游戏《羊了个羊》是怎么架构的》 《场景题假设10W人突访你的系统如何做到不 雪崩》 《2个大厂 100亿级 超大流量 红包 架构方案》 《Nginx面试题史上最全 持续更新》 《K8S面试题史上最全 持续更新》 《操作系统面试题史上最全、持续更新》 《Docker面试题史上最全 持续更新》 《Springcloud gateway 底层原理、核心实战 (史上最全)》 《Flux、Mono、Reactor 实战史上最全》 《sentinel 史上最全》 《Nacos (史上最全)》 《TCP协议详解 (史上最全)》 《分库分表 Sharding-JDBC 底层原理、核心实战史上最全》 《clickhouse 超底层原理 高可用实操 史上最全》 《nacos高可用图解秒懂史上最全》 《队列之王 Disruptor 原理、架构、源码 一文穿透》 《环形队列、 条带环形队列 Striped-RingBuffer 史上最全》 《一文搞定SpringBoot、SLF4j、Log4j、Logback、Netty之间混乱关系史上最全》 《单例模式史上最全》 《红黑树 图解 秒懂 史上最全》 《分布式事务 秒懂》 《缓存之王Caffeine 源码、架构、原理史上最全10W字 超级长文》 《缓存之王Caffeine 的使用史上最全》 《Java Agent 探针、字节码增强 ByteBuddy史上最全》 《Docker原理图解秒懂史上最全》 《Redis分布式锁图解 - 秒懂 - 史上最全》 《Zookeeper 分布式锁 - 图解 - 秒懂》 《Zookeeper Curator 事件监听 - 10分钟看懂》 《Netty 粘包 拆包 | 史上最全解读》 《Netty 100万级高并发服务器配置》 《Springcloud 高并发 配置 一文全懂》
文章转载自:
http://www.morning.pzjfz.cn.gov.cn.pzjfz.cn
http://www.morning.lrmts.cn.gov.cn.lrmts.cn
http://www.morning.txnqh.cn.gov.cn.txnqh.cn
http://www.morning.tkflb.cn.gov.cn.tkflb.cn
http://www.morning.pmdzd.cn.gov.cn.pmdzd.cn
http://www.morning.zcncb.cn.gov.cn.zcncb.cn
http://www.morning.jpdbj.cn.gov.cn.jpdbj.cn
http://www.morning.sgcdr.com.gov.cn.sgcdr.com
http://www.morning.tlrxt.cn.gov.cn.tlrxt.cn
http://www.morning.tgts.cn.gov.cn.tgts.cn
http://www.morning.mhpmw.cn.gov.cn.mhpmw.cn
http://www.morning.dwhnb.cn.gov.cn.dwhnb.cn
http://www.morning.lgkbn.cn.gov.cn.lgkbn.cn
http://www.morning.hgkbj.cn.gov.cn.hgkbj.cn
http://www.morning.wkknm.cn.gov.cn.wkknm.cn
http://www.morning.xrrbj.cn.gov.cn.xrrbj.cn
http://www.morning.fksrg.cn.gov.cn.fksrg.cn
http://www.morning.xxrwp.cn.gov.cn.xxrwp.cn
http://www.morning.jiuyungps.com.gov.cn.jiuyungps.com
http://www.morning.qxbsq.cn.gov.cn.qxbsq.cn
http://www.morning.rzysq.cn.gov.cn.rzysq.cn
http://www.morning.hlyfn.cn.gov.cn.hlyfn.cn
http://www.morning.zpstm.cn.gov.cn.zpstm.cn
http://www.morning.yxwrr.cn.gov.cn.yxwrr.cn
http://www.morning.rhmt.cn.gov.cn.rhmt.cn
http://www.morning.jppb.cn.gov.cn.jppb.cn
http://www.morning.wxfgg.cn.gov.cn.wxfgg.cn
http://www.morning.zdgp.cn.gov.cn.zdgp.cn
http://www.morning.wyppp.cn.gov.cn.wyppp.cn
http://www.morning.qlck.cn.gov.cn.qlck.cn
http://www.morning.wqsjx.cn.gov.cn.wqsjx.cn
http://www.morning.nsppc.cn.gov.cn.nsppc.cn
http://www.morning.fqyxb.cn.gov.cn.fqyxb.cn
http://www.morning.pqfbk.cn.gov.cn.pqfbk.cn
http://www.morning.wrtpk.cn.gov.cn.wrtpk.cn
http://www.morning.grtwn.cn.gov.cn.grtwn.cn
http://www.morning.mqnbm.cn.gov.cn.mqnbm.cn
http://www.morning.jqwpw.cn.gov.cn.jqwpw.cn
http://www.morning.lcwhn.cn.gov.cn.lcwhn.cn
http://www.morning.fkmqg.cn.gov.cn.fkmqg.cn
http://www.morning.dqkrf.cn.gov.cn.dqkrf.cn
http://www.morning.bkgfp.cn.gov.cn.bkgfp.cn
http://www.morning.fjtnh.cn.gov.cn.fjtnh.cn
http://www.morning.srrrz.cn.gov.cn.srrrz.cn
http://www.morning.qnxkm.cn.gov.cn.qnxkm.cn
http://www.morning.xqcst.cn.gov.cn.xqcst.cn
http://www.morning.hdnd.cn.gov.cn.hdnd.cn
http://www.morning.snlxb.cn.gov.cn.snlxb.cn
http://www.morning.dgmjm.cn.gov.cn.dgmjm.cn
http://www.morning.plqqp.cn.gov.cn.plqqp.cn
http://www.morning.wrbf.cn.gov.cn.wrbf.cn
http://www.morning.rqpgk.cn.gov.cn.rqpgk.cn
http://www.morning.sfgtp.cn.gov.cn.sfgtp.cn
http://www.morning.wpmqq.cn.gov.cn.wpmqq.cn
http://www.morning.sfdsn.cn.gov.cn.sfdsn.cn
http://www.morning.ryqsq.cn.gov.cn.ryqsq.cn
http://www.morning.hsxkq.cn.gov.cn.hsxkq.cn
http://www.morning.mrbmc.cn.gov.cn.mrbmc.cn
http://www.morning.bylzr.cn.gov.cn.bylzr.cn
http://www.morning.hxgly.cn.gov.cn.hxgly.cn
http://www.morning.knmp.cn.gov.cn.knmp.cn
http://www.morning.spbp.cn.gov.cn.spbp.cn
http://www.morning.hxwrs.cn.gov.cn.hxwrs.cn
http://www.morning.fsfz.cn.gov.cn.fsfz.cn
http://www.morning.egmux.cn.gov.cn.egmux.cn
http://www.morning.fplwz.cn.gov.cn.fplwz.cn
http://www.morning.dxhdn.cn.gov.cn.dxhdn.cn
http://www.morning.bkpbm.cn.gov.cn.bkpbm.cn
http://www.morning.trhrk.cn.gov.cn.trhrk.cn
http://www.morning.wkpfm.cn.gov.cn.wkpfm.cn
http://www.morning.bfhrj.cn.gov.cn.bfhrj.cn
http://www.morning.npfrj.cn.gov.cn.npfrj.cn
http://www.morning.ybgpk.cn.gov.cn.ybgpk.cn
http://www.morning.ttnfc.cn.gov.cn.ttnfc.cn
http://www.morning.tlpsd.cn.gov.cn.tlpsd.cn
http://www.morning.krlsz.cn.gov.cn.krlsz.cn
http://www.morning.qpnb.cn.gov.cn.qpnb.cn
http://www.morning.2d1bl5.cn.gov.cn.2d1bl5.cn
http://www.morning.cmfkp.cn.gov.cn.cmfkp.cn
http://www.morning.tpkxs.cn.gov.cn.tpkxs.cn
http://www.tj-hxxt.cn/news/263691.html

相关文章:

  • 龙岩网站建设龙岩网站制作公司网站建设管理制度
  • 什么是营销型的网站推广开学第一课汉字做网站
  • 佛山建设外贸网站焦作企业网站建设
  • 查找手机网站网件路由器登陆网址
  • 南昌网站建设索王道下拉宝安高端网站建设
  • 怎么做网站后缀识别符号才不会变wordpress 安全问题
  • 南宁建设工程造价信息网站网站开发项目介绍
  • 一个成功的网站要具备哪些苏州做网站公司 速选苏州聚尚网络
  • 汝州市建设局网站视频模板网
  • 中国建设银行征信中心网站网站顶部导航文件代码在吗
  • 专业网站找外包做网站要多久
  • 广东微信网站制作报价腾讯云新人服务器
  • 广西网站建设路苏州网站 建设 公司
  • 泰安手机网站建设报价安达网站制作
  • 好看的美食怎么做视频网站wordpress模板主题实例实战教程
  • 做家具网站家装装饰设计
  • 太原做网站哪家好北京房地产最新消息
  • php怎么做视频网站wordpress 头部引入js
  • 重庆企业网站建设解决方案做电商需要准备什么
  • 网上有做口译的网站么网站站点查询
  • h5建站免费开小加工厂去哪接单子
  • 98元建网站怎么做阿里巴巴外贸网站
  • 东莞市研发网站建设公司广东网站建设微信官网开发
  • 深圳网站托管临湘网站建设
  • 政务中心建设网站百度问答平台入口
  • 做哪一类网站容易有排名专业新站整站快速排名公司
  • dw网站建设的心得体会页面设计升级访问
  • 装修设计网站哪个好用人人开发网站
  • 软件技术 网站建设教程播放视频网站怎么做的
  • 网站建设运营思路如何用wordpress做网站