java知识分享篇(八)

大家好,我是小小刀,今天为大家整理了这个星期大家在群里面的分享和一些扩展,快来消灭知识点吧!

(括号内为分享人,进群请加小刀微信best396975802)

1

一个星期过去啦,大家有没有想念我们的知识分享篇呀,这一个星期我们主要在搞每日练习篇,然后加上公司的活比较忙,以前还能一天总结下分享,现在只能一个星期总结一下了,有不少小伙伴加了小刀之后和小刀说每日一练和分享版块很好,在这里谢谢大家的支持,我们会坚持下去的。在这里,小刀对三个版块的定位有了一个大致的划分:

每日一练是初级题目,但题目是死的,我们人是活的,可以去初级的角度去答题,也可以扩展一下给自己加深下难度。

知识分享篇属于中级板块,由大家分享的知识点,我来扩展,不仅拿下分享的知识点,顺带拿下扩展的知识点,当然因为小刀目前技术能力也有限,只能说尽力去扩展,我们共同学习!

JAVA学习篇暂定位于高级版板,在这里面,我们会以初学者为入口,然后深入到原理,底层等等,小刀我知道多少就会往里面写多少

不论怎样,都是为了能和大家一起学到更多的知识,SO,加油吧,少年!!

2

过滤器(静雯)

原分享

JSP 和 Servlet 中的过滤器都是 Java 类。过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。

doFilter:该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器

init:tomcat启动时,web 服务器将创建Filter 的实例对象

destroy:Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。

Web.xml 中的 Servlet 过滤器映射

filter-name : 过滤器名字,该元素的内容不能为空。

filter-class :所在包的路径

servlet-class:所在包的路径

servlet-name:过滤器所拦截的Servlet名

url-pattern:设置 filter 所拦截的请求路径

小刀说

过滤器和拦截器是面试常问的问题,初级都可尝试掌握下过滤器和拦截器的区别,再深处一点就是过滤器和拦截器的原理(这里就看深度了,简单点来说是基本AOP,和装饰模式,再复杂点呢,如何解析的调用的)

3

mysql中的in语句(lmbby)

原分享

mysql数据库使用in语句查询,查询结果默认会根据主键id排序。

如果想按照in()里的条件排序,可以使用FIELD()语句解决

小刀说

这个让我怎么说呢,我也没重现出来,然后又请教了下lmbby小姐姐,小姐姐重新补充了下

查询数据量少或者需要保持业务代码简洁的场景下 FIELD函数结合 ORDER BY 可以帮助我们将查询结果集按照参数列表顺序返回

select id from 表名 where id in (1,2,3) order by field(id,1,2,3)

4

集合相关的知识点(唐恒)

原分享

ArrayList 默认初始容量为10

线程不安全,查询速度快

底层数据结构是数组结构

扩容增量:原容量的 0.5倍

如 ArrayList的容量为10,一次扩容后是容量为15

Vector:线程安全,但速度慢

底层数据结构是数组结构

加载因子为1:即当 元素个数 超过 容量长度 时,进行扩容

扩容增量:原容量的 1倍

如 Vector的容量为10,一次扩容后是容量为20

Set(集) 元素无序的、不可重复。

HashSet:线程不安全,存取速度快

底层实现是一个HashMap(保存数据),实现Set接口

默认初始容量为16(为何是16,见下方对HashMap的描述)

加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容

扩容增量:原容量的 1 倍

如 HashSet的容量为16,一次扩容后是容量为32

小刀说

有很多小伙伴喜欢看这样的知识点分享,因为满满的都是干货,背下来之后瞬间知道了好多东西,小刀建议,大家有空可以以这个知识为切入点看一看源码,内部是怎么实现的,这样才能彻底拿下这些知识点。

5

环境变量Path的作用(Java小新)

原分享

当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。

小刀说

关于环境变量,是新手入门第一课,但这一课很多人都是稀里糊涂的按书上或者是按网上配置成功了就不管了,我在很多篇推文中都有提到过环境变量这个事,在些就不赘述了

6

mybatis缓存(拎壶冲)

原分享

