你好,看完你的博客文章,感觉很不错!希望与你网站首页友情链接 流量卡知识网 http://53go.cn/ 专注于移动/联通/电信推出的大流量多语音活动长短期套餐手机卡的相关知识的介绍普及听说互换友情链接可以增加网站的收录量,特此来换,如果同意的话就给internetyewu@163.com[微信ganenboy]发信息或者就在此回复下吧!【建站问题也可以一起讨论!】
你好,看完你的博客文章,感觉很不错!希望与你网站首页友情链接 流量卡知识网 http://53go.cn/ 专注于移动/联通/电信推出的大流量多语音活动长短期套餐手机卡的相关知识的介绍普及听说互换友情链接可以增加网站的收录量,特此来换,如果同意的话就给internetyewu@163.com[微信ganenboy]发信息或者就在此回复下吧!【建站问题也可以一起讨论!】
你好
http://bigota.d.miui.com/V14.0.9.0.TLJCNXM/ingres_images_V14.0.9.0.TLJCNXM_20230323.0000.00_13.0_cn_chinatelecom_aff802bb3e.tgz
已添加贵站友链 Southerly 个人博客 || http://www.southerly.top || https://www.southerly.top/imgs/favicon.ico || 一个正在努力搬砖的兼职程序员,记录生活,分享生活,欢迎大家来访。
目前这种不行了
老哥呀,现在这种方法还能爬到数据嘛?可以聊聊不
https://www.aliyundrive.com/s/5N2bKDVZfxC
https://wwi.lanzoup.com/iU6FZ0o4as1i
04824ADB9F824ADB9F0400824ADB9F000F
https://lihh.lanzouf.com/ij6c80nhq7rg
https://cloud.189.cn/web/share?code=FvuIbuJBnEVr
https://lihh.lanzouf.com/ij6c80nhq7rg
https://developer.aliyun.com/plan/student?taskCode=vmfeitian2023&recordId=5246709&undefined&share_source=copy_link
已加,三天之后检查没加本站链接 就下了
首页
大佬聚集地
欢迎大家
教程分享
每日一看
Search
1
欢迎来到河马博客
41,755 阅读
2
守护者群管小栗子框架下载教程
40,885 阅读
3
烟花模拟器(php)
35,661 阅读
4
外链搜索引擎优化如何发布
13,617 阅读
5
一键搭建表白墙源码+教程
13,255 阅读
软件分享
教程分享
源码分享
游戏攻略
百科知识
SEO课程
登录
Search
标签搜索
推特
升学考试
账号
数学
饺子
笔记本电脑
笔记本
研究生考试
字符
英语
函数
马斯克
笔记本电脑排名前十
操作
初一
联想
考研
广告
注册
账户
河马
累计撰写
7,218
篇文章
累计收到
81
条评论
今日撰写
50
篇文章
首页
栏目
软件分享
教程分享
源码分享
游戏攻略
百科知识
SEO课程
页面
大佬聚集地
欢迎大家
教程分享
每日一看
用户登录
登录
搜索到
1368
篇与
的结果
2023-12-03
全程干货(java开发的app有哪些)java的开发平台有哪些,Java 开发者不容错过的 12 种高效工具,java ivy是什么,
摘要:Java 程序员常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用、正在使用或将来一定会用到的高效工具。Java 程序员常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用、正在使用或将来一定会用到的高效工具。这份列表名单包括集成开发环境、集成工具、测试和质量工具等。1、集成开发环境Eclipse是最有名也最广泛使用的Java集成开发环境(IDE),允许开发者结合语言支持和其他功能到任何的默认包中,而且Eclipse市场有许多定制和扩展的插件。IntelliJ已经引起了开发者的“追捧”,甚至比Eclipse还受宠,有免费版和专业版。IntelliJ为众多Java EE框架提供了针对框架的编码帮助和提升生产效率的功能,还有大多数应用服务器的部署工具。NetBeans的也属于IDE类,允许开发者快速、简便地开发桌面应用、移动应用和Web应用。NetBeans是免费开源的,还拥有全球性的用户和开发者社区。JDeveloper是Oracle提供的一个免费的集成开发环境,它为Oracle融合中间件和融合应用产品提供完整的端到端开发,支持整个开发生命周期。2、测试JUnit是一个Java语言的单元测试框架,用于编写和运行可重复的测试。它为测试预期结果提供断言,为共享的常用测试数据提供测试装置(test fixtures),以及运行测试的测试者(test runners)。可以在这里看一下JUnit的教程。TestNG是受到了JUnit的启发开发而成,但同时还具有一些新功能,所以相对而言,TestNG更加强大也更便于使用,如注解(annotations)、灵活的测试配置、数据驱动的测试和参数支持,以及强大的执行模型。它涵盖了单元测试、功能、端到端、集成测试,支持各种工具和插件(Eclipse、IDEA、Maven等)。具体内容可以参考分别使用 Maven Failsafe 与 TestNG 进行单元测试与集成测试的文章。Mockito是一个mocking框架,帮助开发者编写具有简洁API的精美测试。其测试的可读性很好,并能产生清晰的验证错误。使用Mockito还能在执行后可以对交互进行问询。Mocks是透明的,所以开发者可以专注于测试选定的行为。更多详情可以参考mockito的相关文章。Arquillian是一个Java和JVM的测试平台,主要侧重于集成和功能测试。它去掉了单元测试,重点关注真正实时环境下的程序代码的相互作用。Arquillian为测试配备了容器生命周期管理和典型测试精选。3、集成Apache Maven是一个非常著名的软件项目管理和综合工具。基于项目对象模型(POM)的概念,它的信息中心管理着项目的构建、报告和文档。Maven提供了一个统一的构建系统、项目信息和最佳的开发实践指导,并且支持新功能的透明迁移。Gradle是一个开源的自动化构建系统。Gradle可以自动构建、测试、发布、部署,还有多种软件包或其他类型项目,如生成静态网站。Gradle结合了Ant的能力和灵活性,以及Maven的依赖管理和约定,形成了一种高效的构建方式。Apache Ant是一个开源的Apache项目,经Apache软件许可发布。它由多种内置任务而成,允许开发者编写、装配、测试和运行java应用程序。它的特点是高度灵活,不会严格限制Java项目的编码惯例或目录布局。Apache Ivy是一种流行的依赖管理工具,注重灵活性和简单性。它是Apache Ant项目的一个子项目,而Ivy用来解决项目依赖项。外部的XML文件定义项目依赖项,并列出构建项目的所需资源。然后Ivy从artifact 存储库(artifact repository)中下载资源,它具有良好的灵活性和可配置性。Apache Ivy 是由Apache Apache Ant集成的,因此将使Apache Maven的依赖管理优势也带到Apache Ant构建文件中,为那些已经使用Apache Ant且不想迁移到Apache Maven的开发者提供了便利。4、应用服务器Apache Tomcat是一个开源的Web服务器和Servlet容器,由Apache软件基金会(ASF)开发。它实现了几个Java EE规范,包括Java Servlet、JavaServer Pages(JSP)、Java EL和WebSocket,提供了一个可以运行Java代码的HTTP Web服务器环境。想要了解更多请点击。WildFly,其前身是JBoss AS或Jboss,是一个由Jboss开发的应用服务器,现在由红帽在开发维护。它是用Java编写的,并且实现了Java平台和企业版(Java EE)规范。WildFly是可以在多个平台上运行的免费开源工具。GlassFish是由Sun Microsystems的Java EE平台起步,现在由Oracle公司赞助的开源应用服务器项目。支持的版本叫做Oracle GlassFish应用服务器。GlassFish是免费软件,经两个免费的软件许可证批准:通用开发与发布许可(CDDL)和GNU通用公共许可证(GPL)。Oracle WebLogic服务器是一个Java EE应用服务器,目前由Oracle公司开发,用于构建和部署企业应用Java EE,支持降低运营成本、提高性能、增强可扩展性和支持Oracle应用组合等的新特性。5、Web应用测试Apache JMeter是开源的Apache项目,实际上是一个专为负载功能测试和性能测试的Java应用。它最初的设计是用于Web应用,但现在已扩展到其他测试功能。它可以测试静态和动态资源性能,模拟一个或多个服务器负载来测试它的强度或者分析不同负载类型下的整体性能。可以查看关于Jmeter的更多详情。SoapUI是一个免费的开源跨平台的功能测试解决方案。它提供了一个图形界面和企业级功能,允许创建和执行自动化功能、回归、符合性和负载测试。SoapUI在一个测试环境下提供了完整的测试覆盖率,而且支持所有的标准协议和技术。6、质量分析SonarQube是一个开源的平台,现已成为代码质量管理系统的世界领先者,并且因代码质量的持续检查为众人所知。除了Java外,它还支持大多数的语言,而且可以用作Android开发,它集成了大多数的持续集成工具。SonarQube会为重复代码、编码标准、单元测试、代码覆盖、复杂代码、潜在错误、注释、设计和架构而产生报告。FindBugs也是开源的工具,在Lesser GNU Public license许可下发布。它运行在Java字节码上而不是源代码,可以识别和确定潜在错误的严重程度,如空指针引用、无限递归循环、Java库和死锁的错误使用。同时,它还可以作为Eclipse、NetBeans,IntelliJ IDEA的插件。可以参考FindBugs Eclipse实例。PMD是一个源代码分析器。它可以检测到常见的编程错误,如未使用的变量、空的catch块、不必要的对象创建等等。它支持除了包括Java的大多数语言,还包含CPD、复制粘贴探测器。Checkstyle的是一个开发工具,可以帮助程序员坚持按编码标准来编写Java代码,会自动启动Java代码检查。它的配置性很强,能支持几乎任何的编码标准。7、版本控制Apache Subversion是众所周知的SVN工具,是一个软件版本和版本控制系统,在一个开源许可下发布。目前,它是由一个Apache软件基金会的项目开发,也是全球性开发者和用户社区的一部分。Git是一个免费开源的分布式版本控制系统,能够提高大小事务的速度和效率。相对于其他的配置管理工具,Git的特色在于提供廉价的局部分支、便利的暂存区和多个工作流。每个Git工作目录是一个完整的版本库,有完整历史和完整版本的跟踪能力、独立的网络接入或中央服务器。可以查看更多Git的文章。8、持续集成Jenkins是一个屡获殊荣的应用程序,能够监视重复的工作,从建立一个软件项目到由cron运行的作业。它的基本功能是不断建立和测试软件项目,使得开发者能更容易地将变更集成到项目中,使用户更容易获得新的构建。Jenkins还可以监控外部运行任务的执行,如cron jobs,即使是运行在远程计算机上的任务。Apache Continuum是一个企业级持续集成服务器。提供的特性包括:自动构建、发布管理、基于角色的权限管理,以及能与其它流行构建工具和源代码管理系统相集成。Hudson是一个用Java编写的持续集成(CI)工具,在应用服务器上运行。它支持各种SCM工具,如Subversion、Git,可以执行Apache Ant和Apache Maven项目,以及任意shell脚本和Windows批处理命令。它监视重复任务的执行,如建立一个软件项目或由cron运行的作业。9、Java 应用分析在为分析Java应用开发最创新的智能工具方面,YourKit Java分析器是技术的领头羊。你可以在CPU和内存分析上都使用YourKit解决方案,还可以以最大生产率和零开销来分析大型应用。同时,Java分析器还有几个刚提出的分析创新,为其在各大小型企业的专业Java开发者获得了当之无愧的人气。JProfiler是商业许可的Java分析工具,对于分析性能瓶颈、内存泄漏、CPU负载和解决线程问题等方面非常有效,它支持在同一台机器或远程机器上进行分析。用户可以看到活跃的总字节、实例、线程、类和垃圾回收器活动的可视化表示。它可以作为一个独立应用使用,也可以作为Eclipse软件开发环境的插件。OneAPM For Java可以展示业务代码的trace,实时展示缓慢的sql语句和nosql操作,还可以方便地监控JVM。可以智能探知 Java 应用之间的相互调用关系,通过串联复杂的后台组件,动态生成 J2EE 应用整体架构视图。通过拓扑图直观了解分布式或 SOA 架构应用的运行状态,准确定位系统问题。同时监控后台事务和 Web 事务。10、代码覆盖工具JaCoco是衡量和报告Java代码覆盖率的一个开源工具包。它是由Eclipse公共许可协议许可,是目前唯一能支持Java 8的字节代码覆盖工具。Clover是一个商业的代码覆盖工具,它提供的指标可以让程序员更好地平衡编程和测试。它在IDE或你的持续集成系统下运行,还包括能加快测试速度的测试优化。11、Bug跟踪JIRA是帮助团队规划和构建优秀产品的跟踪工具。成千上万的团队选择JIRA来捕捉和组织问题、分配工作、跟进团队活动。它是付费工具,但有一个7天的免费试用期。Trac是一个针对软件开发项目开发的完善wiki和问题的跟踪系统,以最简洁的方式对Web软件项目进行管理。它还可以帮助开发人员编写优秀的软件,提供了对Subversion和Git(或其他版本控制系统)的接口,集成了wiki和便捷报告程序。Trac允许wiki在问题描述和提交信息中标记,还创建了bug、任务、变更、文件和页面之间的链接和无缝引用。12、文档生成工具Javadoc是Oracle公司用来从Java源代码中生成HTML格式API文档的生成工具。IDE可以自动生成HTML代码。许多文件编辑器帮助用户生成Javadoc源,并将 Javadoc 信息当作程序员的内部参考。Javadoc也提供了用于创建doclets和taglets的API,让你能够进一步分析 Java 应用的结构。Document! X是自动化的Java文档工具和完整的文档编写环境的结合体,可以用来为你的Java项目创建准确的专业文档。它会自动将生成的文档集成在Java IDEs中,同时还能给库、命名空间、类、接口、构造函数、方法、属性和字段生成文档页面。以上就是为Java开发者提供的一系列可以提高编程效率的工具,尽情试用吧!以后,妈妈再也不用担心你的“高效开发”了!阿里Java高级大牛直播讲解知识点,分享知识,五大专题都是各位老师多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知扣群Java高级架构师交流群:680075317备注好信息!
2023年12月03日
0 阅读
0 评论
0 点赞
2023-12-03
深度揭秘(jdbc7个步骤)jdbc6个步骤,<>JDBC小结,java ivy是什么,
1>请简述什么是JDBC和持久化概念 JDBC是英文:Java DataBase Connectivy 的缩写,是java在内部提供对应的接口(也就是java提供规范),同时各个厂商的数据库提供接口的实现类(通过提供jar包的形式),从而实现java与数据库的交互.持久化概念是什么?持久化概念指将数据存储在可掉电式存储设备中,具体的实例就是将数据存储在关系型数据库(如MySql)中,它是实际存储在我们的硬盘上的.2>请简述如何通过代码层面完成java代码和数据库之间的交互? 我们通过各个关系型数据库提供的实现类来调用方法,它具体的步骤可概括为:贾琏欲执事(当然在执行DML和DQL是有区别的)2.1>贾:表示加载驱动(jar包里面的实现类) 琏:通过DriverManager获得connection连接对象 欲:一般通过预编码对象preparedStatement来执行sql语句 执:通过excutexxx();来执行sql语句 事:释放对应的资源说明:2.1>对于注册驱动,mysql5之后,mysql会自动帮你注册,所以加载驱动:Class.forName("com.mysql.jdbc.Driver")是可以省略的(但一般来说,还是写比较好)2.2>在通过preparedStatemnt执行语句时候,我们可以无需将sql语句的值写死,只是提供一个问号作为占位符,然后再通过preparedStatement对象的get方法传入对应的参数,即可预处理数据(注意:还没开始执行哦)3>如何理解DAO思想,怎么实现DAO? DAO是英文:Data Acess Object 的缩写,中文意思是数据访问对象,其实就是将CRUD的方法封装成一个接口和对应的实现类来操作数据库 其中接口定义的方法有:3.1>插入操作:public void insert(Object o); //要插入的数据被封装成了一个对象 3.2>删除操作:public void delete(Long id);//通过传入一个id,来修改对应行数 3.3>修改操作:public void updateById(Object o);3.4>查询操作(查询一个对象): public void Object selectById(Long id);//通过传入id来进行查询,并且将数据封装到一个对象里面 查询操作(查询多个对象): public void List selectAll();//返回多个对象并将他们放在list集合中4>如何理解JDBC中的事务?请你用自己的语言来简诉事务.事务是由一组逻辑单元组成,一个逻辑单元可以理解为一个sql语句,在Mysql的系统中,在常见的三种存储引擎(MyISAM/MEMORY/INNODB)只有innodb存储引擎才支持事务,所以在创建表的时候,要注意这一点,而事务的存在是为了能将两个逻辑单元的事务实现业务逻辑上的统一,这一点在转账的案例上尤为突出,如果在代码层面上,第一个逻辑单元已经完成了对该行的修改,突然中间因为某些原因导致了异常,那么第二个逻辑单元的并没有实现对应的修改,最后导致一致性的破坏,为了解决这种情况的出现,我们需要引入事务.那么事务是如何使用的呢?首先事务的使用时需要Connection对象来调用对应的方法,那么为什么是connection调用而不是Statement对象来调用呢?因为statment的使用常常是多样的,并且statment对象是connection调方法出来的,所以connection的功能更加强大,所以用connection调用那么怎么使用事务呢? 三点:1>开启事务,在innodb中事务是默认提交的,我们需要调用connection.setAutoCommit(false);将自动提交改为手动提交 2>提交事务:connection.commit();3>回滚事务:connection.rollBack();一旦在某个逻辑单元出现异常的时候,立马回滚,也即各个逻辑单元回到初始状态.5>当利用DAO思想,实现数据库的数据转成对象时,怎么保证输出的时间格式为"yyyy-MM-dd HH:mm:ss"?5.1>从上图得知,时间的格式是yyyy-MM-dd HH:mm:ss的,我一开始的思路是利用resultset.getDate("createtime")提取出来日期,再将其封装到对象的date属性中,然而问题是通过上述方法,只能获取到年月日的准确时间,而无法获取时分秒(都是00:00:00).5.2>为了获取准确的时分秒,我使用了resultset.getTimeStamp("createtime")的方法,发现这个方式的输出,确实能实现时分秒的输出,然而我却奇怪地发现在每一个时分秒后面都多了一个0,比如2011-02-09 11:22:57.0,我现在都没清楚这个0是从哪里来的,但是我已经离正常的输出又近了一步5.3>我在通过new Date(timestamp.gettime())去创建了date对象,然后我再利用simpledateformat将它format成字符串,这时候的输出就是我想要的,可以看看下图: 5.4> 上面通过时间戳的方式创建的date对象,我仍然将它传给对象,但为了输出的效果,我在对象类的toString方法中进行了小小改变:我这直接在creatime的输出处输出了被格式化的时间
2023年12月03日
0 阅读
0 评论
0 点赞
2023-12-03
燃爆了(java图形界面设计流程图)java图形界面程序设计,Java-GUI编程之绘图,java fillrect,
很多程序如各种小游戏都需要在窗口中绘制各种图形,除此之外,即使在开发JavaEE项目时,有时候也必须"动态"地向客户 端生成各种图形、图表,比如 图形验证码、统计图等,这都需要利用AWT的绘图功能。1组件绘图原理之前我们已经学习过很多组件,例如Button、Frame、Checkbox等等,不同的组件,展示出来的图形都不一样,其实这些组件展示出来的图形,其本质就是用AWT的绘图来完成的。在AWT中,真正提供绘图功能的是Graphics对象,那么Component组件和Graphics对象存在什么关系,才能让Component绘制自身图形呢?在Component类中,提供了下列三个方法来完成组件图形的绘制与刷新:paint(Graphics g):绘制组件的外观;update(Graphics g):内部调用paint方法,刷新组件外观;repaint():调用update方法,刷新组件外观;一般情况下,update和paint方法是由AWT系统负责调用,如果程序要希望系统重新绘制组件,可以调用repaint方法完成。2Graphics类的使用实际生活中如果需要画图,首先我们得准备一张纸,然后在拿一支画笔,配和一些颜色,就可以在纸上画出来各种各样的图形,例如圆圈、矩形等等。程序中绘图也一样,也需要画布,画笔,颜料等等。AWT中提供了Canvas类充当画布,提供了Graphics类来充当画笔,通过调用Graphics对象的setColor()方法可以给画笔设置颜色。画图的步骤:1.自定义类,继承Canvas类,重写paint(Graphics g)方法完成画图;2.在paint方法内部,真正开始画图之前调用Graphics对象的setColor()、setFont()等方法设置画笔的颜色、字体等属性;3.调用Graphics画笔的drawXxx()方法开始画图。其实画图的核心就在于使用Graphics画笔在Canvas画布上画出什么颜色、什么样式的图形,所以核心在画笔上,下表中列出了Graphics类中常用的一些方法:方法名称方法功能setColor(Color c)设置颜色setFont(Font font)设置字体drawLine()绘制直线drawRect()绘制矩形drawRoundRect()绘制圆角矩形drawOval()绘制椭圆形drawPolygon()绘制多边形drawArc()绘制圆弧drawPolyline()绘制折线fillRect()填充矩形区域fillRoundRect()填充圆角矩形区域fillOval()填充椭圆区域fillPolygon()填充多边形区域fillArc()填充圆弧对应的扇形区域drawImage()绘制位图案例:使用AWT绘图API,完成下图效果演示代码:import java.awt.*;importjava.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Random;public class SimpleDraw {private final String RECT_SHAPE="rect";private final String OVAL_SHAPE="oval";private Frame frame = new Frame("这里测试绘图");private Button drawRectBtn = new Button("绘制矩形");private Button drawOvalBtn = new Button("绘制椭圆");//用来保存当前用户需要绘制什么样的图形private String shape="";private MyCanvas drawArea = new MyCanvas();public void init(){//为按钮添加点击事件drawRectBtn.addActionListener(newActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {shape = RECT_SHAPE;drawArea.repaint();}});drawOvalBtn.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {shape = OVAL_SHAPE;drawArea.repaint();}});//定义一个Panel,装载两个按钮Panel p = new Panel();p.add(drawRectBtn);p.add(drawOvalBtn);//把panel添加到frame底部frame.add(p,BorderLayout.SOUTH);//设置画布的大小drawArea.setPreferredSize(new Dimension(300,200));//把画布添加到frame中frame.add(drawArea);frame.pack();frame.setVisible(true);}public static void main(String[] args) {new SimpleDraw().init();}//1.自定义类,继承Canvas类,重写paint方法private class MyCanvas extends Canvas{@Overridepublic void paint(Graphics g) {Random r = new Random();if (shape.equals(RECT_SHAPE)){//绘制矩形g.setColor(Color.BLACK);g.drawRect(r.nextInt(200),r.nextInt(100),40,60);}if(shape.equals(OVAL_SHAPE)){//绘制椭圆g.setColor(Color.RED);g.drawOval(r.nextInt(200),r.nextInt(100),60,40);}}}}推荐阅读:Java-GUI编程之菜单组件Java-GUI编程之事件处理Java-GUI编程之AWT组件Java-GUI编程之布局类型
2023年12月03日
0 阅读
0 评论
0 点赞
2023-12-03
一看就会(java 动态代理 cglib)java反射实现动态代理,java反射基础 && 动态代理解决乱码问题 && 注解,java注释乱码,
java反射类加载的概述类加载分为三个步骤:类加载,,连接,,初始化加载:指的是,将class文件读入到内存中,并为之创建一个Class对象。任何类被使用系统都会创建一个Class对象连接:验证class文件知否符合要求。准备,为静态成员分配内存。解析class文件初始化:进行构造方法的初始化类加载的时机:创建类的实例对象调用类的静态成员,为静态变量赋值调用类的静态方法。使用反射生成相应的Class对象初始化某个类的子类直接运行主类类加载器的分类根类加载器BootstrapClassLoader负责一些核心类的加载,比如String int float System这些类频繁的与内存进行交互,一般是非常快,是伪类,用c c++写扩展类加载器Extension ClassLoader 在ext包下的jar都会该加载器应用类加载器App ClassLoader 平常我们自定义的类都是用的应用类的加载器反射概述反射就是获得某个类在运行状态中的字节码对象,Class对象,并根据该对象中的方法,去解析该类中的属性和方法。并且去调用该类的属性和方法。这种动态获取信息,并且动态调用对象的方法就是java语言的反射机制获取Class对象类名.classnew 类名().getClass()Class,forName(“类的全路径”)反射的使用基本用法通过反射获取无参的构造方法和获取带参的构造方法并使用public static void main(String[] args) throws Exception{Class<People> clazz = People.class;//获得该Class对象所表示的类的无参的构造方法,并为其创建一个实例.//不是无参的构造,就不能用这种方式People people = clazz.newInstance();String b = people.b;System.out.println(b);//获取该Class对象所表示的类的有参的构造方法,参数写相对应参数类型的Class对象,不写默认为空,返回无参构造方法Constructor<People> constructor = clazz.getConstructor(String.class);People people = constructor.newInstance();String b = people.b;System.out.println(b);}通过反射获取公共的成员变量和获取私有的成员变量public static void main(String[] args) throws Exception {//先通过反射获取实例Class<People> clazz = People.class;People people = clazz.newInstance();//获取该Class对象表示的类的公共的成员变量Field b = clazz.getField("b");String o = (String)b.get(people);System.out.println(o);//获取Class对象表示的类的私有的成员变量//通过暴力反射Field a = clazz.getDeclaredField("a");//暴力反射要先设置权限a.setAccessible(true);int o1 = (int)a.get(people);System.out.println(o1);}通过反射获取公共的成员方法Class对象中的getMethod() 方法,获取该方法,返回Method对象Method对象中的invoke() 方法,执行该方法这是在运行期间,通过反射获取字节码对象,并且运行方法的方式public static void main(String[] args) throws Exception {Class<People> clazz = People.class;Constructor<People> constructor = clazz.getConstructor(String.class);People people = constructor.newInstance("dsa");//获取获取该Class对象表示的类的公共的成员方法Method m = clazz.getMethod("text");Object invoke = m.invoke(people);System.out.println(invoke);}通过反射越过泛型检查泛型只在编译期间有效,在运行期间无效通过反射实现动态代理代理,相当于中介,自己要做的事情没有做,交给了别人动态代理:程序运行的过程中产生的这个对象。这个对象就是通过反射来获得的一个实例对象(代理对象),实现通过java.lang.reflect 包下的Proxy对象 和 InvocationHandler接口生成代理对象,注意,只能代理接口。更强大的代理:使用cglib创建代理对象:public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)throws IllegalArgumentException都会调用方法 InvocationHandler 接口中的 invoke() 方法Object invoke(Object proxy,Method method,Object[] args)throws Throwable代码解析public static void main(String[] args) {/*** 第一个参数:告诉虚拟机通过反射创建出类的字节码文件用哪个字节码加载器(应用类加载器)加载到内存* 第二个参数:告诉虚拟机通过反射创建出来的字节码文件中应该有多少个方法,也就是被代理对象实现了那些接口* 第三个参数:告诉虚拟机创建的字节码文件中的方法应该怎么处理*/Icar o =(Icar) Proxy.newProxyInstance(Demo1.class.getClassLoader(), GooleCar.class.getInterfaces(), new InvocationHandler() {/**** @param proxy 动态代理的实例,不用管* @param method 动态代理对象正在执行的方法* @param args 动态代理对象正在执行的方法中的参数的值,不写默认为null* @return* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {String start = method.getName();if("start".contentEquals(start)){/*** 执行当前的方法。* 第一个参数:是被代理的对象* 第二个参数:方法执行的参数的值,不写默认为空*/method.invoke(new GooleCar(),args);System.out.println("hahahahahhah");}return null;}});o.start();}动态代理解决乱码问题当进行二次开发的时候,我们只有api,没有源码,也不能继承,要想增加功能,进行二次开发,使用动态代理模式解决乱码问题,使用过滤器。每次请求都进行了中文乱码问题的处理。实现:增请HttpServletRequest类中的getParameter()方法,使其获取中文数据的时候,不出现乱码问题代码实现final HttpServletRequest request = (HttpServletRequest) servletRequest;要使用final修饰才可以public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {final HttpServletRequest request = (HttpServletRequest) servletRequest;//在不知道源码,不能继承的情况下改变request中的getParameter方法,解决乱码问题HttpServletRequest myRequest = (HttpServletRequest)Proxy.newProxyInstance(MyFilter.class.getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object obj = null;String name = method.getName();if ("getParameter".equalsIgnoreCase(name)) {//增强getParameter()方法String method1 = request.getMethod();if ("get".equalsIgnoreCase(method1)) {//get请求解决乱码问题,转码String invoke = (String) method.invoke(request, args);String a = new String(invoke.getBytes("ISO-8859-1"), "utf-8");return a;} else { //post请求解决乱码问题request.setCharacterEncoding("utf-8");obj = method.invoke(request, args);}}else {obj = method.invoke(request,args);}return obj;}});filterChain.doFilter(myRequest,servletResponse);}注解注解要求:了解开发中地位:类似dom4j解析XML文件. XML文件的解析程序员不会去解析,配置XML文件。 后期的开发中不会自定义注解,反射读取注解信息.什么是注解注解就相当于一个数据类型,与类、接口类似注解的作用配置文件生成帮助文档编译检查注解特点直接可以在变量、方法、类之上加载注解可以由属性,也可以没属性注解的作用范围源码期间有效String类上的 ,注释里面的注解,帮助生成帮助文档,可以识别String类上的相关的注解@Author, 表示作者@Since,表示版本@See ,参照的东西编译期间有效告诉编译器部分信息@Override 声明当前方法是重写父类的方法@Deprecated 声明以下方法是过时的方法,不建议大家使用@Suppresswarning 抑制编译器发生警告信息运行期间有效当我们在当前代码上以Junit方式运行时,Junit会运行方法上包含@Test注解的方法@Test我们再当前代码上以Junit方式运行时,Junit会运行方法上包含@Test注解的方法自定义注解格式:public @interface 注解名称{public 属性类型 属性名称1();public 属性类型 属性名称2() default 默认值;}自定义注解属性支持的类型:基本数据类型(4类8种),String,Class,Annotation(注解类型),枚举类型,以及以上类型的一维数组类型注解作用: 配置作用配置:开发的时候部分信息不希望写死在程序中,例如数据库的用户名和密码,可以将用户名和密码存放在.txt , .properties ,.xml文件中,利用程序来读取文件中的内容框架:一大堆工具类组合,目的:加速项目开发什么时候用注解来做配置?如果配置信息不会发生的修改,例如servlet路径,建议使用注解的形式如果配置信息需要发生频繁的修改,例如数据库的用户名和密码信息, 建议采用传统方法 (.txt , .properties , .xml)模拟Junit通过反射读取字节码上的注解信息md.isAnnotationPresent(MyTest.class)元注解注解的注解,声明当前注解作用域以及目标对象,如果没有声明,在运行期间是无法获取到注解的信息@Runtention 声明当前注解的作用域@target 声明当前注解的目标对象代码实现自定义注解@MyTest//自定义注解,相当于JUnit@Test//定义注解的时候,需要通过元注解Retention说明当前自定义注解的作用域(Class,Source,Runtime)@Retention(RetentionPolicy.RUNTIME)//定义注解的时候,需要通过元注解Target说明当前的自定义注解的目标对象@Target(ElementType.METHOD)public @interface MyTest {//在MyTest注解中定义成员属性,默认值为-1public long timeout() default -1;}定义UserDaopublic class UserDao {static{System.out.println("加载静态代码段的消息");}@MyTestpublic void addUser(){System.out.println("增加用户");}@MyTestpublic void delUser(){System.out.println("删除用户");}@MyTestpublic void uptUser(){System.out.println("更新用户");}public void getUser(){System.out.println("获取用户");}}定义类MyJunit ,模拟JUnitpublic class MyJunit {public static void main(String[] args) throws Exception {//加载UserDao.class字节码文件中的方法,判断哪些方法上有自定义的注解@MyTest,如果当前的方法有@MyTest,执行,否则不执行//1_将UserDao.class字节码文件加载到内存中 ,class对象(代表字节码文件在内存中的对象)Class clazz=Class.forName("com.itcast.test02.UserDao");Class claszz01=UserDao.class;Class claszz02=new UserDao().getClass();//2_获取字节码对象上所有的方法,返回Method数组对象,数组中的每一个元素都代表Method对象(相当于字节码上的每一个方法)Method[] mds = clazz.getMethods();//3_遍历字节码对象上所有的方法for (Method md : mds) {//测试方法的名称//System.out.println(md.getName());//判断当前方法上是否有@MyTest注解信息//System.out.println(md.isAnnotationPresent(MyTest.class));if(md.isAnnotationPresent(MyTest.class)){//如果当前的方法上有@MyTest注解,执行,否则忽略md.invoke(new UserDao());}}}}
2023年12月03日
0 阅读
0 评论
0 点赞
2023-12-03
燃爆了(javaweb使用)javaweb使用的技术,Java Web轻松学41 - JSTL初步使用,java jstl,
本系列文章旨在记录和总结自己在Java Web开发之路上的知识点、经验、问题和思考,希望能帮助更多(Java)码农和想成为(Java)码农的人。目录介绍JSTL规范下载JSTL包含哪些库JSTL如何使用租房网应用中使用JSTLJSTL相关的JAR包EL表达式访问列表的长度JSTL的forEach标签剩下的页面改造总结介绍上篇文章我们使用JSP技术对租房网平台进行了改造,也提到下面这样的代码有点奇葩:<%for (House house : mockHouses) {System.out.println(house); %><li><h2><a href="house-details.jsp?userName=${param.userName}&houseId=<%=house.getId() %>"><%=house.getName() %></a></h2></li><%} %>像这样的代码我们可以使用JSTL技术来解决。当然,JSTL可不仅仅只有这点功能,你还可以定义自己的标签。在这篇文章里,我提到过JSTL是JSP相关的技术,从它的名字全称(JSP Standard Tag Library,即JSP标准标签库)就可以看出来。在本篇文章里,我们就尝试初步使用JSTL来进一步改造我们的租房网应用。JSTL规范下载既然称之为库,那么它包含哪些库呢?我们可以把JSTL规范下载下来看一下,当然你也可以找本相关书籍,或者直接在网上搜索一下。JSTL规范的下载类似Servlet规范的下载(可以参考这篇文章),不过我们在JCP官网(https://jcp.org/en/home/index)中搜索的关键字就变成Tag或Tag Library了。我们在搜索结果中就可以看到:点击 Download page 链接可以看到:然后继续点击底部的 Maintenance Review 2 of JSR 52 链接,跳转到:不过,再次点击DOWNLOAD按钮时,我这边出现无法访问此网站的错误。所以我转而点击底部的 JSR-000052 A Standard Tag Library for JavaServer Pages Detail Page 链接:从这里我们可以看到JSTL规范的各个阶段,我们选择 Maintenance Release 2 这个阶段,点击它右边的 Download page 链接:然后再点击红色箭头所指的链接,跳转到真正的下载页面:后续操作就跟Servlet规范的下载类似了。JSTL包含哪些库现在,我们可以打开JSTL规范,可以看到如下描述:事实上,JSTL应该就只是一个库,但它根据不同功能而划分成了多个库:核心:变量支持、流控制、URL管理等等,它的命名空间URI是:http://java.sun.com/jsp/jstl/core,标签前缀通常使用:cXML处理:它的命名空间URI是:http://java.sun.com/jsp/jstl/xml,标签前缀通常使用:x国际化:语言区域、消息格式化、数字和日期格式化等,它的命名空间URI是:http://java.sun.com/jsp/jstl/fmt,标签前缀通常使用:fmt数据库访问(SQL):它的命名空间URI是:http://java.sun.com/jsp/jstl/sql,标签前缀通常使用:sql函数:集合长度、字符串操作等,它的命名空间URI是:http://java.sun.com/jsp/jstl/functions,标签前缀通常使用:fnJSTL如何使用JSTL的终极目标是简化JSP页面的开发,所以,它应该是在JSP页面中使用。既然是标签,那它的使用是否跟HTML标签、XML标签类似呢?答案是肯定的。不过,JSTL标签的使用与XML标签使用时声明命名空间类似,也需要告诉Servlet/JSP容器该JSP页面需要引入某个库(即上述的核心、XML处理、国际化、数据库访问、函数等等,以及以后自定义的标签)。在JSP页面中是使用一个JSP指令(即taglib指令,之前我们用过page指令)来声明的:<%@ taglib uri="uri" prefix="prefix" %>举个例子,假设我们要使用JSTL的核心库,则应该在JSP页面的开头处这样声明:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>然后,就可以使用核心库的标签,比如out标签:<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"]/><c:out value="value" [escapeXml="{true|false}"]>default value</c:out>注意:在标签的语法中,[]表示可选的属性。如果值带下划线,则表示为默认值。out标签有两种形式,有属性和属性值,也可能有标签内容,跟HTML标签和XML标签类似。租房网应用中使用JSTL我们就拿租房网应用中的房源列表页面houses.jsp来使用JSTL改造,因为这里涉及列表数据的展示。列表数据是很常见的,我们经常可以看到包含列表数据的页面,比如订单列表、商品列表等等。houses.jsp原来的代码是这样的:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ include file="include.jsp"%><%List<House> mockHouses = (List<House>) request.getAttribute("mockHouses");System.out.println(mockHouses);%><h6>共找到你感兴趣的房源 <%=mockHouses.size() %> 条</h6><ul><%for (House house : mockHouses) {System.out.println(house); %><li><h2><a href="house-details.jsp?userName=${param.userName}&houseId=<%=house.getId() %>"><%=house.getName() %></a></h2></li><%} %></ul></body></html>首先要引入JSTL中的核心库(因为我们后面要用到的forEach标签是属于核心库的):<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ include file="include.jsp"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>遗憾的是,我们添加这句声明之后,Eclipse就报错了:提示是说找不到这个标签库的描述符。那就根据这个提示在网上搜索答案呗。答案就是原来我们还需要在我们的工程结构里配置JSTL相关的JAR包,而Tomcat这个Servlet/JSP容器本身不提供这些JSTL相关的JAR包,我们需要单独下载。JSTL相关的JAR包那么在哪里下载呢?既然我们是使用Tomcat这个Servlet/JSP容器,那么我们就可以到它的官网(http://tomcat.apache.org/)上看看:我们可以看到左侧导航栏中有个Taglibs链接,我们点进去看看:还真就是JSTL相关JAR包的下载页面,点击Download链接进去,可以找到真正的下载链接:我们可以看下Binary README文件,里面有该JAR包版本支持的Tomcat和JSP等版本信息,如果我们使用的Tomcat是最新版本(9.0.x),那直接下载下面四个JAR包即可,否则需要点进Archives页面下载历史版本。好,我们把四个JAR包下载下来之后,就可以添加到我们的租房网应用的工程里面了,可以参考这篇文章。实际上,直接把这四个JAR包拷贝到WebContent/WEB-INF/lib节点下是最快的。现在,我们可以看到上述的Eclipse报错提示就消失了。EL表达式访问列表的长度首先,我们可以使用EL表达式来访问列表的长度:<h6>共找到你感兴趣的房源 ${mockHouses.size()} 条</h6>据说低版本的JSP容器不可以这样直接用EL表达式来访问列表的长度,而应该使用JSTL的函数库中的length方法:${fn:length(list) }当然,首先需要引入JSTL的函数库。读者朋友可以自行尝试一下。JSTL的forEach标签我们可以通过JSTL规范查看一下这个forEach标签的用法:当然,可能只看这个语法格式还是不太明白如何使用,那么可以继续看规范中的描述,或者直接网上搜索即可。我们需要改造的代码是这一部分:<%for (House house : mockHouses) {System.out.println(house); %><li><h2><a href="house-details.jsp?userName=${param.userName}&houseId=<%=house.getId() %>"><%=house.getName() %></a></h2></li><%} %>我们可以先把它注释掉(在Eclipse中可以选中这一段,然后键入Ctrl + Shift + /),然后敲入开始标签的左尖括号 < ,于是Eclipse会出现智能提示:嗯,这个功能还是挺好用的,提高开发效率。闲话不多说了,直接上代码:<c:forEach var="house" items="${mockHouses}"><li><h2><a href="house-details.jsp?userName=${param.userName}&houseId=${house.id}">${house.name}</a></h2></li></c:forEach>看似跟之前变化不大,但至少没那么奇葩了,风格也与HTML很一致。forEach标签遍历列表数据的基本属性是:var:相当于定义一个变量来表示指向列表中的某一项;items:指定需要遍历哪个列表,需要注意的是其值又是使用EL表达式来访问页面/请求/会话/应用中的某个属性数据(即使用setAttribute()添加的对象)forEach标签的内容就可以是普通的HTML标签了,然后HTML标签里我们就可以使用EL表达式来访问列表中每一项数据。实际上,EL表达式直接访问对象的属性,而非调用对象的方法,比如:${house.id}注意,param是EL的隐式对象,它是由Servlet/JSP容器创建并传进来的,它可以直接访问请求所携带的参数。所以,我们实际上可以把原来的这一部分:<%List<House> mockHouses = (List<House>) request.getAttribute("mockHouses");System.out.println(mockHouses);%>删除掉。现在houses.jsp的代码就变成这样了:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ include file="include.jsp"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><h6>共找到你感兴趣的房源 ${mockHouses.size()} 条</h6><ul><c:forEach var="house" items="${mockHouses}"><li><h2><a href="house-details.jsp?userName=${param.userName}&houseId=${house.id}">${house.name}</a></h2></li></c:forEach></ul></body></html>是不是清晰明朗了许多?当然,JSP页面的开发者必须知道传进这个页面的到底有哪些数据对象!没错,这就相当于把数据的展示(视图层)给分离开来,你需要与后端(控制器层和模型层)约定/设计好每一个JSP页面都有哪些数据对象。然后,JSP页面的开发者和后端(控制器层和模型层)的开发者就可以各自独立去开发了。剩下的页面改造剩下的house-details.jsp和house-form.jsp该如何改造呢?大家可以先思考一下。提示:JSP页面应该只关心取数据展示,而不应该关心如何查找到某个数据这种逻辑,应该把这种逻辑放到后端(控制器层和模型层)。我的改造是这样的,把原来这两个页面的如何查找到某个数据这种逻辑放到Filter中,前后端约定好这两个页面中存在target这个House对象,于是doFilter()方法中在将请求交给下个节点之前应该挂载上target这个House对象:if (userName == null || userName.isEmpty()) {System.out.println("invalid user!");httpServletResponse.sendRedirect("login.html");} else {String houseId = httpServletRequest.getParameter("houseId");if (houseId != null && !houseId.trim().isEmpty()) {House target = findHouseById(houseId);//找不到怎么办?httpServletRequest.setAttribute("target", target);}chain.doFilter(request, response);}另外,应该把如何查找某个房源的逻辑封装起来:private House findHouseById(String houseId) {for (House house : mockHouses) {if (houseId.equals(house.getId())) {return house;}}return null;}然后,这两个页面就极其简单了,house-details.jsp是这样的:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ include file="include.jsp"%><h2>${target.name}<a href="house-form.jsp?userName=${param.userName}&houseId=${target.id}">编辑</a></h2><h3>${target.detail}</h3><h4><a href="houses.jsp?userName=${param.userName}">回到列表</a></h4></body></html>house-form.jsp是这样的:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ include file="include.jsp"%><form action="house-form.servlet" method="post"><input type="hidden" name="userName" value="${param.userName}"/><input type="hidden" name="houseId" value="${target.id}"/><label for="house_name">房源名字:</label><input type="text" id="house_name" name="houseName" value="${target.name}" /><label for="house_detail">房源详细信息:</label><input type="text" id="house_detail" name="houseDetail" value="${target.detail}" /><input type="submit" value="提交" /></form></body></html>可以看到,这两个页面只是取数据(target这个House对象)展示而已。总结JSTL的终极目标是简化JSP开发;JSTL的使用需要先声明某个库;JSTL的标签使用类似HTML标签和XML标签,语法规则可以查看JSTL规范;JSP页面使用JSTL和EL表达式基本可以实现大部分功能;EL表达式能够直接访问页面/请求/会话/应用这几个对象中挂载(即setAttribute()方法)的数据对象;EL表达式使用 ${ } ;EL中存在隐式对象,以后再介绍;列表数据很常见很重要;列表数据采用JSTL的forEach标签来遍历(实际上也可以采用EL表达式,比如${mockHouses[i].id});前后端开发的分离:前端只关心取数据如何展示;后端关心如何取数据并挂载到页面/请求/会话/应用这几个对象中;前后端需约定/设计好数据;
2023年12月03日
0 阅读
0 评论
0 点赞
1
2
...
274