final修饰类不能被继承,修饰的方法不能被重写,final修饰的变量,无论是类属性、对象属性、形参还是局部变量,都需要进行初始化操作。
主要是为了”安全性“和”效率“的缘故,因为:
1、由于String类不能被继承,所以就不会被修改,这就避免了因为继承引起的安全隐患;
2、String类在程序中出现的频率比较高,如果为了避免安全隐患,在它每次出现时都用final来修饰,这无疑会降低程序的执行效率,所以干脆直接将其设为final一提高效率;
Java类装载过程
装载:通过类的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;(文件格式验证,元数据验证,字节码验证,符号引用验证)
准备:给类的静态变量分配并初始化存储空间;
解析:将常量池中的符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块,并初始化程序员设置的变量值。
分析 Class.forName()和ClassLoader.loadClass
Class.forName(className)方法,内部实际调用的方法是 Class.forName(className,true,classloader);
第2个boolean参数表示类是否需要初始化, Class.forName(className)默认是需要初始化。
一旦初始化,就会触发目标对象的 static块代码执行,static参数也也会被再次初始化。
ClassLoader.loadClass(className)方法,内部实际调用的方法是 ClassLoader.loadClass(className,false);
第2个 boolean参数,表示目标对象是否进行链接,false表示不进行链接,由上面介绍可以,
不进行链接意味着不进行包括初始化等一些列步骤,那么静态块和静态对象就不会得到执行
Session存储在服务器端,一般为了防止在服务器的内存中(为了高速存取),Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。
Session什么时候失效?
1. 服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为30分钟。
2. 调用Session的invalidate方法。
Spring的Interceptor(拦截器)与Servlet的Filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等。不同的是:
Filter |
Interceptor |
Summary |
Filter 接口定义在 javax.servlet 包中 |
接口 HandlerInterceptor 定义在org.springframework.web.servlet 包中 |
|
Filter 定义在 web.xml 中 |
|
|
Filter在只在 Servlet 前后起作用。Filters 通常将 请求和响应(request/response) 当做黑盒子,Filter 通常不考虑servlet 的实现。 |
拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。允许用户介入(hook into)请求的生命周期,在请求过程中获取信息,Interceptor 通常和请求更加耦合。 |
在Spring构架的程序中,要优先使用拦截器。几乎所有 Filter 能够做的事情, interceptor 都能够轻松的实现 |
Filter 是 Servlet 规范规定的。 |
而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。 |
使用范围不同 |
Filter 是在 Servlet 规范中定义的,是 Servlet 容器支持的。 |
而拦截器是在 Spring容器内的,是Spring框架支持的。 |
规范不同 |
Filter 不能够使用 Spring 容器资源 |
拦截器是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如 Service对象、数据源、事务管理等,通过IoC注入到拦截器即可 |
Spring 中使用 interceptor 更容易 |
Filter 是被 Server(like Tomcat) 调用 |
Interceptor 是被 Spring 调用 |
因此 Filter 总是优先于 Interceptor 执行 |
回到顶部
拦截器(Interceptor)和过滤器(Filter)的执行顺序
过滤前-拦截前-Action处理-拦截后-过滤后
1、单例设计模式
所谓单例设计模式简单说就是无论程序如何运行,采用单例设计模式的类(Singleton类)永远只会有一个实例化对象产生。具体实现步骤如下:
(1) 将采用单例设计模式的类的构造方法私有化(采用private修饰)。
(2) 在其内部产生该类的实例化对象,并将其封装成private static类型。
(3) 定义一个静态方法返回该类的实例。
示例代码如下:
class Singleton {
private static Singleton instance = new Singleton();// 在内部产生本类的实例化对象
public static Singleton getInstance() { // 通过静态方法返回instance对象
return instance;
}
private Singleton() { // 将构造方法封装为私有化
}
public void print() {
System.out.println("Hello World!!!");
}
}
2、工厂设计模式
程序在接口和子类之间加入了一个过渡端,通过此过渡端可以动态取得实现了共同接口的子类实例化对象。
3、代理设计模式
指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其他相关业务的处理。比如生活中的通过代理访问网络,客户通过网络代理连接网络(具体业务),由代理服务器完成用户权限和访问限制等与上网相关的其他操作(相关业务)。
4、观察者设计模式
所谓观察者模式,举个例子现在许多购房者都密切观察者房价的变化,当房价变化时,所有购房者都能观察到,以上的购房者属于观察者,这便是观察者模式。
java中可以借助Observable类和Observer接口轻松实现以上功能。当然此种模式的实现也不仅仅局限于采用这两个类。
5.适配器模式
如果一个类要实现一个具有很多抽象方法的接口,但是本身只需要实现接口中的部分方法便可以达成目的,所以此时就需要一个中间的过渡类,但此过渡类又不希望直接使用,所以将此类定义为抽象类最为合适,再让以后的子类直接继承该抽象类便可选择性的覆写所需要的方法,而此抽象类便是适配器类。
jsp九大内置对象包括request response session application out page config exception pageContent
其中 request response out page config exception pageContent对象的有效范围是当前页面的应用 session 有效范围是当前会话(当前客户端的所有页面) application 有效范围是整个应用程序,只要服务器不关闭对象就有效。
a、初始化顺序不同:filter的初始化是在servlet容器启动时,而Servlet类被调用之后初始化、先于Filter调用。
b、调用顺序不同
filter的调用顺序:
1. 按照web.xml中的映射配置顺序按照配置条件从后向前调用
2. 层次调用doFilter()方法中FilterChain.doFilter()之前的内容(filter-mapping的name先调用doFilter方法,但是每个dofilter方法的内部存在chain.dofilter会调用下一个filter-mapping,一直到不存在下一个filter后在返回,执行chain.dofilter()后面的代码)(相当于递归调用)
3. 调用Servlet中的service()方法
4. service方法执行完毕后,层次调用doFilter()中FilterChain.doFilter()之后的方法,顺序与之前的相反
servlet的调用顺序
按照web.xml中的映射配置顺序按照配置条件从后向前调用第一个满足条件的Servlet,调用之前事先执行满足条件的Filter,不存在层次调用Servlet问题
c、销毁顺序
filter晚于servlet销毁
d、作用
filter的作用:
1. 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。
2. 根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
3. 在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
4. 根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
servlet的作用:
主要是处理客户端的请求并将其结果发送到客户端.
1. Session复制,Web服务器之间同步session信息。
2. 负载均衡支持会话亲和,相同的会话请求发送给同一个Web服务器。
3. Session不存在Web服务器本地,而是放在缓存服务器如Redis上(普遍采用)。
>>Security Socket Layer
HTTPS实际上就是HTTP over SSL,它使用默认端口443,而不是像HTTP那样使用端口80来和TCP/IP进行通信。HTTPS协议使用SSL在发送方把原始数据进行加密,然后在接受方进行解密,加密和解密需要发送方和接受方通过交换共知的密钥来实现.
>>数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。
数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。
数字签名是非对称密钥加密技术与数字摘要技术的应用。
>>电子商务认证授权机构(CA, Certificate Authority)
CA认证是Certificate Authority的简称,指电子商务认证授权机构。它是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
证书实际是由证书签证机关(CA)签发的对用户的公钥的认证。
证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。目前,证书的格式和验证方法普遍遵循X.509 国际标准。
计算机集群简称集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作。在某种意义上,他们可以被看作是一台计算机。集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下集群计算机比单个计算机,比如工作站或超级计算机性能价格比要高得多。
集群就是一组独立的计算机,通过网络连接组合成一个组合来共同完一个任务
集群分类及不同分类的特点
计算机集群架构按照功能和结构一般分成以下几类:
1)负载均衡集群(Loadbalancingclusters)简称LBC
2)高可用性集群(High-availabilityclusters)简称HAC
3)高性能计算集群(High-perfomanceclusters)简称HPC
4)网格计算(Gridcomputing)
文件和目录
cd -
pwd
ls/ls -l/ls -a/ll
mkdir 00/mkdir -p 00/00
rm -f 00
rmdir 00
rm -rf 00
mv 00 00
cp file1 file2
cp dir/* .
cp -a /tmp/dir1 .
cp -a dir1 dir2
文件搜索
whereis java
java -version
用户和群组
su
whoami
groups
groupadd group_name
groupdel group_name
useradd user1
userdel -r user1
usermod -g root bdqn2
passwd/passwd user1
chmod -r u+x,g+w f01
chmod 754 -r f01
返回顶部索引 ^
文件的权限
ls -lh
打包和压缩文件
tar -xvf archive.tar
tar -xvfz archive.tar.gz -C /usr/local/
tar -cvfz archive.tar.gz dir1
sh /usr/local/tomcat7/bin/startup.sh
rpm包
rpm -e package_name
rpm -ivh package.rpm
rpm -qa | grep httpd
yum软件包升级器
yum install package_name
查看文件内容
touch file1
echo "hello">>file1
vi/vim
cat file1
tail file1
head -2 file1
tail -2 file1
文本处理
网络 - (以太网和WIFI无线)
ifconfig /ifconfig eth0
dhclient eth0
进程管理
ps -ef|grep sshd
kill -9[PID]
其它命令
clear
man[命令参数]
防火墙
iptables -A INPUT -ptcp --dport 8080 -j ACCEPT
service iptables restart
》都可以用来存储字符串变量,是可变的对象。区别是:StringBuffer是线程安全的,而StringBuilder是非线程安全的,在单线程环境下,StringBuilder的执行效率较高。但通常情况下使用StringBuffer。
静态变量:线程非安全。
静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。
实例变量:单例模式(只有一个对象实例存在)线程非安全,非单例线程安全。
实例变量为对象实例私有,在虚拟机的堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全,犹如静态变量那样,每个线程都在修改同一个对象的实例变量,肯定会出现线程安全问题。
如果每个线程执行都是在不同的对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全。
局部变量:线程安全。
每个线程执行时将会把局部变量放在各自栈帧的工作内存中,线程间不共享,故不存在线程安全问题。
在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。
New出来的对象最开始会放到新生代的Eden区。
一、初期:
程序先进入编译时期,java编译器将程序代码编译成字节码信息;
二、中期—类加载和类连接
2.1类加载:首先通过类加载器将类class文件,加载到内存方法区,并创建java.lang.class类对象
2.2类连接:
- 验证阶段:检验类的结构是否正确
- 准备阶段:对类的变量进行分配内存,并默认初始化
- 解析阶段:将二进制文件的符号引用(任何形式的字面值)解析为直接引用
三、后期(类和对象初始化)
1. 如果new对象有引用变量指向它,栈内存存放引用变量指向null对象(未初始化,默认为null);
2. new一个对象时,jvm会在堆内存中开辟一个空间存放该对象;
3. 创建对象时,对象的成员(变量)先进行默认初始化;基本类型为基本类型默认值,引用类型为null,即引用变量的引用地址存放在栈(stack)内存中,对象的成员变量及值存放在堆内存中
4. 对象成员初始化,对栈内存中的成员变量指定值;
第一步显式初始化;
第二步构造代码块初始化;
5. 构造函数初始化,new是创建一个对象,使用构造函数进行初始化对象(默认有一个)。
1、Lambda表达式和函数式接口
2、接口的默认方法和静态方法
3、 方法引用
4、重复注解
5、更好的类型推断
常用的解析Excel文件的工具库主要有JXL和POI,其中使用POI的相对更多一些。
不管是JXL,还是POI,它们在解析Excel文件上的思想流程都是差不多的,先读取工作簿 → 工作表 → 行 → 单元格。
对于POI,可以表示为“Workbook → Sheet → Row → Cell”;
一个Excel文件就是一个Workbook,而一个Workbook中可以包含多个Sheet,一个Sheet中可以有多行Row,一行中又可以包含多个单元格Cell,具体的内容都是在单元格Cell中。
Java Excel API提供了许多访问Excel数据表的方法,一些类如:workboot/sheet/cell等
个人觉得应该是几台服务器,几台数据库,怎么工作的,集群?
示例一:
解释:
多个服务器的,被称之为集群环境,如上图的服务器A,B,C,集群环境下用户的请求将不再直接请求服务器,而是被反向代理服务器进行处理,之后根据配置进行分配,让用户的请求应该请求到那台服务器
好处主要在于减小单个服务器压力
同时,若其中任意一台服务器发生故障,其他服务器仍可为用户提供服务
后边,服务器到数据库的这一段
同样的,服务器发出的连接请求被Mycat这个中间件服务器进行了处理,使得读写分离
数据库搭建多个服务器的原因主要在于减小服务器压力
这样的架构被称之为,主从架构
网友参考方案:tomcat集群+nginx+redis+mysql集群