0%

文章字数:83,阅读全文大约需要1分钟

后台request.setAttribute(“model.key”,”xxx”);前端 ${model.key!}获取不到值。

原因:命名错误,model.key的命名方式使freem把model当成对象获取key,当然获取不到。
解决方案:

  • model_key修改名字
  • new Model(); model.setKey(“xxx”);request.setAttribute(“model”,model); ${model.key!}新建一个Model实体类,设置属性key,传入实体类到request,前端就可以model.key获取

文章字数:23,阅读全文大约需要1分钟

Use ?date, ?time, or ?datetime to tell FreeMarker the exact type.

原因:传入时间格式需要转换成字符串?string("format")

1
value="${(model.time?string('yyyy-MM-dd HH:mm:ss'))!}"

文章字数:128,阅读全文大约需要1分钟

freemarker.core.ParseException: Syntax error in template “xxx” in line 42, column 1:
Encountered “</#macro>”, but was expecting one of: …..

提示意思大概是不应该出现结尾符号</#macro>, 期望的结果是<#macro>之类的开头符号。
经检查,发现<#macro></#macro>确实是成对出现,并没有遗漏之类的。于是想到会不会是宏定义内部的自定义代码没有闭合,从而影响到了</#macro>的闭合判断。

果然,一个自定义的标签未闭合

1
<@i18nMes 'common_close'>

修改后

1
<@i18nMes 'common_close'/>

问题解决


文章字数:627,阅读全文大约需要2分钟

标记清除

标记清除主要分为两步

  1. 标记,标记需要清除的对象
  2. 清除,在内存中清除这些对象

优点

  1. 速度快
  2. 清理之后存活对象的地址没变,所以不影响引用

缺点

  1. 会造成内存碎片
    例如:清理了一个小对象,腾出一块小空间。当有大对象需要分配时因为空间太小就无法在此区域分配空间。
  2. 因为内存碎片导致内存不足及频繁gc

复制算法

  1. 把空间分成两份同等大小的区域
  2. 只有一块区域存放对象,当此区域快要满了的时候把存活的对象放到另一个区域里
  3. 清除之前的区域

优点

  1. 只搬运存活对象,速度也很快
  2. 不会产生内存碎片

缺点

  1. 降低了内存使用率,实际只使用了一半内存

标记整理

  1. 标记可回收对象
  2. 回收对象并腾出空间
  3. 对剩下存活的对象整理

和标记清除对比

  1. 前两步一样,多了对于存活对象的整理

优点

  1. 相对复制算法,节约空间
  2. 解决了标记清除的内存碎片问题

缺点

  1. 效率比上面两个低

实际使用

jvm中年轻代采用的就是复制算法,因为年轻代中大部分对象是需要清空的,只用把少部分放到另一块内存即可
老年代采用的是标记-整理算法


文章字数:287,阅读全文大约需要1分钟

happens before指的是在cpu指令重排的情况下,能保证程序运行顺序的原则。

序号 规则名 描述
1 程序次序 一个线程内,按照代码顺序,书写在前的先发生于书写在后的。
2 锁定 一个unLock操作先发生于后面对于一个锁lock的操作
3 volatile 对一个变量的写操作现行发生于后面对这个变量的读操作
4 传递 如果操作A现行发生于操作B,操作B先行发生于操作C,则A先行发生于操作C
5 线程启动 Thread对象的start()方法先行发生于次线程的每一个动作
6 线程中断 对线程interrupt方法的调用先行发生于被中断线程的代码检测到中断事件的发生
7 线程终结 线程中所有操作都先行发生于线程的终止检测,可以通过Thread.join()方法结束、Thread.isAlive()的返回值检测线程结束
8 对象终结 对象初始化完成先行发生于他的finalize()方法的开始

文章字数:1255,阅读全文大约需要5分钟

hexo是一款基于github的博客系统,使用markdown编写文章内容。在此记录一次博客搭建主要工作。

1.安装环境

##1.1 git
git --version查看git版本
##1.2 node
node -v查看node版本