1、一级缓存是SQLSession级别的缓存,是默认开启的。不同的sqlSession之间的缓存数据区域(Cache空间)是互相不影响的;

2、二级缓存是SqlSessionFactory级别的缓存,需要配置。

<configuration> <settings>
<!-- cacheEnabled=true,表示二级缓存可用,但要开启还得去mapper中配置 --> <setting name="cacheEnabled" value="true" /> </settings> </configuration>
Mapper.xml中配置:
<!-- 开启二级缓存 -->
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

开启二级缓存后数据查询流程是:二级缓存 -> 一级缓存 -> 数据库,多个sqlSession可以共用二级缓存,作用域是以namespace来划分的,多个mapper文件若使用同一个namespace也会被认为是同一个Cache空间;

重点是想提及 flushCache 和 useCache这两个跟二级缓存相关的配置参数

<select id="selectUserByUserId" useCache="false" flushCache="false" resultType="com.lhc.testCache.User" parameterType="int"> select * from user where id=#{id} </select>

useCache:用来设置当前select是否使用二级缓存,默认值useCache="true",表示要使用二级缓存,若设置改为"false",则每次的查询都会发出sql去数据库查询数据;

flushCache:用来设置当前select是否清空二级缓存,默认值flushCache="false",表示不需要清除二级缓存,在同一个namespace的mapper中,如果除了select之外还有insert、update、delete操作同一张数据表的话,开启了二级缓存而不去刷新缓存就容易出现脏读,实测发现就算在这时修改useCache="false"也并不能阻止数据被缓存,需要将flushCache值改为"true"才能强行清除缓存,所以,建议flushCache和useCache都要一起进行设置,表明任何时候只要语句被调用,都会让缓存清空,成功避免了脏读。

再次分享

用的是装饰者模式,所以就简单讲一下我对装饰者模式的理解吧,就比如有一个餐厅在招聘厨师(鬼半夜的有点饿了),这家餐厅是个豪华餐厅,厨房配置了空调、电视、沙发以及按摩床等为了吸引优秀的厨师,优秀的厨师当然有脾气了,对餐厅的要求也各不相同,厨师A想要有空调,厨师B想要有电视机,厨师C想要有按摩师+空调,厨师D想要有空调+沙发+按摩床等,所以如果有很多厨师,就会有很多个需求,我们需要对每一个厨师进行个性化的定制,代码就会出现有很多重复的代码,也要创建很多类。这时候用修饰者模式就可以更好的解决这个问题,运用继承和多态来灵活实现根据不同条件,来让系统自己去判断,组成你想要的厨师。

总之MyBatis里面好像Cache是缓存的父类,拥有很多很多不同功能的子类,根据业务条件的不同,我们可以去装饰Cache得到想要的不同功能的缓存子类。

小刀说

这一个分享比较底层了,而且两次分享中也看到了拎壶冲小伙伴的学习冲劲,我觉得学习就需要这样,顺手点开源码看看,看不懂没关系,现在百度那么强大,我们去百度下看看别人怎么讲的,然后再回来继续学习!

7

代码块初始化顺序(笨鸟)

原分享

对于静态字段,只有直接定义这个字段的类才会被初始化,因此通过其子类来引用父类中定义的静态字段,只会触发父类的初始化而不会触发子类的初始化。

小刀说

这个是根据我们的每日一练做出的分享,本来练习并不难,但是大家可以看看我们文章下面的评论,评论才是我们文章的正文java每日一练(19_02_24)

8

原分享

1、cookie存在客户端的硬盘上可以用

Cookie cookies[] = request.getCookies();获取cookie的所有参数,如果想获取上次登录时间,则可通过lastAccessTime(例如:lastAccessTime=1551612466764)属性获得,然后使用Long.praselong转为一个long的数,然后再调用Date函数,就可以输出登录时间,如果每次登录都显示上次登录的时间,则需要每次都把当前时间给cookie,用add函数加入cookie 的数组即可。初次访问上次登录时间显示为空,如果想在关闭浏览器后重新打开,有上次登录时间,则可利用setMaxAge设置cookie的生命时间,如果时间设为0,则删除了这个cookie.利用cookie,可以显示用户的浏览记录,每次将用户浏览的信息的id加入用户的cookie中,利用cookie显示层经浏览的物品,为保持浏览记录的存在时间,会利用到setMaxAge.(自定义一个cookie属性:Cookie cookie = new Cookie("bookHistory",bookHistory);)

