2016年11月

servlet项目如何添加和使用第三方jar

在Java Web中,我们用到第三方类库的机会很多,那么当我们手动管理依赖的时候,我们该如何添加和使用第三方jar文件。

在此,我们用于举例的第三方jar是普及程度极高的slf4j。

1、前往slf4j官网下载slf4j的zip压缩包,这边下载的是slf4j-1.7.21.zip。解压缩文件夹,待用。

2、在已有的servlet代码里面加上以下几句:
import org.slf4j.LoggerFactory;

`LoggerFactory.getLogger({className}.class).info("Hello World");
注:{className}需要替换成你的servlet类的名称

3、编译servlet文件,需要在-classpath参数里面加上slf4j-api.1.7.21.jar。
比如原来的-classpath参数是"/path/to/servlet-api.jar",现在需要改成"/path/to/servlet-api.jar:/path/to/slf4j-api.1.7.21.jar"。
注:/path/to/需要替换成具体的路径

4、tomcat之类的容器不会像java这个命令一样可以方便的加上-classpath参数,所以有个专门用来放jar文件的路径:WEB-INF/lib/。当tomcat启动的时候,类似于java命令自动添加了-classpath参数。
你需要复制slf4j-api-1.7.21.jar和slf4j-simple-1.7.21.jar两个jar文件到该路径。

5、添加了jar文件之后,不要忘记重启tomcat,此时添加了第三方的servlet就可以正常运行了。

关于ORM的一点思考

1 一开始,大家用数据库,只和数据打交道。
传统的使用JDBC开发就是如此。此时,耦合在控制器层。
2 后来,大家发现和对象打交道更方便。
我们就假定操作的是数据对象。此时,耦合在对象层。
3 再后来,大家用发现换平台的话耦合还是很深。
大家就用管理对象进行对象的管理。此时,耦合在管理对象层。

企业应用架构模式中提到的表记录在1和2之间的位置,现在流行的Active Record在2和3之间的位置。

归根结底,开发者需要做到感觉不出来有持久化层的存在,就像对象一直存在内存中一样,这样才是合理的。

操作系统启动必经的几个过程

1、启动BIOS,BIOS是从一个ROM(只读存储)中启动的,里面是BIOS这个系统的机器码。
另外还有个可写的硬盘,叫做COMS,用来保存配置信息。
2、BIOS把控制权转交给MBR中的Bootloader,这里以GRUB为例子,会先启动MBR中的GRUB stage1程序。
为什么会分stage1和stage2,因为虽然它们都是GRUB的一部分,但是其实是两个程序。MBR中保存的是446Byte大小的Stage1程序,Stage1程序会调用/boot/grub/目录下的Stage2程序。
为什么会这么设计呢?还不是因为MBR中给Bootloader的空间太小,要想塞进一个完整功能的多重引导程序,是不可能的事情。
3、stage1程序把控制权交给stage2程序,stage2程序将会进行引导管理工作。
其实stage1只是个过渡,真正的工作还是看stage2的。
4、stage2程序开始载入kernel内核,并且载入initrd文件。

vim多文本编辑

vim中可以在一个vim session里面同时编辑多个文件,这个功能是基于ex行编辑器实现的,其中的核心命令是:buffers。

如何实现一个session里面编辑多个文件:
1、在编辑的时候在vim命令后面同时输入多个文件的名称
2、在vim的命令界面输入:e filename的方式添加一个文件

如何查看一个session里面的所有文件:
使用:buffers命令查看同一个session里面同时打开哪些文件。

如何在一个session不同文件之间进行切换:
切换到某个文件,使用:buffer(注意不带s)后面加上文件id(使用:buffers命令查得到)。
如果当前文件进行了修改,会提示你当前文件未保存,使用:buffer!后面加文件id就可以强制切换,vim会帮你保留当前修改的缓存。

当然,或许有些教程里面会教你使用:n和:N切换到下一个和上一个文件。
但是这些教程里面没有告诉你的是,当使用这两个命令的时候:
1)切换的范围只有编辑是位于vim命令后的几个文件名,不包括:e命令添加的新文件
2)切换的时候会重新读取一遍该文件,不会像:buffer 一样会自动保存缓存。

vi的基本编辑总结

一个文本文件,里面拥有的无非是字符和行这两类东西。
我们首先来看看如何添加行+字符:Enter, o(O)
添加字符:i, a(A)

然后我们来看看怎么删除字符:x
删除该行行末换行符:J
删除行:dd
注意,这两种方式都可以加量词来批量删除。
但是在很多情况下,我们可能会需要借助一些特别的光标定位符进行删除。
d0(d^), d$
dw(dW), db(dB)
dG(可加量词)

因为vi中,删除会把删除掉的字符和行存储在一个buffer里面,所以删除可以理解为一个剪切操作,类比于其他编辑器,也应该有一个复制的功能。
vi中复制的功能类似于删除,请看下列表:
y0(y^), y$
yw(yW), yb(WB)
yG(可加量词)

既然有了剪切和复制,那么肯定有粘贴的功能,粘贴命令:
粘贴在当前位置之后:p
粘贴在当前位置之前:P

搜索,我们先看一下vi特有的行搜索:
f(后面加字符) //搜索结果切换使用;
我们再来看一下全文搜索:
/(?) //搜索结果切换使用n和N

替换,vi继承了ex行编辑器的替换实现,这是一种古老但实用的实现。
类似于退出vi的:q命令,vi的替换也是需要输入:的,vi的替换因此和前面几类命令有较大区别。命令格式类似下方:
:%s/Line/line/g
介绍一下这个ex命令:

  1. : 这是一个ex命令的开始标志
  2. % 这是一个范围选择符,代表从开头到结尾
  3. s 这是一个substitution(搜索并替换)命令
  4. /Line/line 这是一个命令的主体,意思是把Line替换成line
  5. g 这是一个substitution命令的参数(global),这个还有其他的参数c(check)