my knowledge

1、abstract class和 interface 有什么区别????

第一点. 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
第二点. 接口可以多继承,抽象类不行
第三点. 接口定义方法,不能实现,而抽象类可以实现部分方法。
第四点. 接口中基本数据类型为static 而抽类象不是的。

当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口



2 、forward  和 redirect  的区别????
forward 是服务器请求资源,服务器直接访问目标地址的 URL,把那个 URL 的响应内
容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿
来的,所以它的地址栏中还是原来的地址。
redirect 就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来
说浏览器会用刚才请求的所有参数重新请求,所以 session,request参数都可以获取。

3、写一个 Singleton出来
public class Singleton {
private static Singleton instance = null;
//这个方法不用每次都进行生成对象,只是第一次//使用时生成实例,提高了效率!
 public static Singleto getInstance(){
/是为了提高程序的 效率
        if(instance==null){
//同步块,线程安全的创建实例
            synchronized (SingletonDemo.class){
//是为了解决多线程下的安全性问题,也就是保证对象的唯一。
                if(instance==null){
                    instance=new SingletonDemo();
                }
            }
        }
        return instance;
    }
既可使实现线程安全的创建实例,又不会对性能造成太大的影响,它只是在第一次创建实例的时候同步,以后就不需要同步了,从而加快运行速度。
}
4、工厂模式:
工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供
的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同
的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的
子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件
生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到

底返回的是哪一个子类的实例。

 interface Fruit {
    void eat();
}

class Apple implements Fruit {
    public void eat() {
        System.out.println("Apple");
    }
}

class Orange implements Fruit {
    public void eat() {
        System.out.println("Orange");
    }
}

// 构造工厂类  
// 也就是说以后如果我们在添加其他的实例的时候只需要修改工厂类就行了  
class Factory {
    public static Fruit getInstance(String fruitName) {
        Fruit f = null;
        if ("Apple".equals(fruitName)) {//这么写是为了避免null.equal(),空指针异常,有人会问这个为什么吗?  
            f = new Apple();
        }
        if ("Orange".equals(fruitName)) {
            f = new Orange();
        }
        return f;
    }
}

class Hello {
    public static void main(String[] a) {
        Fruit f = Factory.getInstance("Orange");
        f.eat();
    }
}  


5、 设计 4 个线程,其中两个线程每次对 j 增加 1,另外两个线程
对 j 每次减少 1。写出程序。
以下程序使用内部类实现线程,对 j 增减的时候没有考虑顺序问题。
public class ThreadTest {
 private int j;
 public static void main(String args[]){
 ThreadTest tt=new ThreadTest();
 Inc inc=tt.new Inc();
 Dec dec=tt.new Dec();

 for(int i=0;i<2;i++){
  Thread t=new Thread(inc);
  t.start();
  t=new Thread(dec);
  t.start();
 }
}
private synchronized void inc(){
 j++;
 System.out.println(Thread.currentThread().getName()+"-inc:"+ j);
}
private synchronized void dec(){
 j--;
 System.out.println(Thread.currentThread().getName()+"-dec:"+j);
}
class Inc implements Runnable{
 public void run(){
 for(int i=0;i<100;i++){
  inc();
 }
 }
}
class Dec implements Runnable{
public void run(){
 for(int i=0;i<100;i++){
 dec();
 }
}
}
}
6、"=="和equals方法究竟有什么区别?
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。

7、abstract class和interface有什么区别?
(1).abstract class 在Java中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
(2).在abstract class 中可以有自己的数据成员,也可以有非abstarct的方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的方法都是public abstract的。
(3).抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。接口中定义的变量默认是public static final 型,且必须给其赋初值,所以实现类中不能重新定义,也不能改变其值。
(4).abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。 
(5).实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。

8、静态类执行顺序:
1.父类静态代码块>2.子类静态代码块>3.main中子类主方法>4.父类非静态代码块>5.父类的无参构造方法>6.子类非静态代码块>7.子类的构造方法>8.子类方法体

9、标示符命名规则:
由数字(0-9),大小写英文字母,以及_和$组成。
不能以数字开头。
不能使用关键字来自定义命名。

10、内存结构:
栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放。 基本类型的数据和对象的引用
堆内存:数组和对象,通过new建立的实例都存放在堆内存中。
方法区:静态成员、构造函数、常量池、线程池
本地方法区:window系统占用

