你好,看完你的博客文章,感觉很不错!希望与你网站首页友情链接 流量卡知识网 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课程
页面
大佬聚集地
欢迎大家
教程分享
每日一看
用户登录
登录
搜索到
1686
篇与
的结果
2023-12-03
越早知道越好(java文字乱码怎么解决)java中文乱码解决方法有哪些呢,JAVA中文乱码问题应该怎么解决?,java action 中文乱码,
大家好,我是Dodo团队的娇娇。最近工作中遇到中文乱码的问题,这里做下记录,同时也跟大家分享下。这篇文章是以以下这种方式展开的,先提出问题,列出解决方案,最后再寻找原理。第一,先讲出我在工作中遇到的问题:通过“http://users.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg?uins=QQ号码”,来获取QQ账号信息的接口有中文乱码的问题。以下是我遇到问题的代码:public static String sendGet(String url, String param) { String result = "";BufferedReader in = null; try { String urlNameString = url + "?" + param; URL realUrl = new URL(urlNameString); // 打开和URL之间的连接URLConnection connection = realUrl.openConnection(); // 设置通用的请求属性 connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive");connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 建立实际的连接 connection.connect(); // 定义 BufferedReader输入流来读取URL的响应InputStreamReader reader = new InputStreamReader( connection.getInputStream()); in = new BufferedReader(reader); String line; while ((line = in.readLine()) != null) {result += line; } } catch (Exception e) { System.out.println("发送GET请求出现异常!" + e); e.printStackTrace(); } // 使用finally块来关闭输入流 finally { try { if (in != null) {in.close(); } } catch (Exception e2) { e2.printStackTrace(); } } return result;}之后将获取QQ信息的接口以及参数传入后,结果遇到中文的时候,会返回给我一串以下的内容:portraitCallBack({"1262255026":["http://qlogo3.store.qq.com/qzone/1262255026/1262255026/100",9685,-1,0,0,0,"�����ʰ���ഺ",0]})大家是不是对这种平时不在意,一遇到了还没辙的问题感到烦恼,我也觉得很烦,那我们应该如何来解决这种问题呢?在步入正题之前,让我们先简单了解下何为JAVA编码?要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言。由于人类的语言有太多,因而表示这些语言的符号太多,无法用计算机中一个基本的存储单元—— byte 来表示,因而必须要经过拆分或一些翻译工作,才能让计算机能理解。(引用自https://www.cnblogs.com/yuan1164345228/p/6937958.html)唉,如果有个大一统的编码标准,也不至于我们遇到这种问题头痛脑热了。可是这种问题吧,还真心没有特别好的解决方案,也只有一个一个试,但是试也是有方向的,总不至于JAVA中160个编码格式一个一个试过去吧,额,其实也不用一个一个试,通过Charset.availableCharsets()就可以得到所有的编码格式,然后一个循环走起就好了,但是有时候还得需要了解下常用的编码格式,以及它们的区别,因为他们有的是有包含关系的,下面就让我们来了解下几种常用的编码格式吧。JAVA编码中几种常用的编码格式:ASCII码总共128个,用一个字节的低7位表示,0~31是控制字符,如换行、回车、删除等,32~126是打印字符,可以通过键盘输入并且能够显示出来.ISO-8859-1 扩展自ASCII,仍然是单字节编码,一共能表示256个字符GB2312双字节编码。总编码范围A1~F7 ,其中A1~A9是符号区,包含682个符号,从B0~F7是汉字区,包含6763个汉字GBK扩展自GB2312,能表示21003个汉字,其编码和GB2312是兼容的。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符GB18030在实际应用系统中使用的并不广泛UnicodeUnicode 是 Java 和 XML 的基础,使用0~65 535的双字节无符号数对每一个字符进行编码UTF-8是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码,使用Unicode编码,一个英文字符要占用两个字节,在Internet上,大多数的信息都是用英文来表示的,如果都采用Unicode编码,将会使数据量增加一倍。为了减少存储和传输英文字符数据的数据量,可以使用UTF-8编码。不知道你有没有大致了解我们几种常用的编码格式了呢?我想我的答案已经不重要了,但还是写一下吧:把 // 定义 BufferedReader输入流来读取URL的响应InputStreamReader reader = new InputStreamReader( connection.getInputStream());改为// 定义 BufferedReader输入流来读取URL的响应InputStreamReader reader = new InputStreamReader( connection.getInputStream(),"gbk");我觉得我没有将很原理性的内容写下来,并且我的理解还尚浅,有机会再做补充,希望大家指正~
2023年12月03日
0 阅读
0 评论
0 点赞
2023-12-03
新鲜出炉(别问在不在 图片带字)别问在不在 总统都没我敬业,别再问Cookie了,再问就崩溃了!,java cookie 过期时间,
作者: 懿 来自:Java极客技术说实话,之前面试都是直接去背诵的面试题,关于 Cookie 的一些内容,比如说,记录浏览器端的数据信息啦, Cookie 的生命周期啦,这些内容,也从来没有研究过 Cookie 到底是怎么工作的,今天我们就来了解一下 Cookie 到底是怎么工作的。1.什么是CookieCookie 是当前识别用户,实现持久会话的最好方式。前面各种技术中存在的很多问题对它们都没什么影响, 但是通常会将它们与那些技术共用, 以实现额外的价值。Cookie 最初是由网景公司开发的, 但现在所有主要的浏览器都支持它。Cookie 非常重要, 而且它们定义了一些新的 HTTP 首部, 所以我们要比前面那些技术更详细地介绍它们。Cookie 的存在也影响了缓存, 大多数缓存和浏览器都不允许对任何 Cookie 的内容进行缓存。2.Cookie 的类型会话 Cookie会话 Cookie 是一种临时Cookie, 它记录了用户访问站点时的设置和偏好。用户退出浏览器时, 会话 Cookie 就被删除了。持久 Cookie持久 Cookie 的生存时间更长一些;它们存储在硬盘上, 浏览器退出, 计算机重启时它们仍然存在。通常会用持久 Cookie 维护某个用户会周期性访问的站点的配置文件或登录名。那么问题来了,这两种 Cookie 的区别又在哪里,不用想,看名字,持久,会话,是不是明白了,对,没错,会话 Cookie 和持久 Cookie 之间唯一的区别就是它们的过期时间。稍后我们会看到,如果 设置了 Discard 参数,或者没有设置 Expires 或 Max-Age 参数来说明扩展的过期时 间,这个 Cookie 就是一个会话 Cookie。没错,两个 Cookie 之间就是这么容易区别,但是很多时候,面试官问的时候,我们却把这个给忘的干干净净。3.面试官:那你来说一下这个 Cookie 是怎么工作的我们来看一幅图:图中的 a 段 ,当我们在第一次访问 Web 网站的时候, Web 服务器对我们现在过去的用户信息一无所知。Web 服务器希望这个用户会再次回来,所以想给这个用户“拍上”一个独有的 cookie,这样以后它就可以识别出这个用户了。cookie 中包含了一个由名字 = 值(name=value)这样的信息构成的 任意列表,并通过 Set-Cookie 或 Set-Cookie2 HTTP 响应(扩展)首部将其贴到用户身上去。但是 Cookie 中能存储的信息,绝对不会只是 ID 号,相信大家做开发的,也肯定知道 Cookie 能存什么,比如说,Cookie: name="Brian Totty"; phone="555-1212"我存了个这东西,它也是允许的。浏览器会记住从服务器返回的 Set-Cookie 或 Set-Cookie2 首部中的 Cookie 内容,并将 Cookie 集存储在浏览器的 Cookie 数据库中(把它当作一个贴有不同国家贴纸的旅行箱)。将来用户返回同一站点时图中的 c 段,浏览器会挑中那个服务器贴到用户上的那些 Cookie,并在一个 Cookie 请求首部中将其传回去。这就是 Cookie 的工作原理,Cookie 就像服务器给用户贴的“嗨,我叫”的贴纸一样。用户访问一个 Web 站点时,这个 Web 站点就可以读取那个服务器贴在用户身上的所有贴纸。4.Cookie罐说实话哈,我在看到这个名词的时候,第一反应就是,翻译书籍的作者,有点懵人呀,直接这么翻译,不太负责任呀,后来发现,这么翻译,确实也是有一定道理的,原因如下:因为 Cookie 的基本思想就是让浏览器积累一组服务器特有的信息,每次访问服务器时都将这些信息提供给它。浏览器内部的 Cookie 罐总可以有成百上千个 Cookie,也是因为浏览器要负责存储 Cookie 信息,所以此系统被称为客户端侧状态 (client-side state)。这个 Cookie 规范的正式名称为 HTTP 状态管理机制(HTTP state management mechanism)。我猜测因为它能够存储如此多的 Cookie ,所以当时书中的作者就翻译成了 Cookie 罐,这么想起来,也是很有道理的。上图,是在某一个网站的时候,正在使用的 Cookie ,我的是中文的, 具体的 Cookie 的位置,以 Google 浏览器为例子,在你的安装目录下,D:\software\360Chrome\Chrome\User Data\Default,里面有 Cookies 的一个文档。不同的浏览器位置是不一样的,如果各位还想看,请打开你的搜索引擎,开始你的表演把。因为 Cookie 里面是加密的信息,所以,我就不给大家看一堆乱码了。不同站点使用不同的 Cookie浏览器内部的 cookie 罐中可以有成百上千个 cookie,但浏览器不会将每个 cookie 都发送 给所有的站点。实际上,它们通常只向每个站点发送 2 ~ 3 个 Cookie。大家看我上面的图,正在使用的可不是那么一个,是好多个。为什么?原因如下:对所有这些 Cookie 字节进行传输会严重降低性能。浏览器实际传输的 Cookie 字节数要比实际的内容字节数多!Cookie 中包含的是服务器特有的名值对,所以对大部分站点来说,大多数 Cookie 都只是无法识别的无用数据。将所有的 Cookie 发送给所有站点会引发潜在的隐私问题,那些你并不信任的站点也 会获得你只想发给其他站点的信息。说白了,就是浏览器只向服务器发送服务器产生的那些 Cookie。很多 Web 站点都会与第三方厂商达成协议,由其来管理广告。这些广告被做得像 Web 站 点的一个组成部分,而且它们确实发送了持久 Cookie。用户访问另一个由同一广告公司提供服务的站点时,(由于域是匹配的)浏览器就会再次回送早先设置的持久 Cookie。营销公司可以将此技术与 Referer 首部结合,暗地里构建一个用户档案和浏览习惯的详尽数 据集。现代的浏览器都允许用户对隐私特性进行设置,以限制第三方 Cookie 的使用。5.Cookie 安全这个才是本文的重点,不得不承认,Cookie是一个神奇的机制,同域内浏览器中发出的任何一个请求都会带上 Cookie ,无论请求什么资源,请求时,Cookie出现在请求头的Cookie字段中。服务端响应头的 Set-Cookie 字段可以添加、修改和删除 Cookie,大多数情况下,客户端通过 JavaScript 也可以添加、修改和删除 Cookie。相信很多某机构出来的哥们一定想到了一个东西,跨域,是的,就是它,因为 Cookie 子域机制,其实这也是 Cookie 的domain字段的机制,设置Cookie时,如果不指定domain的值,默认就是本域。这也是很多培训机构中说的 SSO 单点登录跨域。假如说,我们现在有一个 a.test.com的域,通过 JavaScript 来设置一个 Cookie,语句如下:document.cookie="test=1";那么,domain值默认为a.test.com,但是,a.test.com 域设置 Cookie 时,可以指定 domain 为父级域,比如:document.cookie="test=1;domain=test.com";此时,domain 就变为 test.com,这样带来的好处就是可以在不同的子域共享 Cookie,坏处也很明显,就是攻击者控制的其他子域也能读到这个 Cookie。另外,这个机制不允许设置 Cookie 的 domain 为下一级子域或其他外域。这时候就有人会说了,Jsonp 的方式不是可以让我们很容易的实现跨域的操作了么?是的,是能实现,但是 Get 请求是可以的,那么 POST 请求呢?想没想过?那我来给大家安利一个。CORS跨域资源共享机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。比如,站点 http://domain-a.com 的某 HTML 页面通过的 src 请求http://domain-b.com/image.jpg。网络上的许多页面都会加载来自不同域的 CSS 样式表,图像和脚本等资源出于安全原因,浏览器限制从脚本内发起的跨域 HTTP 请求。例如,XMLHttpRequest 和 Fetch API 遵循同源策略。这意味着使用这些 API 的 We 应用程序只能从加载应用程序的同一个域请求 HTTP 资源,除非响应报文包含了正确 CORS 响应头。跨域资源共享( CORS )机制允许 Web 应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。现代浏览器支持在 API 容器中(例如 XMLHttpRequest 或 Fetch )使用 CORS,以降低跨域 HTTP 请求所带来的风险。CORS流程请求发起时,浏览器先判断当前是否是跨域的AJAX;如果是,判断是否是普通类型请求(GET类型,无自定义头数据);普通请求,直接发起GET到服务端,在响应头中寻找 Access-Contro-Alow- Origin,如果有且允许,处理响应结果;不是普通请求(非GET类型,或有自定义头), 先 PreFlight(即发起一个 method= OPTIONS)的请求;要求返回 Access-Control-Allow- Methods 和 Access-Control-Allow- Headers, 内容体为空;PreFlight 正确执行后, 再发起GET请求, 获得响应结果, 并处理结果.好了关于 HTTP 中的 Cookie 机制就说这些把,说的太多了,恐怕大家会烦,下一篇文章,我们来详细说 HTTP 的加密解密。很有意思呦,敬请期待!文章参考:《图解 HTTP》《HTTP 权威指南》我是懿,一个正在被打击却努力前进的码农。
2023年12月03日
0 阅读
0 评论
0 点赞
2023-12-03
不看后悔(java数据拷贝)java拷贝一个对象,Java中几种拷贝List的方法比较,java list clone,
Java中几种拷贝List的方法比较:BeanUtils.copyProperties()Collections.copy()new ArrayList<>()list.addAll()Orika MapperFacadeJava拷贝List的方法有十多种。设我们有三个list,定义如下,List<Person> list1 = init(); // 人员列表,里面已经有10个Person对象List<Person> list2; // 人员列表List<Student> list3; // 学生列表,Student和Person是两个不同的类,两者字段有对应关系要把list1的内容拷贝到list2或者list3中。一、玩具方法直接赋值法List<Person> list2 = list1;clone法ArrayList<Person> list2 = list1.clone(); // 必须用实现类(ArrayList),不能用List接口这两个方法纯属搞笑,写出这样写法的人可以转行了,我们不讨论。我认为JDK的Object.clone方法的设计者也应该转行,我做了十多年Java从没见过clone有什么用。二、BeanUtils.copyPropertiesSpring-Beans库的工具类 org.springframework.beans.BeanUtilslist2 = null;BeanUtils.copyProperties(list1, list2); // 运行期异常,参数不能为nulllist2 = new ArrayList<>();BeanUtils.copyProperties(list1, list2); // 没有效果,list2的元素个数仍然为0。这个方法效果还比不上直接赋值法,直接赋值的话至少list2里面有了10个元素,这个方法是一个元素都没有。三、BeanUtils.copyProperties (Apache Commons)org.apache.commons.beanutils.BeanUtilsApache Commons库的工具类,和Spring的BeanUtils类名、方法名、参数都一模一样。外国人也流行抄袭吗。这个BeanUtils估计和Spring的效果一样。四、Collections.copyJDK自带的Collections工具类 java.util.Collections。 list2 = new ArrayList<>();for (int i = 0; i < 10; i++) {list2.add(null); // 必须手动把list2的长度增加到10,否则拷贝了之后list2长度仍是0 }Collections.copy(list2, list1); // 参数顺序相反,list2要放在前面Collections.copy是浅拷贝,list1的10个元素,和list2的10个元素,是一样的,修改其中一边的,另一边跟着改(因为是同一个引用)。 for (Person person:list1) {person.setName("支浩宇");}for (Person person:list2) {System.out.println(person.getName()); // 支浩宇 // 修改list1的元素,list2的元素也跟着变,量子纠缠 }浅拷贝比直接赋值要更进一步。如果直接赋值的话,list1和list2两个对象是相等的,是同一个引用,List<Person> list2 = list1;System.out.println(list2==list1); // true浅拷贝的话,list2是用new语句创建出来的新的对象,因此list1和list2两个对象不相等,list2 = new ArrayList<>();Collections.copy(list2, list1);System.out.println(list2==list1); // falselist.add(), list.remove()这些操作,不会影响到另一个list。五、new ArrayList<>() list2 = new ArrayList<>(list1); // 浅拷贝这种方法和Collections.copy法效果完全一样,也是浅拷贝,写法更简短,只要一行代码,Collections.copy要5行(算上import要6行)。六、list.addAll() list2 = new ArrayList<>();list2.addAll(list1);这种方法也和上面两种方法效果完全一样,也是浅拷贝。addAll主要用于把多个List合并成一个List。addAll()底层调用的是System.arraycopy(),我们直接调用System.arraycopy()也可以,这个方法有5个参数,太麻烦了,本文不把它作为一种方法介绍。七、Orika MapperFacade 深拷贝说了这么多个浅拷贝的方法,能不能来个深拷贝的?Maven引入一个叫做Orika的库。 <dependency><groupId>net.rakugakibox.spring.boot</groupId><artifactId>orika-spring-boot-starter</artifactId><version>1.9.0</version></dependency>这里我用Spring Boot Starter引入,不用Spring的话单独引入Orika也可以。import ma.glasnost.orika.MapperFacade;// MapperFacade对象注入@Autowiredprivate MapperFacade mapperFacade;list2 = mapperFacade.mapAsList(list1, Person.class);此时list2里面的10个元素,都是全新的对象,不再与list1里面的元素发生量子纠缠。修改list1的元素,list2的元素不会跟着变。原本Object.clone()就应该完成的事情,你看我们试了多少种方法才最终完成。这个功能很难吗,JDK不能自带吗,为什么非要依赖别的库才能实现。你说Object.clone的设计者是不是应该转行(不,设计者说我都70多岁了,早就退休了)。八、List<Person>深拷贝到List<Student>Orika库还可以实现两个不同类型之间的深拷贝。List<Person> list1 = init(); // 人员列表,里面已经有10个Person对象List<Student> list3; // 学生列表,Student和Person是两个不同的类,两者字段有对应关系list3 = mapperFacade.mapAsList(list1, Student.class);这样就把List<Person>拷贝到了List<Student>里面,10个元素都是全新的对象,没有量子纠缠,而且Student对象里的各个字段值也自动set进去了。
2023年12月03日
0 阅读
0 评论
0 点赞
2023-12-03
太疯狂了(jstl标签作用)简要回答jstl标签的主要作用和存在的意义,JavaWeb详解(第六篇)之JSTL标签简介,java jstl,
1、JSTL概述1.1、什么是JSTLJSTL全称是指JavaServer Pages Standard Tag Library(JSP 标准标签库),提供了一系列的JSP标签,可以应用于各种领域,如:基本输入输出、流程控制、循环、XML 文件剖析、数据库查询及国际化和文字格式标准化的应用等,是一个不断完善的开放源代码的 JSP 标签库。 JSTL 由五个不同功能的标签库组成:功能范围URI前缀核心标签库--重点http://java.sun.com/jsp/jstl/corec格式化http://java.sun.com/jsp/jstl/fmtfmt函数http://java.sun.com/jsp/jstl/functionsfn数据库(不使用)http://java.sun.com/jsp/jstl/sqlsqlXML(不使用)http://java.sun.com/jsp/jstl/xmlx1.2、为什么要使用JSTLEL 表达式主要是为了替换 jsp 中的表达式脚本, 而代码脚本这些并没有得到很好的优化,为了取代传统直接在页面上嵌入 Java 程序的做法,以提高程序可读性、维护性和便捷性,于是有了JSTL标签库,它使得整个 jsp 页面变得更佳简洁。1.3、如何使用1)先导入 jstl 标签库的 jar 包 注:下载地址taglibs-standard-impl-1.2.5.jartaglibs-standard-spec-1.2.5.jar(tomcat也需要此包)2)第二步, 使用 taglib 指令引入标签库<!--CORE 标签库--><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!--FMT 标签库--><%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %><!--FUNCTIONS 标签库--><%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %><!--XML 标签库--><%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %><!--SQL 标签库--><%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>2、core标签库的使用core标签库是JSTL的核心标签库,实现了最基本的功能:流程控制、迭代输出等操作!核心标签主要有:2.1、c:if<c:if>标签用于简单的条件语句。<c:if>标签的属性:使用案例:<%@ page contentType="text/html;charset=GBK" language="java"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html><html><head><title>jstl_core.jsp</title></head><body><h1>jstl_core.jsp</h1><%request.setAttribute("i", 12);%><%--test属性必须存在--%><c:if test="${empty param.user}"><h3>没有获取到user参数</h3></c:if><c:if test="${i==12}"><h3>12==12</h3></c:if><%String amind="Admin";request.setAttribute("amind",amind);%><%--var变量:用来存储test的评定结果,scope属性指定var变量的域--%><c:if test="${requestScope.amind==Admin}" var="condition" scope="session">匹配正确哦</c:if><br>获取存储值sessionScope.condition:${sessionScope.condition}<br>获取存储值requestScope.condition:${requestScope.condition}</body></html>案例效果:2.2、c:choose、c:when、c:otherwise 用于复杂判断的<c:choose>、<c:when>、<c:otherwise>标签<c:choose>标签没有属性,可以被认为是父标签, <c:when>、 <c:otherwise>将作为其子标签来使用。<c:when>标签等价于“ if”语句,它包含一个 test属性,该属性表示需要判断的条件。<c:otherwise>标签没有属性,它等价于“ else”语句。<c:when>标签的属性:属性描述是否必要默认值test条件是无使用案例:<%@ page contentType="text/html;charset=GBK" language="java"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html><html><head><title>jstl_core.jsp</title></head><body><h1>jstl_core.jsp</h1><c:choose><c:when test="${sex eq M}">男</c:when><c:when test="${sex eq F}">女</c:when><c:otherwise>性别不明</c:otherwise></c:choose></body></html>2.3、c:forEach、c:forTokensJSTL所支持的迭代标签有两个,分别是<c:forEach>和<c:forTokens>。<c:forTokens>标签则通过指定分隔符将字符串分隔为一个数组然后迭代它们。<c:forEach>标签有如下属性:<c:forTokens>标签与<c:forEach>标签有相似的属性,不过<c:forTokens>还有另一个属性:使用案例:<%@ page contentType="text/html;charset=GBK" language="java"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ page import="java.util.*"%><!DOCTYPE html><html><head><title>jstl_core.jsp</title></head><body><h1>jstl_core.jsp</h1><%--从“ 1”循环到“ 10”,并将循环中变量“ i”显示在页面上--%><c:forEach var="i" begin="1" end="10" step="1">${i}<br /></c:forEach><%--输出10以内的质数--%><c:forEach var="i" begin="1" step="2" end="10">${i}</c:forEach><br><%--遍历数组--%><%request.setAttribute("arr", new String[]{"18610541354","18688886666","18699998888"});%><c:forEach items="${ requestScope.arr }" var="item">${ item } <br></c:forEach><%Map<String,Object> map = new HashMap<String, Object>();map.put("key1", "value1");map.put("key2", "value2");map.put("key3", "value3");request.setAttribute("map", map);%><%--遍历 Map 集合--%><c:forEach items="${ requestScope.map }" var="entry">${entry.key} = ${entry.value}<br></c:forEach></body></html>使用案例二:<%@ page contentType="text/html;charset=GBK" language="java"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ page import="java.util.*"%><!DOCTYPE html><html><head><title>jstl_core.jsp</title></head><body><h1>c:forTokens</h1><span>遍历:google,runoob,taobao</span><br><c:forTokens items="google,runoob,taobao" delims="," var="name"><c:out value="${name}"/><p></c:forTokens></body></html>案例效果:2.4、c:out<c:out>用于在 JSP中显示数据就像是 <%= scripting-language %> 一样<c:out>标签有如下属性:<%@ page contentType="text/html;charset=GBK" language="java"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html><html><head><title>jstl_core.jsp</title></head><body><h1>c:out</h1>以前的写法:<%out.println("hello world"); %><%request.setAttribute("abc", "你好1");%><br><%-- 如果属性域对象中有相同的属性名,c:out 的优先级是:pageContext>request>session>application它出色的地方就多了两个属性,default和escapeXml属性。如果我们用到这两个属性,我们就使用该标签,如果没有用到这两个属性就用EL表达式就可以了--%><c:out value="hello world"></c:out><c:out value="${abc}" default="没有值" escapeXml="false"></c:out></body></html>案例效果:2.5、c:set<c:set>标签用于为变量或 JavaBean中的变量属性赋值的工作<c:set>标签有如下属性:使用案例:<%@ page contentType="text/html;charset=GBK" language="java"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html><html><head><title>jstl_core.jsp</title></head><body><h1>c:out</h1><c:set var="abc1" value="中国,北京" scope="request"></c:set><c:out value="${abc1 }"></c:out><br>等价于:<%request.setAttribute("abc", "中国,北京");%>${abc }</body></html>2.6、c:remove<c:remove>标签用于删除存在于 scope中的变量。<c:remove>标签有如下属性:使用案例:<%@ page contentType="text/html;charset=GBK" language="java"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html><html><head><title>jstl_core.jsp</title></head><body><h1>c:remove</h1><c:set var="name" scope="session" value="username"/><p>name 变量值: <c:out value="${name}"/></p><c:remove var="name"/><p>移除 name 变量后的值: <c:out value="${name}"/></p></body></html>2.7、c:catch<c:catch>用于异常捕获<c:catch>标签有如下属性:使用案例:<%@ page contentType="text/html;charset=GBK" language="java"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html><html><head><title>jstl_core.jsp</title></head><body><h1>c:catch</h1><c:catch var="myexception"><%int a=9/0; %></c:catch><c:out value="${myexception}"></c:out></body></html>案例效果:2.8、c:url<c:url>标签将URL格式化为一个字符串,然后存储在一个变量中。<c:url>标签有如下属性:使用案例:<%@ page contentType="text/html;charset=GBK" language="java"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html><html><head><title>jstl_core.jsp</title></head><body><h1>c:url</h1><%-- 产生一个字符串,并不是一个可以点的链接,并把他存入var的遍历中 --%><c:url value="http://www.baidu.com" var="bd"/>${bd }<br><a href="${bd }">百度一下</a></body></html>2.9、c:import<c:import>标签提供了所有<jsp:include>行为标签所具有的功能,同时也允许包含绝对URL。<c:import>标签有如下属性:使用案例:<%@ page contentType="text/html;charset=GBK" language="java"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html><html><head><title>jstl_core.jsp</title></head><body><h1>c:import</h1><c:import url="/el.jsp"></c:import><hr><c:import url="http://www.baidu.com" var="thisPage" charEncoding="UTF-8"/><a href="${thisPage }"></a></body></html>案例效果:2.10、c:redirect、c:param<c:redirect>用于页面的重定向,该标签的作用相当于 response.setRedirect方法的工作。并且支持<c:param>标签。<c:param>用来为包含或重定向的页面传递参数。可用于<c:url>、 <c:redirect>中。<c:redirect>标签有如下属性:<c:param>标签有如下属性:使用案例:<%@ page contentType="text/html;charset=GBK" language="java"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html><html><head><title>jstl_core.jsp</title></head><body><h1>c:redirect</h1><c:redirect url="el.jsp"><c:param name="userName" value="RW" /></c:redirect></body></html>案例效果:3、fmt标签库的使用 fmt标签库,提供了对国际化(I18N)的支持,它可以根据发出请求的客户端地域的不同来显示不同的语言,所以也叫做国际化标签库。同时还提供了格式化数据和日期的方法。fmt标签主要有:3.1、fmt:formatNumber<fmt:formatNumber>用于格式化数字,百分比,货币。<fmt:formatNumber>标签有如下属性:使用案例:<%@ page contentType="text/html;charset=UTF-8" language="java"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %><!DOCTYPE html><html><head><title>jstl_core.jsp</title></head><body><h1>fmt:formatNumber</h1><%-- <fmt:setLocale value="zh_CN"/>注:如果要实现国际化,那么编码格式要设置为utf-8,否则¥符号无法显示--%><c:set var="balance" value="120000.2309" /><p>Formatted Number (1): <fmt:formatNumber value="${balance}"type="currency"/></p><p>Formatted Number (2): <fmt:formatNumber type="number"maxIntegerDigits="3" value="${balance}" /></p><p>Formatted Number (3): <fmt:formatNumber type="number"pattern="#,#00.0#" value="${balance}" /></p><p>Formatted Number (7): <fmt:formatNumber type="percent"maxIntegerDigits="3" value="${balance}" /></p><p>Currency in USA :<fmt:setLocale value="en_US"/><fmt:formatNumber value="${balance}" type="currency"/></p></body></html>案例效果:3.2、fmt:formatDate<fmt:formatDate>标签用于使用不同的方式格式化日期。<fmt:formatDate>标签有如下属性:模式字母(所有其他字符 A 到 Z 和 a 到 z 都被保留):使用案例:<%@ page contentType="text/html;charset=UTF-8" language="java"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %><!DOCTYPE html><html><head><title>jstl_core.jsp</title></head><body><h1>fmt:formatDate</h1><c:set var="now" value="<%=new java.util.Date()%>" /><p>日期格式化 (1): <fmt:formatDate type="time"value="${now}" /></p><p>日期格式化 (2): <fmt:formatDate type="date"value="${now}" /></p><p>日期格式化 (3): <fmt:formatDate type="both"value="${now}" /></p><p>日期格式化 (4): <fmt:formatDate type="both"dateStyle="short" timeStyle="short"value="${now}" /></p><p>日期格式化 (5): <fmt:formatDate type="both"dateStyle="medium" timeStyle="medium"value="${now}" /></p><p>日期格式化 (6): <fmt:formatDate type="both"dateStyle="long" timeStyle="long"value="${now}" /></p><p>日期格式化 (7): <fmt:formatDate pattern="yyyy-MM-dd"value="${now}" /></p></body></html>案例效果:4、functions标签库的使用 JSTL Functions标签库包含一系列标准函数(EL函数),大部分是通用的字符串处理函数。使用案例:<%@ page contentType="text/html;charset=UTF-8" language="java"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %><!DOCTYPE html><html><head><title>jstl_core.jsp</title></head><body><h1>fn:functions</h1><p>containsIgnoreCase函数:${fn: containsIgnoreCase ("Tomcat","CAT")}</p><p>startsWith函数:${fn: startsWith ("Tomcat","Tom")}</p><p>indexOf函数:${fn: indexOf ("Tomcat","cat")}</p><p>substring函数:${ fn: substring ("Tomcat",0,3)}</p></body></html>案例效果:5、xml标签库的使用JSTL XML标签库提供了创建和操作XML文档的标签。6、sql标签库的使用 JSTL SQL标签库提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签。 由于xml、和sql标签库用的并不多,我们着重介绍一下自定义标签。7、自定义标签7.1、为什么要使用自定义标签JSTL标签库只提供了简单的输出等功能,这些功能毕竟有限,有很多复杂的逻辑可能并不好用这些标准的标签库去实现,所以呢需要自定义标签。在Struts中也有自己的一套标签。7.2、如何去实现自定义标签 我们去观察下标准标签库中已有的core标签库,他有一些实体类和一个c.tld。 所以要实现自定义标签需要做:1)定义一个类,现实相应的接口;2)在项目的WEB-INF文件夹中新建一个tld文件;要想让一个类成为标签类,就必须实现Jsptag接口,目前已知的实现类及接口有:a)如果要自定义一个标签我们需要去实现Tag接口或SimaapleTag接口;b)如果要自定义一个有标签体有属性的标签,继承 BodyTagSupport类c)如果要自定义一个没有标签体的标签,继承TagSupport类 当然看自己需求,决定使用哪个接口或类。7.3、自定义标签的生命周期 首先我们看一个案例:1)新建一个MyTag1类实现Tag接口import javax.servlet.jsp.JspException;import javax.servlet.jsp.PageContext;import javax.servlet.jsp.tagext.Tag;public class MyTag1 implements Tag{/** * 当WEB容器执行到自定义标签的结束标记时,调用doEndTag()方法 */@Overridepublic int doEndTag() throws JspException {System.out.println("我调用了doEndTag");return 0;}/** * 当WEB容器执行到自定义标签的开始标记时,调用doStartTag()方法 */@Overridepublic int doStartTag() throws JspException {System.out.println("我调用了doStartTag");return 0;}@Overridepublic Tag getParent() {return null;}/*** 当WEB容器执行完自定义标签后,标签处理器类会驻留在内存中,直至停止WEB应用时,WEB容器才会调用release()方法 */@Overridepublic void release() {System.out.println("我调用了release");}/** * 由服务器调用将pageContext对象传递给标签处理器类,* 使得标签处理器类可以通过pageContext对象与JSP页面进行通信 */@Overridepublic void setPageContext(PageContext arg0) {System.out.println("我调用了setPageContext");}/** * setPageContext()后调用,如果当前标签没有父标签,则传入null */@Overridepublic void setParent(Tag arg0) {System.out.println("我调用了setParent");}}2)新建一个myTag.tld<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"version="2.1"><tlib-version>1.2</tlib-version><short-name>my</short-name><uri>http://www.mytag.com</uri><tag><name>mytag1</name><tag-class>com.cn.tag.MyTag1</tag-class><!--标签体内容: empty:无标签体 scriptless:标签体可以包含 el 表达式和 JSP 动作元素,但不能包含 JSP 的脚本元素tagdependent:表示标签体交由标签本身去解析处理。 JSP:jsp2.0已不支持,表示可以是java脚本、标签,也可以是el表达式 --><body-content>empty</body-content></tag></taglib>3)新建一个myjstl.jsp<%@ page contentType="text/html;charset=UTF-8" language="java"%><%@taglib prefix="my" uri="http://www.mytag.com" %><!--引入这个标签库使用的uri--><!DOCTYPE html><html><head><title>myjstl.jsp</title></head><body><h1>自定义标签</h1><p><my:mytag1/></p></body></html>4)案例执行效果整个执行过程:a)JSP引擎遇到自定义标签,首先创建标签处理器类的实例对象;b)然后调用setPageContext()方法,将pageContext对象传递给标签处理器类,使得标签处理器类可以通过pageContext对象与JSP页面进行通信;c)setPageContext()方法执行完后,调用setParent()方法,将当前标签的父标签传递给当前处理器类,如果当前标签没有父标签,则传入null;d)当WEB容器执行到自定义标签的开始标记时,调用doStartTag()方法;e)当WEB容器执行到自定义标签的结束标记时,调用doEndTag()方法;f)当WEB容器执行完自定义标签后,标签处理器类会驻留在内存中,直至停止WEB应用时,WEB容器才会调用release()方法;7.4、自定义标签的实现7.4.1、TagSupport类实现自定义标签TagSupport是Tag的一个模板类,实现了pageContext,parent的getter、setter方法以及一些其他的功能。使用案例:1)新建一个MyTag2类继承TagSupportpackage com.cn.tag;import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.tagext.TagSupport;public class MyTag2 extends TagSupport{private String defaultValue;private String value;/** * 属性对应的方法 * @param value */public void setValue(String value) {this.value = value;}/** * 属性对应的方法 * @param value */public void setDefaultValue(String defaultValue) {this.defaultValue = defaultValue;}@Overridepublic int doEndTag() throws JspException {// TODO Auto-generated method stub return super.doEndTag();}/*** 标签中静态常量: * EVAL_BODY_INCLUDE:告诉服务器正文的内容,并把这些内容送入输出流 * SKIP_BODY:告诉服务器不要处理正文内容 * EVAL_PAGE:让服务器继续执行页面 * SKIP_PAGE:让服务器不要处理剩余的页面* EVAL_BODY_AGAIN:让服务器继续处理正文内容,只有doAfterBody方法可以返回 * EVAL_BODY_BUFFERED:BodyTag接口的字段,在doStartTag()返回 * * EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回,* 而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回 */@Overridepublic int doStartTag() throws JspException {//获取到request对象 String str = value;if (value == null || "".equals(value)) {str = defaultValue;}JspWriter jspWriter = pageContext.getOut();try {jspWriter.write(str);} catch (IOException e) {e.printStackTrace();}return SKIP_BODY;}}2)myTag.tld中加入<tag><name>mytag2</name><tag-class>com.cn.tag.MyTag2</tag-class><body-content>empty</body-content><attribute><name>value</name><required>true</required><!-- 是否支持表达式 --><rtexprvalue>true</rtexprvalue></attribute><attribute><name>defaultValue</name><required>false</required><rtexprvalue>true</rtexprvalue></attribute></tag>3)使用自定义标签<%@ page contentType="text/html;charset=UTF-8" language="java"%><%@taglib prefix="my" uri="http://www.mytag.com" %><!DOCTYPE html><html><head><title>myjstl.jsp</title></head><body><h1>自定义标签</h1><p><my:mytag2 value="myValue"/></p><p><my:mytag2 value="" defaultValue="default"/></p></body></html>4)案例效果7.4.2、BodyTagSupport类实现自定义标签 BodyTagSupport继承了TagSupport类实现了BodyTag接口,也能获取到标签体的内容,所以说如果要自定义一个有标签体有属性的标签,应该继承 BodyTagSupport类。他的生命周期:doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()使用案例:1)新建一个MyTag3类import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.tagext.BodyContent;import javax.servlet.jsp.tagext.BodyTagSupport;public class MyTag3 extends BodyTagSupport{@Overridepublic BodyContent getBodyContent() {return super.getBodyContent();}public int doAfterBody() throws JspException {// TODO Auto-generated method stub BodyContent content = getBodyContent();String str = content.getString();System.out.println(str);if(str != null){String name = "";if(str.startsWith("$toUpperCase(") && str.endsWith(")")){String para = str.substring(13,str.length()-1);if(para!=null && !"".equals(para)) {name = para.toUpperCase();}}JspWriter out = getPreviousOut();try {out.print(name==null?str:name);} catch (IOException e) {e.printStackTrace();}}return SKIP_BODY;}}2)myTag.tld<tag><name>mytag3</name><tag-class>com.cn.tag.MyTag3</tag-class><body-content>scriptless</body-content></tag>3)myjstl.jsp<%@ page contentType="text/html;charset=UTF-8" language="java"%><%@ taglib prefix="my" uri="http://www.mytag.com" %><!DOCTYPE html><html><head><title>myjstl.jsp</title></head><body><h1>自定义标签</h1><%request.setAttribute("key", "value");pageContext.setAttribute("key", "value1");%><p>${key }</p><my:mytag3>$toUpperCase(${key})</my:mytag3></body></html>4)案例效果
2023年12月03日
0 阅读
0 评论
0 点赞
2023-12-03
学会了吗(书客电子网)书客官方网站,【Android】书客编辑器安卓Java版,java color.parsecolor,
作者:邹峰立,微博:zrunker,邮箱:zrunker@yahoo.com,微信公众号:书客创作,个人平台:www.ibooker.cc。本文选自书客创作平台第130篇文章。阅读原文 , 书客编辑器安卓Java版 - 体验版下载书客创作书客编辑器是一款基于Markdown标记语言的开源的富文本编辑器,它以简易的操作界面和强大的功能深受广大开发者的喜爱。正如官方所说:现在的版本不一定是最好的版本,却是最好的开源版本。官方地址:http://editor.ibooker.cc。下面针对书客编辑器安卓Java版,进行详解说明。效果图在进行讲解之前,首先看一下书客编辑器安卓版的效果图:书客编辑器Android版效果图一、引入资源引入书客编辑器安卓Java版的方式有很多,这里主要提供两种方式:1、在build.gradle文件中添加以下代码:allprojects {repositories {maven { url https://jitpack.io } }}dependencies {compile com.github.zrunker:IbookerEditorAndroid:v1.0.1}2、在maven文件中添加以下代码:<repositories><repository><id>jitpack.io</id><url>https://jitpack.io</url> </repository></repositories><dependency><groupId>com.github.zrunker</groupId><artifactId>IbookerEditorAndroid</artifactId><version>v1.0.1</version></dependency>二、使用书客编辑器安卓版简易所在就是只需要简单引入资源之后,可以直接进行使用。因为书客编辑器安卓版不仅仅提供了功能实现,还提供了界面。所以使用过程中,连界面绘制都不用了。界面分析书客编辑器安卓版界面大致分为三个部分,即编辑器顶部,内容区(编辑区+预览区)和底部(工具栏)。书客编辑器Android版界面构建图首先在布局文件中引入书客编辑器安卓版控件,如布局文件为activity_main.xml,只需要在该文件内添加以下代码即可:<?xml version="1.0" encoding="utf-8"?><cc.ibooker.ibookereditorlib.IbookerEditorViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/ibookereditorview"android:layout_width="match_parent"android:layout_height="match_parent" />实际上IbookerEditorView继承LinearLayout,所以它具备LinearLayout的一切功能。三、功能介绍根据轮廓图可以看出,书客编辑器安卓版布局只有三个部分,所以关于书客编辑器安卓版功能模块也就分三个部分对外提供使用,即修改哪一个布局模块就是对于哪一个功能模块。顶部功能模块书客编辑器安卓版顶部实际上是采用IbookerEditorTopView控件进行呈现,所以要实现顶部相关控件功能首先要获取该控件。书客编辑器Android版顶部布局图书客编辑器安卓版顶部界面图,从左到右分别对应返回(back),撤销(undo),重做(redo),编辑模式(edit),预览模式(preview),帮助(help),关于(about)。知道每个按钮对应的功能,所以就可以去修改或完善相关实现过程。例如修改返回按钮一些属性,可以使用一下代码:// 设置书客编辑器顶部布局相关属性ibookerEditorView.getIbookerEditorTopView().setBackImgVisibility(View.VISIBLE).setBackImageResource(R.mipmap.ic_launcher);当然也可以通过IbookerEditorTopView获取相关控件,然后针对该控件进行逐一处理:ibookerEditorView.getIbookerEditorTopView().getBackImg().setVisibility(View.VISIBLE);这里只是使用返回按钮进行举例说,其他按钮使用规则更返回按钮一样。中间功能模块书客编辑器安卓版中间区域又分为两个部分,分别是编辑部分和预览部分,所以要修改相关功能就要获取到相关部分的控件。其中编辑部分由IbookerEditorEditView控件进行呈现,预览部分由IbookerEditorPreView控件进行呈现。例如修改编辑部分相关属性,可以使用如下代码:// 设置书客编辑器中间布局相关属性ibookerEditorView.getIbookerEditorVpView().getEditView().setIbookerEdHint("书客编辑器").setIbookerBackgroundColor(Color.parseColor("#DDDDDD"));编辑部分并不是只有一个控件,所以也可以获取相关控件,然后针对特定控件进行逐一操作:ibookerEditorView.getIbookerEditorVpView().getEditView().getIbookerEd().setText("书客编辑器");// 执行预览功能ibookerEditorView.getIbookerEditorVpView().getPreView().ibookerHtmlCompile("预览内容");底部功能模块书客编辑器安卓版,底部为工具栏,由IbookerEditorToolView进行呈现。工具栏一共提供了30多种功能,每一个按钮对应一个功能。各个控件分别为:boldIBtn, italicIBtn, strikeoutIBtn, underlineIBtn, capitalsIBtn,uppercaseIBtn, lowercaseIBtn, h1IBtn, h2IBtn,h3IBtn, h4IBtn, h5IBtn, h6IBtn, linkIBtn, quoteIBtn,codeIBtn, imguIBtn, olIBtn, ulIBtn, unselectedIBtn,selectedIBtn, tableIBtn, htmlIBtn, hrIBtn, emojiIBtn;所以要修改底部相关属性,首先要获取到IbookerEditorToolView控件,然后对该控件进行操作。// 设置书客编辑器底部布局相关属性ibookerEditorView.getIbookerEditorToolView().setEmojiIBtnVisibility(View.GONE);当然底部一共有30多个控件,也可以直接获取到相关控件,然后该控件进行操作,如:ibookerEditorView.getIbookerEditorToolView().getEmojiIBtn().setVisibility(View.GONE);补充功能:按钮点击事件监听这里的按钮点击事件监听主要是针对顶部布局按钮和底部布局按钮。顶部部分按钮点击事件监听,需要实现IbookerEditorTopView.OnTopClickListener接口,而每个按钮点击通过对应Tag来判断,具体代码如下:// 顶部按钮点击事件监听@Overridepublic void onTopClick(Object tag) {if (tag.equals(IMG_BACK)) {// 返回 } else if (tag.equals(IBTN_UNDO)) {// 撤销 } else if (tag.equals(IBTN_REDO)) {// 重做 } else if (tag.equals(IBTN_EDIT)) {// 编辑 } else if (tag.equals(IBTN_PREVIEW)) {// 预览 } else if (tag.equals(IBTN_HELP)) {// 帮助 } else if (tag.equals(IBTN_ABOUT)) {// 关于 }}其中IMG_BACK、IBTN_UNDO等变量是由IbookerEditorEnum枚举类提供。底部部分按钮点击事件监听,需要实现IbookerEditorToolView.OnToolClickListener接口,而每个按钮点击通过对应Tag来判断,具体代码如下:// 工具栏按钮点击事件监听@Overridepublic void onToolClick(Object tag) {if (tag.equals(IBTN_BOLD)) {// 加粗 } else if (tag.equals(IBTN_ITALIC)) {// 斜体 } else if (tag.equals(IBTN_STRIKEOUT)) {// 删除线 } else if (tag.equals(IBTN_UNDERLINE)) {// 下划线 } else if (tag.equals(IBTN_CAPITALS)) {// 单词首字母大写 } else if (tag.equals(IBTN_UPPERCASE)) {// 字母转大写 } else if (tag.equals(IBTN_LOWERCASE)) {// 字母转小写 } else if (tag.equals(IBTN_H1)) {// 一级标题 } else if (tag.equals(IBTN_H2)) {// 二级标题 } else if (tag.equals(IBTN_H3)) {// 三级标题 } else if (tag.equals(IBTN_H4)) {// 四级标题 } else if (tag.equals(IBTN_H5)) {// 五级标题 } else if (tag.equals(IBTN_H6)) {// 六级标题 } else if (tag.equals(IBTN_LINK)) {// 超链接 } else if (tag.equals(IBTN_QUOTE)) {// 引用 } else if (tag.equals(IBTN_CODE)) {// 代码 } else if (tag.equals(IBTN_IMG_U)) {// 图片 } else if (tag.equals(IBTN_OL)) {// 数字列表 } else if (tag.equals(IBTN_UL)) {// 普通列表 } else if (tag.equals(IBTN_UNSELECTED)) {// 复选框未选中 } else if (tag.equals(IBTN_SELECTED)) {// 复选框选中 } else if (tag.equals(IBTN_TABLE)) {// 表格 } else if (tag.equals(IBTN_HTML)) {// HTML } else if (tag.equals(IBTN_HR)) {// 分割线 }}其中IBTN_BOLD、IBTN_ITALIC等变量是由IbookerEditorEnum枚举类提供。Github地址 阅读原文http://weixin.qq.com/r/vC5pcbnEK_RUrf0S93uu (二维码自动识别)
2023年12月03日
0 阅读
0 评论
0 点赞
1
2
...
338