当浏览器禁止使用cookie的时候,session就出现啦。

2. session存在服务器端,默认的有效时间是30分钟,因为session会是服务器的压力变大,在写jsp网页是时候,如果不使用session时,可在page里面设置session=”false”关闭session。

Session在浏览器不关时,无论打开多少网页,使用的都是一个session,各个网页都可以通过sessoion获取数据。如果关闭浏览器,不想让session丢失的话,可和cookie结合,设置cookie里JSESSIONID的属性,把sessoin传递进去。可以利用sessoin做购物车,加入购物车的商品,商品需要一个容器一样保存,在session里设置一个list集合,每次将购买的商品的信息加进去,如果想要显示已购买,则从session中取出即可。

小刀说

cookie和seesion的使用,在代码中一般都是封装好的,不代表封装好的,我们就可以不用研究他了,相反,越是封装好的,我们越是要研究他,以前喜欢把用户的登录信息放到session里面,现在把登录信息放redis里面多一些。

9

jsp中的9大内置对象(liz)

原分享

request,response,session,application(ServletContext),config,exception,page,pageContext,out

打开tomacat安装路径\work\Catalina\localhost\day10\org\apache\jsp查看—_jsp.java文件,可以看到内置对象的定义

final javax.servlet.jsp.PageContext pageContext;

javax.servlet.http.HttpSession session = null;

final javax.servlet.ServletContext application;

final javax.servlet.ServletConfig config;

javax.servlet.jsp.JspWriter out = null;

final java.lang.Object page = this;

javax.servlet.jsp.JspWriter _jspx_out = null;

javax.servlet.jsp.PageContext _jspx_page_context = null;

request,response,session,application(ServletContext),config和servlet中使用相同,excepation在被配置为错误页的jsp页面使用,page指当前jap页,pageContext和ServletContext的用法类似,指所有的jsp页面,out只支持字符流输出,如果想用字符流,重新定义会报错,但是如果把jsp页面除标签外的所有空格删除,则可使用。

jsp用<%%>嵌入java代码,被翻译在service函数里。如果想写方法则<%! %>jap,翻译在service外。页面只有java 代码也可以

<%=%>可用于输出

jsp还有标签可以设置bean的属性和值,减少java代码在jsp页面的显示,导入标签库需要的包后(jstl.jar,standard.jar),<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>其中uri的地址,在jar文件的meta-Inf的c.tld文件下可得,也可用快捷键提示写出,prefix是标签的名字,可随便起。利用标签库里的foreach可迭代,if可以判断条件是否成立。利用el表达式,${}替代java格式的输出。

小刀说

现在新出了很多模板引擎,如freemark,thymeleaf等等,但毫无疑问jsp的使用量还是很大的,可以不学那么深,但是基本的还是了解的,小刀对jsp也没学太多都是开发的时候用到了一点学一点。

10

最后说两句

最近工作有点忙,压力也有点大,但是分享的事我一直没有忘,平时在群里面和大家说着要加油,其实自己已是在放弃的边缘,但所幸之至,我对自己说,要坚持下去,想想自己在java故事之梦里面写到的,想一想三年后,如果现在就放弃了,那三年后的我跟现在有什么两样呢,所以,我们一起互相监督,一起坚持下去吧!

THE END

眼过千遍,不如手过一遍,一定一定要把自己的想法写出来(想法不论对错,写你所想就是进步),这样才会有所收获,你的每一个留言和分享小刀都会认真回复,彼此学习共同进步~

小刀和小伙伴在学习群里等你来一起监督学习哦,坚持!加油!进群请加小刀微信: best396975802

原文发布于微信公众号 - java技术大本营(java-ideashare)

原文发表时间:2019-03-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券