栈中的变量指向堆内存中的变量,这就是Java中的指针!


11、static关键字:
(1)静态的意思,用来修饰成员变量和成员函数
(2)静态的特点:
随着类的加载而加载
优先于对象存在
对所有对象共享
可以被类名直接调用
(3)静态的注意事项
A:静态方法只能访问静态成员
为什么:因为静态的内容是随着类的加载而加载,它是先进内存的。
B:静态方法中不能使用this,super关键字
C:主方法是静态的
public static void main(String[] args)
public:公共的意思,是最大权限修饰符。
static:由于jvm调用main方法的时候,没有创建对象。
       只能通过类名调用。所以,main必须用static修饰。
void:由于main方法是被jvm调用,不需要返回值。用void修饰。
main:main是主要的意思,所以jvm采用了这个名字。是程序的入口。
String[]:字符串数组
args:数组名

在运行的时候,通过java命令给args数组赋值。
格式:java MainTest hello world itcast
(4)静态变量和成员变量的区别
B:存储位置
静态变量存储在方法区长中的静态区。
成员变量存储在堆内存。
C:生命周期
静态变量随着类的加载而存在,随着类的消失而消失。生命周期长。
成员变量随着对象的创建而存在,随着对象的消失而消失。
D:与对象的相关性
静态变量是所有对象共享的数据。
成员变量是每个对象所特有的数据。
(5)静态的优点和弊端
优点:
对对象的共享数据进行单独空间的存储,节省内存,没有必要每个对象都存储一份
可直接被类名调用
弊端:
生命周期过长,随着类的消失而消失
访问出现权限,即静态虽好但只能访问静态
(6)什么使用使用静态呢?
A:当所有对象共享某个数据的时候,就把这个成员变量定义为静态修饰的。
B:当某个方法没有访问该类中的非静态成员,就可以把这个方法定义为静态修饰。
静态的生命周期比较长,所以一般不推荐使用。
(7)静态代码块
A:它只执行一次,它比main还先执行。
B:执行顺序
静态代码块--构造代码块--构造方法
12、final关键字(重点)
(1)最终的意思,可以用于修饰类,方法,变量。
(2)final修饰的类不能被继承。
   final修饰的方法不能被重写。
   final修饰的变量是一个常量。只能被赋值一次。
   内部类只能访问被final修饰的局部变量。
   
13、Java中多线程同步是什么?

  同步是用来解决多线程的安全问题的,在多线程中,同步能控制对共享数据的访问。如果没有同步,当一个线程在修改一个共享数据时,而另外一个线程正在使用或者更新同一个共享数据,这样容易导致程序出现错误的结果。 

14、什么是锁?锁的作用是什么?

锁就是对象
锁的作用是保证线程同步,解决线程安全问题。
持有锁的线程可以在同步中执行,没有锁的线程即使获得cpu执行权,也进不去。
同步的前提:
(1)必须保证有两个以上线程
(2)必须是多个线程使用同一个锁,即多条语句在操作线程共享数据
(3)必须保证同步中只有一个线程在运行


15、Java多线程中的死锁
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。这是一个严重的问题,因为死锁会让你的程序挂起无法完成任务,死锁的发生必须满足以下四个条件:
互斥条件:一个资源每次只能被一个进程使用。
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
避免死锁最简单的方法就是阻止循环等待条件,
银行家算法

16、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 
JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。


17、说出数据连接池的工作机制是什么?
J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其标记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量由配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。


18、try-catch-finally与return的执行顺序:
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值
finally语句是在try的return语句执行之后,return返回之前执行

19、&和&&的区别。 
    答案:&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and).
另外,&也可以用于逻辑运算,与&&的区别在于&是非短路运算符,&&是短路运算符


20、启动一个线程是用run()还是start()?有什么区别?
答案:启动一个线程是调用start()方法,这并不意味着线程就会立即运行,只是进入了可运行状态。直接调用run()方法不会产生线程,而是把它当作普通的方法调用,马上执行。
新建 ( New )、 就绪 Runnable )、 运行 Running )、 阻塞 ( Blocked )和 死亡 ( Dead ) 5种状态

21、ajax的作用
 Ajax是能在不重新加载整个页面<无需刷新!>的情况下,能与服务器交换数据并更新网页内部分内容.  
  它用于创建更好更快以及交互性更强的页面