2.初步安装Hexo

  • 安装Hexo脚手架
    1
    npm install -g hexo-cli
  • 初始化站点
    新建一个文件加,并使用命令行进入。执行以下命令
    1
    2
    3
    hexo init <folder>
    cd <folder>
    npm install
    一个本地博客系统就构建好了
  • 2.3站点目录
    1
    2
    3
    4
    5
    6
    7
    8
    .
    ├── _config.yml //博客配置,名称、关键词、作者、语言、主体等内容设置。
    ├── package.json//应用信息,插件等内容。
    ├── scaffolds//脚手架,有三个模板:文章(posts)、博客页(page)、草稿页(draft)。
    ├── source//博客存放处,之后通过命令可以新建tags(标签)、categories(分页)
    | ├── _drafts//草稿(初始)
    | └── _posts//文章(初始)
    └── themes//主题存放处
  • 常用命令
    hexo n <filename>新建文章
    hexo clean清除缓存
    hexo g生成静态页面
    hexo s启动本地服务器,本地查看效果
    hexo d部署到网站上

    3.站点优化

    3.1分类

  • 新建分类页面
    1
    hexo new page categories
  • 给页面添加类型
    进入source->categories->index.md
    1
    2
    3
    4
    5
    ---
    title:文章分类
    date: 2019-04-22 12:25:30
    type: "categories" #添加
    ---
  • 模板添加分类
    打开scarffolds->post.md
    1
    2
    3
    4
    5
    6
    ---
    title: {{ title }}
    date: {{ date }}
    categories:
    tags:
    ---
    这样新建文章后就会有这个属性,填写分类就可以实现文章分类功能。

    3.2 标签

  • 新建标签
    1
    hexo new page tags
  • 给页面添加标签属性
    打开 source->tags->index.md
    1
    2
    3
    4
    5
    ---
    title: tags
    date: 2019-04-23 00:13:22
    type: "tags" #新添加的内容
    ---

    3.3使用分类和标签

    1
    2
    3
    4
    5
    layout: posts
    title: 我的第一篇博客
    date: 2019-04-23 00:17:41
    categories: 学习笔记
    tags: [node.js, java]

    4.部署到GitHub

    github中:
  1. 创建用户名.github.io的仓库
  2. setting里添加GitHub Pages选项
  3. 本地同步 打开 . ->config.yml,添加部署路径
    1
    2
    3
    4
    deploy:
    type: git
    repo: git@github.com:yourName/yourName.github.io.git
    branch: master
    注意:
  4. 冒号后有一个空格
  5. 需要先关联仓库,配置ssh

使用命令hexo g hexo d 完成生成并推送
yourName.github.io就是博客网址

注:报错

1
error deployer not found:github

时,执行

1
npm install --save hexo-deployer-git

然后再试一次。


主题篇

1.安装NEXT

next是hexo的一款主题,也可以点击官网查看跟多(even主题也不错)

安装主题只用将next的项目clone到根目录下themes/next里

1
git clone https://github.com/theme-next/hexo-theme-next themes/next

然后修改配置启用next主题
修改根目录下 _config.yml

1
theme: next

在next的_config.yml中可以修改next的样式,共有四个。可以在官网看到案例

  • Muse (默认)
  • Mist
  • Pisces
  • Gemini
    注释其他的,留下想要的样式
    1
    2
    3
    4
    5
    # Schemes
    #scheme: Muse
    #scheme: Mist
    #scheme: Pisces
    scheme: Gemini

    2.设置Menu(最上面的按钮)

    themes/next/_config.yml
    1
    2
    3
    4
    5
    6
    menu:
    home: / || home #首页
    about: /about/ || user #关于我
    tags: /tags/ || tags #标签
    categories: /categories/ || th #分类
    archives: /archives/ || archive #归档

    3.github挂饰

    点击fork me on github的按钮,在GitHub Corners选择挂饰,复制代码添加到themes/next/layout/_layout.swig<div class="headband"></div>下方。将代码里的https//your-url 换成自己的git主页。

4.修改超链接css样式

themes/next/source/css/_common/components/post/post.styl末尾添加

