0

点赞

0

回复

0

浏览

log4j使用总结

实际项目开发过程中,日志是一个重要且必须的内容,通过日志我们可以监测代码部署之后的运行状况,包括查看出错原因、收集我们想要的信息等等。 使用Log4J,程序员可以控制日志信息输送的目的地,包括控制台,文件,GUI组件和NT事件记录器,也可以控制每一条日志的输出格式,或通过定义每一条日志信息的级别,更加细致地控制日志的生成过程。 1 LOG4J的组成 Log4j由三个重要的组成构成:日志记录器(Loggers),输出端(Appenders)和日志格式化器(Layout)。 1. Logger:控制要启用或禁用哪些日志记录语句,并对日志信息进行级别限制 2. Appenders指定了日志将打印到控制台还是文件中 3. Layout则控制日志信息的显示格式。 一个logger可以用多个appender,也就是说日志信息可以同时输出到多个设备上,每个appender对应一种layout。 所以,记录器用来整合日志信息,一个日志信息调整好以后,交给记录器的所有Appender,每一个Appender根据自己的格式输出日志信息。 2 LOG4J的使用 这里只介绍maven引入log4j的依赖 ...

log4jjava日志

0

点赞

0

回复

0

浏览

Java线程及锁机制

1 THREAD类 Thread类实现了Runnable接口,start方法根据Thread对象中的数据生成一个新的控制线程,然后返回。现在虚拟机调用新线程中的run方法,从而激活这个线程。 我们只能为每个线程调用一次start方法,否则再次调用会爆出IllegalThreadStateException异常。 当线程的run方法返回,线程就已经退出了。 Thread.run的标准实现并未做任何事情,要想让线程执行某些工作,就必须 1. 扩展Thread类以提供一个新的run方法,或者 2. 创建一个Runnable对象并把它传递给线程的构造器 我们首先讨论如何通过扩展Thread类来创建新的线程类型 / ...

线程java

0

点赞

0

回复

0

浏览

反射技术用于工厂模式