22、UNION用的比较多union all是直接连接,取到得是所有值,记录可能有重复   union 是取唯一值,记录没有重复  
UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。
1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。
2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。
从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。
delete from 表名 删除表中数据的记录,不会删除表的结构。执行后还可以找到表drop from 表名 会直接将表的记录和表的结构删除。执行后表找不到


23、Java把内存划分成两种:一种是栈内存,一种是堆内存。   
  在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。       
  当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。   
     堆内存用来存放由new创建的对象和数组。   
     在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。   
      在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。   
      引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。   


24、列举同步和异步在实际项目中的应用?
同步的好处:
1、同步流程对结果处理通常更为简单,可以就近处理。
2、同步流程对结果的处理始终和前文保持在一个上下文内。
3、同步流程可以很容易捕获、处理异常。
4、同步流程是最天然的控制过程顺序执行的方式。
 
异步的好处:
1、异步流程可以立即给调用方返回初步的结果。
2、异步流程可以延迟给调用方最终的结果数据,在此期间可以做更多额外的工作,例如结果记录等等。
3、异步流程在执行的过程中,可以释放占用的线程等资源,避免阻塞,等到结果产生再重新获取线程处理。
4、异步流程可以等多次调用的结果出来后,再统一返回一次结果集合,提高响应效率。


25、转发和重定向的区别
,转发是服务器行为,重定向是客户端行为。 
1.重定向的执行过程:Web服务器向浏览器发送一个http响应--》浏览器接受此响应后再发送一个新的http请求到服务器--》
2.转发过程:Web服务器调用内部方法在容器内部完成请求和转发动作--》将目标资源发送给浏览器,它只能在同一个Web应用中
2. 何时使用转发何时使用重定向
前后两个页面 有数据传递 用请求转发,没有则用重定向。
比如servlet查询了数据需要在页面显示,就用请求转发。
比如servlet做了update操作跳转到其他页面,就用重定向


26、低聚合低耦合,还是高聚合低耦合?

高聚合低耦合 

27、多线程:

1.JAVA中是单进程多线程还是多进程多线程?多进程多线程
2.列举出一种出现死锁的情况?java是否解决了死锁问题?
 将那些不会阻塞的可获得资源用变量标志出来。当某个线程获得银器对象的锁时,就可以通过检查变量来判断是否整个银器集合中的对象锁都可获得。如果是,它就可以获得相关的锁,否则,就要释放掉银器这个锁并稍后再尝试。
3.如何解决死锁问题?
产生死锁的原因:(1)竞争系统资源 (2)进程的推进顺序不当
预防死锁:
资源一次性分配:(破坏请求和保持条件)
可剥夺资源:即当某进程新的资源未满足时,释放已占有的资源(破坏不可剥夺条件)
资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏
避免死锁算法是银行家算法。


28.请你分析一下JAVA的加载过程。
加载、验证、准备、解析和初始化


29.接口可以包含字段吗?如果可以,它们默认的修饰符是什么?
可以,必须是 static 修饰


30.static的方法和一般的方法有什么区别?
1、在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
2、静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。
3、程序的static块只能调用静态方法,不能调用实例的方法。


31.final修饰引用类型和原始类型时有什么不同?
当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本数据类型变量不能被改变,但对于引用类型的变量而言,它保存的仅仅是一个引用,final只保证这个引用所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变


32.java中是值传递还是引用传递?
Java总是采用按值调用。方法得到的是所有参数值的一个拷贝,特别的,方法不能修改传递给它的任何参数变量的内容


33、JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。


34、索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
索引的一个主要目的就是加快检索表中数据的方法,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。


35、java中的,堆,栈,还有方法区都是用来放什么的?
堆区: 
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令) 
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 
栈区: 
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。 
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。 
方法区: 
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。 
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。



36.Hibernate和Mybatis的区别。
Mybatis优势
MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
MyBatis容易掌握,而Hibernate门槛较高。
Hibernate优势
Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。
他人总结
Hibernate功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。
Hibernate的缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。
iBATIS入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。
iBATIS的缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。


37.Spring MVC和Struts2的区别。 
1、Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restfulurl,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。
2、 SpringMVC的方法之间基本上独立的,独享request response数据,而Struts2虽然方法之间也是独立的,但其所有Action变量是共享的,
4、 拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。 
8、SpringMVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)
10、SpringMVC开发效率和性能高于Struts2。