1
2
3
4
5
6
7
8
9
10
.post-body p a{
color: #0593d3; //原始链接颜色
border-bottom: none;
border-bottom: 1px solid #0593d3; //底部分割线颜色
&:hover {
color: #fc6423; //鼠标经过颜色
border-bottom: none;
border-bottom: 1px solid #fc6423; //底部分割线颜色
}
}

5.设置头像以及动画

主题目录_config.yml中添加(找Sidebar Avatar

1
2
//添加头像地址
avatar: [ http://....]

头像圆角旋转/themes/next/source/css/_common/components/sidebar/sidebar-author.styl添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
.site-author-image {
display: block;
margin: 0 auto;
padding: $site-author-image-padding;
max-width: $site-author-image-width;
height: $site-author-image-height;
border: $site-author-image-border-width solid $site-author-image-border-color;
/* 头像圆形 */
border-radius: 80px;
-webkit-border-radius: 80px;
-moz-border-radius: 80px;
box-shadow: inset 0 -1px 0 #333sf;
/* 设置循环动画 [animation: (play)动画名称 (2s)动画播放时长单位秒或微秒 (ase-out)动画播放的速度曲线为以低速结束
(1s)等待1秒然后开始动画 (1)动画播放次数(infinite为循环播放) ]*/

/* 鼠标经过头像旋转360度 */
-webkit-transition: -webkit-transform 1.0s ease-out;
-moz-transition: -moz-transform 1.0s ease-out;
transition: transform 1.0s ease-out;
}
img:hover {
/* 鼠标经过停止头像旋转
-webkit-animation-play-state:paused;
animation-play-state:paused;*/
/* 鼠标经过头像旋转360度 */
-webkit-transform: rotateZ(360deg);
-moz-transform: rotateZ(360deg);
transform: rotateZ(360deg);
}
/* Z 轴旋转动画 */
@-webkit-keyframes play {
0% {
-webkit-transform: rotateZ(0deg);
}
100% {
-webkit-transform: rotateZ(-360deg);
}
}
@-moz-keyframes play {
0% {
-moz-transform: rotateZ(0deg);
}
100% {
-moz-transform: rotateZ(-360deg);
}
}
@keyframes play {
0% {
transform: rotateZ(0deg);
}
100% {
transform: rotateZ(-360deg);
}
}

6.代码块样式

themes\next\source\css\_custom\custom.styl添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
code {
color: #ff7600;
background: #fbf7f8;
margin: 2px;
}
// 大代码块的自定义样式
.highlight, pre {
margin: 5px 0;
padding: 5px;
border-radius: 3px;
}
.highlight, code, pre {
border: 1px solid #d6d6d6;
}

7.社交网站图标

next/_config.ymlSocial

1
2
[社交平台名]: [社交地址] || [图标名称]
//github 、heartbeat(心)、spinner(圈)...(图标)

图标在Font Awesome Icon

8.RSS

  1. 根目录下
    npm install --save hexo-generator-feed
  2. 全局_config.yml末尾添加
    1
    2
    3
    # Extensions
    ## Plugins: http://hexo.io/plugins/
    plugins: hexo-generate-feed
    打开Next的_config.yml中的rss:
    配置rss: /atom.xml

9.搜索功能

  1. 根目录下npm install hexo-generator-search --save
  2. 根目录_config.yml
1
2
3
4
5
6
# Search 
search:
path: ./public/search.xml
field: post #搜索那个文件夹(page、all)
format: html
limit: 10000 #限制条数

next_config.yml

1
2
3
4
local_search:
enable: true #改为true
trigger: auto
top_n_per_article: 1 #字段表示在每篇文章中显示的搜索结果数量,设成 -1 会显示每篇文章的所有搜索结果数量。

首页隐藏部分(点击显示更多)

next配置文件

1
2
3
4
5
# Automatically Excerpt. Not recommand.
# Please use <!-- more --> in the post to control excerpt accurately.
auto_excerpt:
enable: false
length: 150

简易化搭建

HEXO Portable一分钟搭建博客


文章字数:395,阅读全文大约需要1分钟

head标签里的元素一般为不显示,或者有特殊用途的。

viewport

一般用来控制移动端访问效果

1
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  • width : 控制viewport的大小,可以指定一个值,如600, 或者特殊的值,如device-width为设备的宽度(单位为缩放为100%的CSS的像素)
  • height : 和width相对应,指定高度
  • initial-scale : 初始缩放比例,页面第一次加载时的缩放比例
  • maximum-scale : 允许用户缩放到的最大比例,范围从0到10.0
  • minimum-scale : 允许用户缩放到的最小比例,范围从0到10.0
  • user-scalable : 用户是否可以手动缩放,值可以是:①yes、 true允许用户缩放;②no、false不允许用户缩放

SEO

1
2
3
4
5
6
7
<meta  name="Generator"  content="">     
<!--向搜索引擎说明你的网页的关键词-->
<meta name="Keywords" content="">
<!-- 告诉搜索引擎你的站点的主要内容-->
<meta name="Description" content="">
<!-- 网站logo图片-->
<link rel="icon" type="image/ico" href="/favicon.ico" />

文章字数:420,阅读全文大约需要1分钟

一级缓存

session级别,同一个session生命周期通样的查询最多一次请求。
就是一个管理对象的Map

1
2
3
4
5
6
//原理
1. 生成key==类权限名#id值
2. 从一级缓存找到key
3. 没找到从数据库找,存入map
session.clear();//清空一级缓存
session.evict(A);//清空一个数据

二级缓存

sessionFactory级别的缓存,使用第三方缓存。

1
2
3
4
5
6
7
8
//获得二级缓存对象
Cache cache=sessionFactory.getCache();
//剔除一个实例对象
cache.evictEntity(class,Long);
//剔除一个类的所有实例
cache.evictEntityRegion(class);
//剔除所有二级缓存中的实例
cache.evictEntityRegions();
1
2
hibernate.cache.use_second_level_cache=ture  //使用二级缓存
hibernate.cache.region.factory_class=EhCacheRegionFactory的全限名 //二级缓存是第三方,这儿选的是EhCache

三级缓存

查询缓存,query语句缓存。
但是存储使用List,有一个元素变了其他的都要变,所以一般只用于不变的List.


文章字数:201,阅读全文大约需要1分钟

http和https

  1. 二者都是网络传输协议(应用层),https是在http基础上进行加密的
  2. https是符合http协议的,在http协议之下,tpc之上又建立了一层加密机制。

https加密过程

  1. 客户端访问服务端请求证书
  2. 拿到证书后通过证书的公钥加密一个随机生成的密码(还要通过CA检验证书的有效性)
  3. 服务器通过私钥解密随机密码
  4. 之后的通讯都可以通过这个共有的密码进行对称加密通讯。
  5. 通讯的报文之后还会追加数据的数字签名(hash)用于对方判断数据的完整性以及是否被篡改过。

文章字数:420,阅读全文大约需要1分钟

save()方法传入了id,但是识别成了新增

新建了model并且调用save()导致识别成了新增

1
2
3
Model model=new Model ();
copyItem2Model(Item,model);//转换
modelDao.save(visWatchList);

修改后

1
2
3
Model model=modelDao.findById(id);
copyItem2Model(Item,model);//转换
modelDao.save(visWatchList);

hibernate持久层三种状态

  • 瞬时状态 (Transient)

    new了一个对象,但是没有被hibernate缓存管理,数据库中没有一条记录和其对应,不与session关联

  • 持久状态 (Persistent)

  1. save() 和 saveOrUpdate()使对象转换成持久态
  2. find(),get()等方法查询的对象也是持久态

    对象被持久化对象管理,对象的改变会同步带数据库(这就是原因)同步不会马上进行,在Transaction之后,也就是commit()后提交。未提交的叫脏数据

  • 游离状态 (Detached)
  1. close() 或 clear(),evict() 之后,持久对象会变为脱管对象
  2. 就是脱离管理状态

    脱管对象和瞬时状态差不多,只是数据库内可能存在一样的记录,但是并不关联。