分类 Web后端 下的文章

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之间的位置。

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

Java 5.0的静态导入

一直不知道Java 5.0以后提供了一种叫做静态导入(static import)的功能,可以能够导入静态方法。

但是关于这种功能有不小的争议,我们来看:

这是Java 5.0的新功能:一把双刃剑。有些人很喜欢这个主意,有些人恨死它了。如果你讨厌多打几个字,那你回喜欢这项功能。但是它的缺点是会让程序比较难阅读。

基本上,这个功能是让你import静态的类、变量或enum时能够少打几个字。

旧式的写法:

import java.lang.Math;
class NoStatic {
    public static void main(String[] args) {
        System.out.println("sqrt"  + Math.sqrt(2.0));
        System.out.println("tan" + Math.tan(60));
    }
}

这里可以看到虽然我们用到了import,但是import只能导入到类。所以静态方法和变量我们不得不重复输入多次。

使用static import的写法:

import static java.lang.System.out;
import static java.lang.Math.*;
class WithStatic {
    public static void main(String[] args) {
        out.println("sqrt" + sqrt(2.0));
        out.println("tan" + tan(60));
    }
}

这里可以看到我们用了static import,就可以导入静态的类方法、变量或enum。

[转]Java中子类继承父类时是否继承构造函数

Java继承中队构造函数是不继承的,只是调用(隐式或显式)。
以下是例子

public class FatherClass {

    public FatherClass() {
        System.out.println(100);
    }

    public FatherClass(int age) {
        System.out.println(age);
    }
}

public class SonClass extends FatherClass {
    public SonClass() {
        
    }
    
    public SonClass(int c) {
        System.out.println(1234);
    }

    public static void main(String[] args) {
        SonClass s = new SonClass(66);
    }
}

编译后执行结果是什么呢?

分析SonClass s= new SonClass(66);执行这句时的调用。

public SonClass(int c) {
    System.out.println(1234);//系统会先调用父类的无参数构造函数super()
}

在这个构造函数中,等价于:

public SonClass(int c) {
    super();
    system.out.println(1234);
}

所以结果是
100
1234

在创建子类的对象时,Java虚拟机首先执行父类的构造方法,然后在执行子类的构造方法。在多级继承的情况下,将从继承树的最上层的父类开始,依次执行各个类的构造方法,这可以保证子类对象从所有直接或间接父类中继承的实例变量都被正确地初始化。

如果子类构造是这样写的:

public SonClass(int c) {
    super(22);//必须是第一行,否则不能编译//显式调用了super后,系统就不再调用无参的super()了。
    System.out.println(1234);
}

执行结果是
22
1234


总结一:构造函数不能继承,只能调用而已。

如果父类没有无参构造函数,创建子类时,不能编译,除非在构造函数代码体中的第一行,必须是第一行显式调用父类有参构造函数,如下:

public SonClass() {
    super(777);//显示调用父类有参构造函数
    System.out.println(66);
}

如果不显式调用父类有参构造函数,系统会默认调用父类无参构造函数super();
但是父类中没有无参构造函数,所以它不就是不能调用了。所以编译就通不过了。

总结二:创建有参构造函数后,系统就不再有默认无参构造函数。

如果没有任何构造函数,系统会默认有一个无参构造函数。

KVM下Windows虚拟机拷贝文件到宿主机

遇到的问题如题。

1、没有在图形界面管理器(Virtual Medicine Manager)中发现相关的功能。
2、尝试使用KVM图形管理器的USB重定向个U盘,但是不知什么原因,重定向的两个设备都会出现这样的提示:跟这台计算机连接的一个USB设备连接不正常。不知道是什么原因(USB3的关系?),网上搜索解决方法未果。
3、因为虚拟机用了独立的IP,考虑在宿主机上搭一个HTTP或FTP服务(我们Web程序员就是这么实在)。
4、仔细想一下,不需要HTTP服务或FTP服务,直接在Windows上安装一个Bash环境,就可以模拟两台Linux设备用SSH协议传东西了。

而在Windows上安装Bash环境的方式主要有以下两种的,Cygwin和Win10的Ubuntu Bash。
选用的是Cygin,不过不用直接安装Cygwin,而是安装Git就可以,Git自带一个Cygwin的精简版。
安装完Git,使用SSH命令就可以在Window上往Linux上拷贝文件或者从Linux上拷下来了。