38、Spring用了哪些设计模式。 
1.工厂模式,这个很明显,在各种BeanFactory以及ApplicationContext创建中都用到了;
2.模版模式,这个也很明显,在各种BeanFactory以及ApplicationContext实现中也都用到了;
3.代理模式,在Aop实现中用到了JDK的动态代理;
4.单例模式,这个比如在创建bean的时候。
5.Tomcat中有很多场景都使用到了外观模式,因为Tomcat中有很多不同的组件,每个组件需要相互通信,但又不能将自己内部数据过多地暴露给其他组件。用外观模式隔离数据是个很好的方法。
6.策略模式在Java中的应用,这个太明显了,因为Comparator这个接口简直就是为策略模式而生的。Comparable和Comparator的区别一文中,详细讲了Comparator的使用。
8.迭代器模式:Iterable接口和Iterator接口 这两个都是迭代相关的接口,可以这么认为,实现了Iterable接口,则


39、浅谈Spring中IOC和AOP是什么?
解释Spring中的IOC?
Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制
谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了
 IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。
IOC:Inversion of Control控制反转,也叫(Dependency Injection)依赖注入, dao接口的实现不再是业务逻辑层调用工厂类去获取,而是通过容器(spring)来自动的为我们的业务层设置Dao的实现类,这样整个过程就反过来,以前是我们业务层主动去获取dao,而现在是dao主动被设置到业务逻辑层中来了,这个也就是反转控制的由来。通过IOC,我们就可以在不修改任何代码的情况下,无缝地实现数据库的换库迁移
简单一点说:
IOC就是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是通过容器生成,同时,要是产生的是单例的bean,他还可以给管理bean的生命周期。


解释Spring中的AOP?
AOP面向切面编程将程序中的交叉业务逻辑(比如安全,日志,事务),封装成一个切面,然后注入到目标业务逻辑中去。
比如:很多方法都可能会抛异常,你要记录这个异常到日志中去,可以写个拦截器,在这个类中记录日志,在spring.xml中配置一个记录这些日志的方法的拦截器,在这个方法执行后调用这个拦截器,记录日志。这样就不用每次抛异常都要手动记录日志。
spring的事务管理用到的就是AOP这样也可以提高程序的内聚性。


40、Spring中有哪三种依赖注入的方式?
spring有三种注入方式:
1)根据属性注入也叫set方法注入
2)根据构造方法注入
3)根据注解进行注入(推荐)
Spring框架的优点?
Spring的AOP和IOC都是为了解决系统代码耦合度过高的问题,使代码重用度高,易于维护。


  
41、 什么是单例、多例:
     所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action;
     单例模式和多例模式说明:
     1. 单例模式和多例模式属于对象模式。
     2. 单例模式的对象在整个系统中只有一份,多例模式可以有多个实例。
     3. 它们都不对外提供构造方法,即构造方法都为私有。
2. 如何产生单例、多例:
    在通用的SSH中,单例在spring中是默认的,如果要产生多例,则在配置文件的bean中添加scope="prototype";
3. 为什么用单例、多例:
    之所以用单例,是因为没必要每个请求都新建一个对象,这样子既浪费CPU又浪费内存;
   之所以用多例,是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理;
 用单例和多例的标准只有一个:
 当对象含有可改变的状态时(更精确的说就是在实际应用中该状态会改变),则多例,否则单例;
为什么spring要默认是单例呢?原因有二:
1、为了性能。
2、不需要多例。如果你给controller中定义很多的属性,那么单例肯定会出现竞争访问了。


42、·JSP的9大对象
1、requset对象 主要用于接受客户端通过HTTP协议传送给服务器端的数据
2、response对象  通过response对象来组织发送到客户端的数据
3、out对象主要用来向客户端输出各种数据类型的内容,并且管理应用服务器上的输出缓冲区
4、pageContext 页面上下文,代表的 是当前页面运行的一些属性所有内置对象都可以从PageContext中取得
5、session  对象由服务器端自动创建,用于保存每个用户的信息,以便跟踪每个用户的操作状态,
6、application对象    用于保存应用系统中公有的数据,
7、Page对象    Page代表JSP程序被编译后生成的Servlet。
8、Config对象    用于初始化参数,除了通过Application对象使应用级初始化参数可用。
9、Exception    用来处理JSP文件在执行时所有发生的错误和异常,通常配合Page指令一起使用

猜你喜欢

转载自blog.csdn.net/qq_21325705/article/details/79231612
my