1 反射技术 反射技术大量用于Java设计模式和框架技术,最常见的设计模式就是工厂模式(Factory)和单例模式(Singleton)。 用接口来沟通不同程序的开发进度,不必等上游程序写好代码之后,再注入后面流程的程序员。且在实现上, 可以用配置文件灵活变更,而不用重编译整个项目 。 interface InterfaceTest {...

java反射设计模式

0

点赞

0

回复

0

浏览

Java反射技术

1 概念 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 2 功能 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所具有的成员变量和方法; 在运行时调用任意一个对象的方法; 生成动态代理。 3 相关API 3.1 通过对象获取完成的包名和类名 public class TestReflect {...

java反射

0

点赞

0

回复

0

浏览

JUnit4测试用例执行顺序设置

1 介绍 在写JUnit测试用例时,有时候需要按照定义顺序执行我们的单元测试方法,比如如在测试数据库相关的用例时候要按照测试插入、查询、删除的顺序测试。如果不按照这个顺序测试可能会出现问题,比如删除方法在前面执行,后面的方法就都不能通过测试,因为数据已经被清空了。而JUnit测试时默认的顺序是随机的。所以这时就需要有办法要求JUnit在执行测试方法时按照我们指定的顺序来执行。 JUnit是通过 @FixMethodOrder 注解(annotation)来控制测试方法的执行顺序的。 @FixMethodOrder 注解的参数是 org.junit.runners.MethodSorters 对象,在枚举类 org.junit.runners.MethodSorters 中定义了如下三种顺序类型: MethodSorters.JVM Leaves the test methods in the order returned by the JVM. Note that the order from the JVM may vary from run to run (按照JVM得到的方法顺序,也就是代码中定义的方法顺序) MethodSorters.DEFAULT Sorts the test methods in a deterministic, but not predictable, order() (以确定但不可预期的顺序执行) MethodSorters.NAME_ASCENDING Sorts the test methods by the method name, in lexicographic order, with Method.toString() used as a tiebreaker (按方法名字母顺序执行) 2 测试 package test;...

测试用例javajunit

0

点赞

0

回复

17

浏览

elasticsearch Java API的使用以及坑的注意

1 创建CLIENT Settings settings = Settings.builder().put("cluster.name", "UBA").put("client.transport.sniff", true) .build();TransportClient client = new PreBuiltTransportClient(settings)...

javaelasticsearch

0

点赞

2

回复

189

浏览

Java中的final关键字在变量.方法.类的使用特点

Java中的final关键字非常重要,含义存在着细微的区别,通常指“这是无法改变的”,不想改变可能出于两种理由:设计和效率。注意是可能,下面说一下我学习使用到final的三种情况:final变量.final方法和fianl类。 1. FINAL变量 //先举例2个例子:private static final String TIANMAYING_HE = "haha";//变量是基本数据类型的,...

java基础java

0

点赞

0

回复

225

浏览

如何将默认Eclipse项目转为Maven项目

将已有的ECLIPSE项目转化为MAVEN项目 我们之前在Eclipse IDE完成的Java命令行项目、Java Web项目也使用了构建工具—— Ant http://ant.apache.org/ ,它帮助我们编译、运行Java源代码(无需我们自己调用 javac , java 等命令来进行重复、繁琐的构建任务)。以Java项目为例,它的目录结构一般是这样的: ....

eclipsemavenjava

0

点赞

0

回复

148

浏览

使用Servlet和JSP实现用户注册功能

用户注册表单处理 结合Servlet和JSP来实现一个用户注册功能,此时你应该已经了解 Web表单处理 https://course.tianmaying.com/servlet and jsp+form 的关键概念。 我们将用户注册的信息存放在内存中(即Java程序中的某个变量)。首先看看用户注册表单需要填写的信息:   ...

servletjavaJSP

0

点赞

0

回复

171

浏览

【SEO】批量查询百度收录和排名

背景: 1.作为SEO,每天都有一批数据需要记录,抓取方面,收录方面,流量方面等。 2.在收录方面,收录率是非常有意义的一个指标,可以直接反映整站或者某频道的收录情况。 3.最近学习了 天码营的云音乐爬虫课程 https://course.tianmaying.com/music 163 crawler 正好用查询百度收录和排名爬虫来复习下爬虫课程。 思路: 1. 用搜索关键词构建百度搜索URL。 2. 获取百度搜索结果页内容。 3. 提取百度搜索结果(排名,标题,url)。 4. 收录判定 上核心代码: public class PCBaiduHtmlParser {...

java爬虫seo

3

点赞

0

回复

343

浏览

为什么需要Java接口?

很多初学Java的同学都不知Java接口 interface 到底用什么作用,为什么需要这样一个概念。在知乎上也回答过类似的问题。这里再简单记录一下,供各位同学参考。注意,接口相关的设计思想是面向对象设计的一个精华所在,这里只是一个面向初学者的简单阐述。 1. 接口是一种规范 下面这张图是我们生活中遇到的接口:电源插座接口。 没错!它就是一种规范,中国2010年制定的插座标准。 2. 为什么需要规范呢? 因为有了接口规范: 任何电器只有有符合规范的插头,就可以获得电力 任何厂家(西门子插座,TCL插座,公牛插座...)按照规范进行制作,就能进行供电 每个厂家插座的生产技术、工艺都不一样,因为接口的implementation可以不一样,但是并不影响电器的正常工作。插座的内部实现对于电器来说是完全屏蔽的。 对于软件开发是类似的: 按照接口规范进行方法调用,就能获得所期望的功能 按照接口规范实现接口的的方法,就能提供所期望的功能 接下来是重点了: 软件开发大多是一个协作性的工作 :电器和插座分别是不同人完成的,有了接口大家就能分头开干,都按照接口来办事,各自做完就能轻松地整合到一起。各部分的测试也更加方便。 软件需要不断演化 :今天你用了公牛的插座,过了一年你可能换个西门子的插座,要做没有这套国家接口标准,各自为政,那估计你是换不了插座了。你想想,咱们每次去美国出差,都得带个转接头,否则就跪了,多不方便啊,因为接口规范不同啊!(这些个转接头你是不是闻道一种浓浓的Adapter模式的味道)。 3. 什么时候需要通过接口建立规范 为了抽象系统的某种公共行为,或者封装变化性,进行系统设计的时候你需要抽取出接口,这样将来你的系统将更加灵活。 直接写实现的方式在确定性的场景下当然也可以,不涉及到分工协作、变化性、测试方便等因素时,当然用不着接口了。比如一般情况下你犯不着为一个Pojo的getter和setter也弄个接口和实现分离。 所以面向对象的大神们孜孜不倦地教导我们说: 接口和实现分离,面向接口编程 。 ...

java

1

点赞

0

回复

594

浏览

Java贪吃蛇应用的设计与实现

今天来实现一个简单的贪吃蛇应用,效果如下: 这里把大概实现过程跟大家讲解一下,完整的教程比较长,大家参考 Java贪吃蛇 https://course.tianmaying.com/java snake 在网上能找到不少贪吃蛇的代码,但是往往写得比较乱,甚至有所有代码都包含在一个类中的情况,对于初学者而言即使能Copy后跑起来,也不一定能够真正理解代码的逻辑。 实际上实现贪吃蛇的代码并不复杂,如果尝试去给出优雅地实现,比如写出具有清晰的类结构,有助于真正提高大家程序设计的基本功。 此外,应该让代码具有良好的扩展性,将来你希望更新你的贪吃蛇应用时,比如: 让贪吃蛇显示出不同的样子 增加或者修改积分规则 应该要做到修改尽量少的代码。实际的应用都是不断演化的,良好的设计能够让应用更易于维护。 所以贪吃蛇应用非常适合入门Java编程的同学,可以了解用面向对象的方式来编程解决问题,学习如何设计类,如何选择数据结构以及Java Swing的基础知识。 开始设计 Java是一门面向对象语言,一个Java程序就是一系列对象(Object)的集合,对象通过方法调用来彼此协作完成特定的功能。面向对象是一种非常符合人类思维的编程方法,因为现实世界就是由对象和对象之间的交互来构成的,所以我们其实很容易将现实世界映射到软件开发中。其实我们可以把Java语言当成是一门普通的语言,学习英语是为了与世界交流,而学习Java就是与计算机交流。我们需要把自己的思维,通过Java语言表达出来,让计算机理解。 那现在我们怎么用Java,用面向对象的思维,来表达出贪吃蛇这个游戏呢? 贪吃蛇游戏的规则无需多言,我们马上能想到两个对象,一条蛇和一个棋盘,我们可以定义两个类: public class Snake {...

java

9

点赞

2

回复

4417

浏览

用Java实现网易云音乐爬虫

起因 前两天在知乎上看到一个帖子《 网易云音乐有哪些评论过万的歌曲? https://www.zhihu.com/question/31677442 》,一时技痒,用Java实现了一个简单的爬虫,这里简单记录一下。 最终的结果开放出来了,大家可以随意访问, 请戳这里 网易云音乐爬虫结果 http://grri94kmi4.app.tianmaying.com/songs 。 爬虫简介 网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,一个通用的网络爬虫大致包含以下几个步骤: 网络爬虫的大致流程如上图所示,无论你是做什么样的爬虫应用,整体流程都是大同小异。现在,我们就根据网易云音乐来定制一个专门爬取音乐评论数量的特定网络爬虫。 前期准备 网页类型分析 首先,我们需要对 网易云音乐 http://music.163.com/ 整个网站有个大致的了解,进入 网易云音乐首页 http://music.163.com/ ,浏览后发现其大概有这么几种类型的URL: 推荐页面 排行榜列表以及排行榜页面 歌单列表以及歌单页面 主播电台列表以及主播电台页面 歌手列表以及歌手页面 专辑列表(新碟上架)以及专辑页面 歌曲页面 我们最终需要爬取的数据在歌曲页面中,该页面里包含了歌曲的名称以及歌曲的评论数量。 另外,我们还需要尽可能多的获取歌曲页面,这些信息我们可以从前面6种类型的页面拿到。其中,歌单列表以及歌单页面结构最简单,歌单列表直接分页就可以拿到。因此,我们选择歌单页面作为我们的初始页面,然后歌单列表 歌单 歌曲一路爬下去即可。 设计数据模型 通过上述分析,我们可以知道我们要做两件事情,一是爬取页面歌单列表 歌单 歌曲,二是将最终的结果存储起来。因此,我们只需要两个对象,一个用来存储页面相关的信息,url、页面类型、是否被爬过(html和title作为临时数据存储),另外一个用来存储歌曲相关信息,url、歌曲名,评论数。因此,model类如下: public class WebPage {...

爬虫spring-mvcjava

0

点赞

0

回复

660

浏览

微信公众号开发:弹幕应用中接收消息

微信公众号大家都很熟悉了,当你拥有了微信公众号之后,你可以在 微信公众平台 https://mp.weixin.qq.com/ 中对你的公众号进行管理。 微信公众平台 https://mp.weixin.qq.com/ 为我们提供了很强大的管理功能,包括群发消息、自动回复、自定义菜单等等。但是,需求是多种多样的, 微信公众平台 https://mp.weixin.qq.com/ 中的功能必然不能满足所有的用户需求。今天,我们就来学习一下如何利用微信的开放接口来实现一个微信弹幕的简单后台。 申请微信公众号 第一步,我们首先得拥有一个微信公众号,进入 微信公众平台 https://mp.weixin.qq.com/ ,点击右上角【立即注册】进入注册页面: 按要求填写基本信息,激活邮箱、验证个人信息等等操作后,注册成功。此时,作为一个最简单的公众号,微信已经给我们了很多相应的权限,在【接口权限】页面中我们可以看到我们所拥有的所有权限: 浏览一下权限以及状态,我们可以看到,我们已经拥有了接收消息的相应的权限。现在,我们就来通过该接口在我们的程序中接收普通的消息。 服务器配置 接收微信公众号消息的流程是这样的:用户向公众号发送消息,微信接收消息,并向你的开发服务器发送一个POST请求,该请求包含了该消息的相关信息,如由谁发给谁、内容是什么等,最后开发服务器接收消息并进行相应的处理。 我们可以看到,微信会主动的向你的开发服务器推送相应的消息,很明显,我们需要在微信公众平台中进行相应的设置: 点击修改配置,此时需要填写以下四个信息: URL 微信将发送数据到该地址,该URL需要处理GET请求以及POST请求。GET请求用于微信验证该URL是否属于你,当你提交你的服务器配置时,微信会往该地址发送一个GET请求,只有当该请求返回结果正确时,你的修改才会成功,否则提示【token验证失败】。POST请求用于接收微信的相关信息,当有人往公众号发送信息时,微信将把相关信息通过POST请求发送到该地址 Token 用于加密的令牌,GET请求时验证微信身份时会用到,可以随意填写 EncodingAESKey 用于对信息加密,当使用安全模式时,微信发送过来的信息是用该字段进行加密后的字符串,你可以使用微信提供的算法对字符串进行解密,获取信息内容,直接随机生成即可 消息加密方式 明文模式 发送过来的消息不进行加密,直接使用即可 兼容模式 明文、密文共存,方便调试 安全模式 发送过来的消息只有密文,安全系数较高 这里,我们根据实际情况将URL、Token、EncodingAESKey填好,直接选择明文模式接收公众号的消息。 在介绍URL参数时我们也提到了,此时点击提交,由于我们未完成URL GET请求的处理,将提示【token验证失败】,因此,我们先把服务器配置的提交放一放,先来完成服务端的开发。 验证服务器地址 当我们提交服务器配置时,微信会向我们配置的URL发送一个验证请求,该请求包含下列四个参数: signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 timestamp 时间戳 nonce 随机数 echostr 随机字符串 我们接收到请求后,验证过程如下: 1. 将token、timestamp、nonce三个参数进行字典序排序 2. 将三个参数字符串拼接成一个字符串进行sha1加密 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 4. 若该请求来源于微信,原样返回echostr,则接入成功,否则接入失败 Java代码如下: @Value("${weixin.token}")...

wechatspringbootweixinjava

1

点赞

0

回复

1155

浏览

Spring处理自动装配歧义

自动装配中冲突 自动装配(autowiring)要求bean的匹配具备唯一性,否则就会产生歧义,从而抛出异常。 例如,如果我们给 QunarBookingService 和 CtripBookingService 都标注上 @Component ,则应用上下文中会有两个 BookingService 实例。 QunarBookingService.java @Component...

springjava

新建主题 记录代码

学员动态

  • c**e向课程作业中提交了代码
  • 天**君评论了j**e在课程中的作业:看看编译错误提示,你...
  • 天**君回复了咲**i在课程中的问题:你理解和教程不太一样...
  • b**0添加了笔记:注意,将一个整数和字...
  • b**i添加了笔记:4.Java中的注释...
  • c**e向课程作业中提交了代码
  • b**0添加了笔记:Integer in...
  • d**7向课程作业中提交了代码
  • 天**君评论了d**g在课程中的作业:你的代码有编译错...
  • t**t向课程作业中提交了代码
  • 天**君回复了咲**i在课程中的问题:后面会讲解代码的意思...
  • L**R添加了笔记:与大部分编程语言相同...
  • d**g在课程作业中回复了老师:那怎么设置输入呢...
  • w**w向课程作业中提交了代码
  • c**e在课程作业中回复了老师:understand...
  • v**s向课程作业中提交了代码
  • d**7在课程作业中回复了老师:老师,我这个题 做不...
  • 斑**斓添加了笔记:String for...
  • b**i添加了笔记:1.public s...
  • 天**君评论了d**g在课程中的作业:要设置输...
  • 天**君评论了d**g在课程中的作业:如何运行代码还记得吗...
  • R**c向课程作业中提交了代码
  • d**g向课程作业中提交了代码
  • 咲**i在课程中提出了问题:还有就是 我用的ec...
  • b**i添加了笔记:以加法运算为例,如果...
  • S**S回复了咲**i在课程中的问题:你仔细看下应该有 两...
  • 天**君评论了t**t在课程中的作业:”天码营的一篇博客“...
  • d**g在课程作业中回复了老师:好的,那除了这个还有...
  • s**9向课程作业中提交了代码
  • F**e向课程作业中提交了代码
  • b**i添加了笔记:3.所有的标识符都应...
  • c**e在课程作业中回复了老师:what is th...
  • 天**君回复了d**g在课程中的问题:代码提交上...
  • 8**u添加了笔记:包装 Integer...
  • a**e向课程作业中提交了代码
  • c**g向课程作业中提交了代码
  • 天**君回复了l**9在课程中的问题:欢迎来到天码营学习,...
  • s**9向课程作业中提交了代码
  • R**d向课程作业中提交了代码
  • w**n添加了笔记:Servlet AP...
  • c**e在课程作业中回复了老师:And, why i...
  • d**g在课程中提出了问题:老师,请问代码哪里出...
  • t**t添加了笔记:,且每个代码块只能执...
  • R**d向课程作业中提交了代码
  • t**t添加了笔记:泛型类支持多个类型参...
  • R**c向课程作业中提交了代码
  • t**t添加了笔记:因此,在方法执行时,...
  • t**t向课程作业中提交了代码
  • 8**u添加了笔记:a+=1 等于a= ...
  • 天**君回复了咲**i在课程中的问题:欢迎来到天码营学习,...
  • 斑**斓向课程作业中提交了代码
  • 天**君评论了d**g在课程中的作业:你的截图中不是有编译...
  • 天**君回复了R**d在课程中的问题:欢迎来到天码营学习,...
  • c**e向课程作业中提交了代码
  • z**3向课程作业中提交了代码
  • F**e向课程作业中提交了代码
  • t**t添加了笔记:编译器会将初始化构造...
  • c**g向课程作业中提交了代码
  • S**S评论了d**g在课程中的作业:没什么问题...
  • k**5添加了笔记:Java平台提供了很...
  • d**g在课程作业中回复了老师:可是运行之后显示这一...
  • b**0添加了笔记:String str...
  • 一**狗在课程中提出了问题:为什么不直接构造第三...
  • t**t添加了笔记:泛型类支持多个类型参...
  • d**7向课程作业中提交了代码
  • t**t添加了笔记:而对于静态变量在内存...
  • l**r向课程作业中提交了代码
  • A**e在课程中提出了问题:为啥我分别创建两个新...
  • h**g在课程中提出了问题:可以了,我把最新版本...
  • s**9向课程作业中提交了代码
  • S**S评论了d**0在课程中的作业:因为 前 面几项 是...
  • 咲**i在课程中提出了问题:对呀 如果是在cla...
  • v**s向课程作业中提交了代码
  • 天**君回复了斑**斓在课程中的问题:欢迎来到天码营学习,...
  • 天**君回复了一**狗在课程中的问题:在其它的调用场景下可...
  • 天**君评论了c**e在课程中的作业:Long,不是lon...
  • 天**君回复了A**e在课程中的问题:这个问题稍微有些高级...
  • l**n向课程作业中提交了代码
  • 天**君评论了d**g在课程中的作业:你把代码贴到本地。注...
  • 天**君回复了q**5在课程中的问题:欢迎来到天码营学习,...
  • 天**君回复了A**e在课程中的问题:你用代码和代码注释的...
  • t**t添加了笔记:泛型类支持多个类型参...
  • z**w向课程作业中提交了代码
  • c**e在课程作业中回复了老师:oh thx btw...
  • h**g在课程中提出了问题:这是什么情况啊,把系...
  • S**S评论了a**e在课程中的作业:List<Strin...
  • F**e向课程作业中提交了代码
  • b**i添加了笔记:数学运算中存在自动类...
  • d**g在课程中提出了问题:代码已经提交,麻烦老...
  • t**t添加了笔记:,且每个代码块只能执...
  • S**S评论了a**e在课程中的作业:Date date ...
  • 天**君回复了d**g在课程中的问题:不同的修饰代表方法的...
  • d**g在课程作业中回复了老师:老师,我找到cons...
  • z**3向课程作业中提交了代码
  • k**5添加了笔记:import jav...
  • b**g添加了笔记:Java要求在使用一...
  • 咲**i在课程中提出了问题:你需要使用上一节课程...
  • t**t添加了笔记:有static修饰的...
  • b**i添加了笔记:a++;a += 1...
  • t**t添加了笔记:因此,在方法执行时,...
反馈意见