java面试题目(上)部分2016

linsen

贡献于2018-01-02

字数:0 关键词: Java开发 试题

作用域 public,private,protected,以及不写时的区别 答:区别如下: 作用域 当前类 同一 package 子孙类 其他 package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × × 不写时默认为 friendly Anonymous Inner Class (匿名内部类) 是否可以 extends(继承)其它类,是否可以 implements(实现)interface(接口) 答:匿名的内部类是没有名字的内部类。不能 extends(继承) 其它类,但是可以实现接口。 规则: new 接口{实现接口的方法} new 抽象类{实现抽象类的方法} 就是直接获取类对象去做参数。 一般的思路 采用匿名内部类的方式:就可以节省一个类。优化程序 static Nested Class 和 Inner Class 的不同 答:Nested Class(嵌套类) (一般是 C++的说法),Inner Class (一般是 JAVA 的说法)。Java 内部类与 C++嵌套类最大的不同就在于是否有 指向外部的引用上。注: 静态内部类(Inner Class)意味着 1 创建一个 static 内部类的对象,不需要一个外部类对象, 2 不能从一个 static 内部类的一个对象访问一个外部类对象。 &和&&的区别 答:&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and) Collection 和 Collections 的区别 答:Collection 是集合类的上级接口,继承与他的接口主要有 set 接口 和 List 接口 ,queue 接口 Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作 什么时候用 assert 答:assert (断言)在软件开发中是一种常用的调试方式: 相当于 if else 语句。用这个少写点代码 如果表达式计算为 true,不会报错。 如果表达式计算为 false,系统会报告一个 AssertionError。 String s = new String("xyz");创建了几个 String Object 答:两个,一个字符对象,一个字符对象引用对象 Math.round(11.5)等于多少? Math.round(-11.5)等于多少 答: Math.round(11.5)=12; Math.round(-11.5)=-11;round 方法返回与参数最接近的长整数,参数加 1/2 后求其 floor Math.ceil(30.4) 等于多少? Math.floor(30.4)等于多少 答: Math.ceil(30.4)=31.0 Math.floor(30.4)= 30.0 short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错 答:short s1 = 1; s1 = s1 + 1; (s1+1 运算结果是 int 型,需要强制转换类型)short s1 = 1; s1 += 1;(可以正确编译) public class test1 { static class b{ public void fun(){ } } class c{} public static void main(String[] args) { b b1=new b(); 创建一个static内部类的对象,不需要一个外部类对象 test1.c c1=new test1().new c(); } } Java 有没有 goto 答:java 中的保留字,现在没有在 java 中使用 下面是关键字吗 then, friendly,sizeof 不是 java 的关键字 其中常见的三个看似是关键字的 true, false, null,都不是关键字,而是作为一个单独标识类型 数组有没有 length()这个方法? String 有没有 length()这个方法 答:数组没有 length()这个方法,有 length 的属性。String 有 length()这个方法 Overload 和 Override 的区别。Overloaded 的方法是否可以改变返回值的类型 答:方法的重写 Overriding 和重载 Overloading 是 Java 多态性的不同表现。 重写 Overriding 是父类与子类之间多态性的一种表现, 重载 Overloading 是一个类中方法多态性的一种表现。也就是同名不同参。重载只与方法名称和参数有关与返回类型无关。 set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是 equals()? 它们有何区别 答:set 里的元素是不能重复的,可以用 equals()方法来区分是否重复。因为 set 里面放的是对象的指针也就是对象的引用。 ==是用来判断两者是否是同一对象(地址是同一个地址),而 equals 是用来判断是否引用同一个对象(引用的值相等) set 里面存放的是对象的引用,所以当两个元素只要满足了 equals()时就已经指向同一个对象, 也就出现了重复元素。所以应该用 equals()来判断。 == equals compareTo 区别: ==: 对于基本数据类型是值的比较,对于复杂数据类型是地址的比较 equals: 只用于复杂数据类型。和 == 一样是比较地址 但是 equals()方法是可以被重写的. 有以下四个类:File、Date、String、基本数据类型的封装类。对它们用 equals()进行了重写,进行比较时, 则是值的比较,如果类型一致,值相同,则返回 true compareTo: 也是比较对象两个值的大小,相等返回 0,小于返回 -1,大于返回 1 给我一个你最常见到的 runtime exception 答:常见的运行时异常有如下这些 ArithmeticException, , NullPointerException,……………………….. error 和 exception 有什么区别 答:error 表示错误不可恢复的,不可程序处理的。比如说内存溢出。 exception 表示可以扑捉可以处理的。 List, Set, Map 是否继承自 Collection 接口 答: List,Set 是,Map 不是 abstract class 和 interface 有什么区别(答红色部分就可以了) 答: 1:接口是一种纯抽象类,可以解决多重继承。(可以通过实现多个接口来解决多重继承 ) 2:抽象类是用来继承的,接口是用来实现的. 3:实现一个接口的类必须实现接口中的所有的方法. 4:抽象类与子类是父子关系,而接口跟类是没有任何关系的,接口可以让任何类去实现 5:抽象类不能直接实例化。 6:接口中所有的方法都必须是方法申名,都需要在其他类中实现,而在抽象类中除了方法声名外还可以有具体的方法 7:接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的. 8:抽象类中的抽象方法是在派生类中通过覆盖(override)的方式来实现的. abstract 的 method 是否可同时是 static,是否可同时是 native,是否可同时是 synchronized 答:都不能 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class) 答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数 构造器 Constructor 是否可被 override 答:构造器 Constructor 不能被继承,因此不能重写 Overriding,但可以被重载 Overloading 是否可以继承 String 类 答:String 类是 final 类故不可以继承 try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会不会被执行,什么时候被执行,在 return 前还是后 答:会执行,在 return 前执行 两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对不对 答:不对,有相同的 hash code 什么是 hashCode hashcode 是一种编码方式,在 Java 中,每个对象都会有一个 hashcode,Java 可以通过这个 hashcode 来识别一个对象。 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递 答:是引用传递。 x=A10 y=B a=A b=B public class test1 { static void fun (String x, String y) { x = x+"10"; System.out.println("x="+x); System.out.println("y="+y); } public static void main(String[] args){ String a = "A"; String b = "B"; fun (a,b); System.out.println("a="+a); System.out.println("b="+b); } } swtich 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上 答:switch(expr1)中 ,expr1 是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都 不能作用于 swtich ArrayList 和 Vector 的区别,HashMap 和 Hashtable 的区别 答:ArrayList 与 Vector Vector 是同步的是线程安全的效率低,而 ArrayList 是异步的线程不安全的效率高, HashMap 与 HashTable Hashtable 是同步的是线程安全的,效率低,而 HashMap 异步的是线程序不安全的,效率高 HashMap 可以 null 值 null 键 , hashtable 的 key 值不可以为 null。 char 型变量中能不能存贮一个中文汉字?为什么? 答:是能够定义成为一个中文的,因为 java 中以 unicode 编码,一个 char 占 16 个字节,所以放一个中文是没问题的 GC 是什么? 为什么要有 GC 答:GC 是垃圾收集的意思(Gabage Collection),Java 程序员不用担心内存管理,虚拟机自动管理的,有后台的进程在时时扫描对象。 没有用的对象,垃圾回收器会销毁它们,收回资源。 要请求垃圾收集,可以调用下面的方法之一: System.gc() Runtime.getRuntime().gc() 此时垃圾回收器不会立即运行。因为它是线程来完成的,调度需要时间。 float 型 float f=3.4 是否正确? 答:不正确。精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4 或 float f=3.4f a==b 等于什么? 答:true: 字符串常量编译器做优化 String a=“ABC”; String b=“ABC” 编译器会做优化: a==b ----true 同一个地址 String 与 StringBuffer 的区别。 答:String 的长度是不可变的,StringBuffer 的长度是可变的,可以追加。 对字符串的操作会生成新的对象。 String a=“ABC” String m1=a+”D” : 会重新生成一个新的对象 StringBuffer a=new StringBuffer(“ABC”) StringBuffer m1=a.append(”D”) : 不会产生一个新的对象:只会在原有的对象后面追加. this 关键字的作用 1:表示当前对象 2:静态方法中不能有”this” 3:一个构造函数调用另外一个构造函数用 this. 构造方法的特点: 1:一个类中可以有多个构造方法,通过参数来区分。 2:构造方法的方法名必须与类名相一致。 3:构造方法不能有返回类型,也不能写 void。 日期如何格式化 SimpleDateFormat 格式化日期 Date d = new Date(); java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd"); String strDate = sdf.format(d); 输出:2012-04-01 return 关键字的作用 1、利用 return 返回值: 2、利用 return 结束方法的运行。 谈谈 final, finally, finalize 的区别 答:final 修饰符(关键字), 修饰类: 阻止继承. 修饰变量:它是常量不可修改. 修饰方法:不能覆盖 Finally:是关键字,在异常处理时提供 finally 块来执行清除操作 finalize() 是方法名。由垃圾回收器调用,从内存中清除对象用的 面向对象的特征有哪些方面 答:主要有以下四方面: 1.抽象: 2.继承: 3.封装: 4.多态性: 什么是封装?简单的说就是用一个类来描叙对象。 用类将方法和数据成员包装起来:并且加上访问控制词。将类的数据成员隐藏起来,并且提供给外部访问的接口(指方法) 控制用户对类的修改和对数据的访问。 什么多态性: 多态性是指允许不同类的对象对同一消息作出响应。java 通过方法覆盖和方法重载来实现多态。 具体实现方式: 1: 采用抽象类(通过方法覆盖)实现多态 2: 采用接口(通过接口回调)实现多态 什么是面向对象? 将复杂的事情分解成几个简单的事情来完成. 面向对象编程有三个重要的原则: 封装 继承 多态 String 是最基本的数据类型吗 答: String 类是 final 类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用 StringBuffer 类 int 和 Integer 有什么区别 答:基本数据类型 和 对象数据类型的区别。 运行时异常与一般异常有何异同 Java 提供了两类主要的异常:运行时异常 RuntimeException(unchecked 异常)和一般异常 checked exception(检测异常)。 对于 checked 异常,需要 try catch 块去扑捉。也就是必须要用 try catch 否则编译通不过。 RuntimeException 体系包括错误的类型异常、算术异常,类型不匹配异常,数组越界异常,空指针异常等等。一定是程序员的错误 说出 ArrayList,Vector, LinkedList 的存储性能和特性 答:ArrayList 和 Vector 都是使用数组方式存储数据, vector 是同步的 ArrayList 是异步的。Vector 性能比 Arraylist 要低。 而 LinkedList 使用双向链表实现存储,插入,删除性能高,查询要从头遍历效率低些。 java 语言特性 主要包含以下几点: 1:分布式: 通过 ie 访问资源.如:网上银行系统 2:跨平台: 能在 window ,linux,mac 操作系统 上运行 3:可移植性: 运行在 java 虚拟机上不依赖于硬件本身 4:支持多线程: 带来更好的交互性和控制性 heap 和 stack 有什么区别 答:Java 的内存分为两类,一类是栈内存,一类是堆内存。栈内存存储方法内部的局部变量, 当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。 堆中一般存放的是创建的对象。方法中的局部变量使用 final 修饰后,放在堆中,而不是栈中。 java 运行机制 借助于 java 虚拟机解释执行编译过的类代码 你所知道的集合类都有哪些?主要方法? 答:最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,是有序的,大小没有限制。 Map 提供一个 key-value 的映射。根据键来取值。 描述一下 JVM 加载 class 文件的原理机制? 答:JVM 中类的装载是由 ClassLoader(类加载器)来完成的。它负责在运行时查找和装入类文件的类。 JAVA 语言如何进行异常处理,关键字:throws,throw,try,catch,finally 分别代表什么意义?在 try 块中可以抛出异常吗? 答 用 try 来指定一块预防所有"异常"的程序。紧跟在 try 程序后面,应包含一个 catch 子句来指定你想要捕捉的"异常"的类型。 throw 语句用来明确地抛出一个"异常"。 throws 用来标明一个成员函数可能抛出异常。 Finally 为确保一段代码不管发生什么异常都被执行一段代码。 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 答:可以。必须只有一个类名与文件名相同。 java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 答:字节流,字符流。字节流继承于 InputStream OutputStream 抽象类,字符流继承于 Reader ,Writer 抽象类。 java 中会存在内存泄漏吗,请简单描述。 有,虽然 java 虚拟机中的垃圾回收机制可以自动进行内存空间的申请和释放, 但是有些不能显式地进行释放,必须手动释放,比如关闭打开的文件和数据库连接. 最后可能导致内存的可用空间越来越少,最终崩溃 主要引起内存泄漏的原因是: * 程序引用了已经废弃的对象(不再需要的对象) 。 * 系统的一些资源没有释放掉。如连接对象没有关闭,流没有关闭。 java 中实现多态的机制是什么? 答:方法的重写 Overriding 和重载 Overloading 是 Java 多态性的不同表现。重写 Overriding 是父类与子类之间多态性的一种表现,重载 Overloading 是一个类中多态性的一种表现。 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收 答:对于 GC 来说,当程序员创建对象时,GC 就开始监控这个对象的地址、大小以及使用情况。当某些对象没有用了时,GC 就有责任 回收这些内存空间。可以。程序员可以手动执行 System.gc(),通知 GC 运行,但是 Java 语言规范并不保证 GC 一定会立即执行。 静态变量和实例变量的区别? 答:静态变量相当于全局变量只与类有关。实例变量与对象有关。 什么是 java 序列化,如何实现 java 序列化? 答:序列化就是将对象进行流化变成二进制流。可以对流化后的对象进行读写操作,也可以在网络之间传输。 反序列化:就是将流化的二进制数据转变成对象。 序列化的实现:将需要被序列化的类实现 Serializable 接口即可。 是否可以从一个 static 方法内部发出对非 static 方法的调用? 答:不可以,因为:静态方法包含对象调用方法;不能保证对象初始化. 写 clone()方法时,通常都有一行代码,是什么? 答:Clone 有缺省行为,super.clone();他负责产生正确大小的空间,并逐位复制。 在 JAVA 中,如何跳出当前的多重嵌套循环? 答:用 break; return 方法。 说出一些常用的类,包,接口,请各举 5 个 答:常用的类: String Integer Float, Date BufferedReader BufferedWriter FileReader FileWirter 等 常用的包:java.lang java.io java.util java.sql 常用的接口:Iterator List Map Set connection , PreparedStatement ResultSet,. 构造器 Constructor 是否可被 override? 构造器 Constructor 不能被继承,因此不能重写 Overriding,但可以被重载 Overloading。 是否可以继承 String 类? String 类是 final 类故不可以继承。 什么是 java 的类反射机制: JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;能够创建对象,调用对象的任何一个方法;这种动 态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。 动态代理的底层就是使用了类的反射机制来实现的。 Class.forName 的作用?为什么要用? 答:JVM 查找并加载指定的类,也就是说 JVM 会执行该类的静态代码段。动态加载和创建 Class 对象。 两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对不对? 不对,有相同的 hash code。 EJB 的几种类型 会话(Session)Bean ,实体(Entity)Bean 消息驱动的(Message Driven)Bean 会话 Bean 又可分为有状态(Stateful)和无状态(Stateless)两种 实体 Bean 可分为 Bean 管理的持续性(BMP)和容器管理的持续性(CMP)两种 J2EE 是技术还是平台还是框架? J2EE 本身是一个标准,一个为企业分布式应用的开发提供的标准平台。 J2EE 也是一个框架,包括 JDBC、JNDI、RMI、JMS、EJB、JTA 等技术。 应用服务器 web 服务器的区别? 1.应用服务器处理业务逻辑,web 服务器则主要是让客户可以通过浏览器进行访问。 2.应用服务器处理业务逻辑,web 服务器是用于处理 HTML 文件的。web 服务器通常比应用服务器简单 应用服务器:Weblogic、Tomcat、Jboss web 服务器:IIS、 Apache 举 5 个你最常见到的 runtime exception: RuntimeException 是 java 中所有运行时异常的父类,实际运行时出现的都是它的子类: 1,Object x = new Integer(0);System.out.println((String)x); 当试图将对象强制转换为不是实例的子类时,抛出该异常(ClassCastException) 2,int a=5/0; 一个整数“除以零”时,抛出 ArithmeticException 异常。 3, String s=null; int size=s.size(); 当应用程序试图在需要对象的地方使用 null 时,抛出 NullPointerException 异常 4, "hello".indexOf(-1); 指示索引或者为负,或者超出字符串的大小,抛出 StringIndexOutOfBoundsException 异常 5,String[] ss=new String[-1];如果应用程序试图创建大小为负的数组,则抛出 NegativeArraySizeException 异常。 什么是 AOP 与 oop? AOP(Aspect-Oriented Programming, 面向切面编程 OOP(Object-Oriented Programming, 面向对象编程 Java 标识符: java 语言中,对于变量,常量,函数,语句块也有名字,我们统统称之为 Java 标识符. 标识符是用来给类、对象、方法、变量、接口和自定 义数据类型命名的.java 语言规定标识符是以字母、下划线"_"或美元符号"$"开始,随后可跟数字、字母、下划线或美元符号的字符序列。 数据成员的默认初始化值: public class y1 { float n; //0.0f char n1; //空格 /u0000 int n2; //0 byte n3; //0 double n4; //0.0 String n5; //null Boolean n6; //null boolean n7; //false public static void main(String[] args) { new y1(); } } static 关键字作用 修饰变量:就是全局变量。 修饰方法:就是类方法。 声明为 static 的方法有下面的限制:它们不能引用 this 或 super 关键字。不能使用实例变量和实例方法。 =================================================================================== 介绍 JAVA 中的 Collection FrameWork(包括如何写自己的数据结构)? 答:Collection FrameWork 如下: Collection 接口 ├List 接口 │├LinkedList(有序异步) │├ArrayList (有序异步) │└Vector(有序同步) │ └Stack(有序同步) ├Queue 接口(jdk1.5 引入) └Set 接口 -HashSet(无序)-LinkedHashSet(有序异步) │-SortedSet 接口(有序)-TreeSet(有序异步:升序) Map 接口 ├Hashtable(无序同步) ├HashMap(无序异步)--LinkedHashMap(有序异步) Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素(Elements) Map 提供 key 到 value 的映射 List、Map、Set 三个接口,存取元素时,各有什么特点? 答: 接口 Set----对象之间没有指定的顺序,不允许重复元素。 接口 List---对象之间有指定的顺序, 允许重复元素。 接口 Map---提供 key 到 value 的映射。一个 Map 中不能包含相同的 key 要执行 contains 操作,选 ArrayList、HashSet、LinkedList 中的哪个最好? HashSet 采用的是 HashCode 存放,从而达到使数组中的元素尽可能的散列,这样在某个范围查找的速度大大提高 Java 集合 HashSet-ArrayList-HashMap 的线程同步控制方法和区别? Collections 类中提供了多个 synchronizedXxx,该方法返回指定集合对象对应的同步对象,从而可以解决多线程并发访问集合时的线程安全问 题.正如 Java 中常用的集合框架推荐使用的三个实现类:HashSet\ArrayList\HashMap 都是线程不安全的.如果有多条线程访问它们,而且有超 过一条的线程试图修改它们,则可能出现错务.Collections 提供了多个静态方法用于创建同步集合 下面程序创建了四个同步的集合对象 import java.util.*; public class TestSynchronized{ public static void main(String[] args){ //下面程序创建了四个同步的集合对象 Collection c=Collections.synchronizedCollection(new ArrayList()); List list= Collections.synchronizedList(new ArrayList()); Set s= Collections.synchronizedSet(new HashSet()); Map m= Collections.synchronizedMap(new HashMap()); } } 排序都有哪几种方法?请列举 答: 排序的方法有:冒泡排序、快速排序 插入排序。 =================================线程编=========================================== 什么是进程与线程 进程是一个正在执行中的程序,线程是程序执行过程中的一条分支,一个进程可以有多个线程 public class 冒泡排序{ public static void bubbleSort(int[] a){ int t=0; int loop=1; for(int i=0;ia[j]){ t=a[i]; a[i]=a[j]; a[j]=t; } loop++; } } } public static void main(String[] args) { int arr[]={11,33,77,22,55,44,66}; bubbleSort(arr); } } 单线程 单个程序中只有一个线程就是单线程。当程序启动运行时,就自动产生一个线程,主方法 main 就在这个主线程上运行。 我们的程序都是由线程来执行的。 多线程 指在单个程序中可以同时运行多个不同的线程执行不同的任务。 多线程编程的目的,就是“最大限度地利用 CPU 资源”,当某一线程的处理不需要占用 CPU 而只和 IO 等资源打交道时,让需要占用 CPU 的其他线程有机会获得 CPU 资源。从根本上说,这就是多线程编程的最终目的。 一个程序实现多个代码同时交替运行就需要产生多个线程。 当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法? 不能,一个对象的一个 synchronized 方法只能由一个线程访问 多线程下的共享数据的保护? 用 synchronized 关键字修饰.分为方法同步和对象同步: java 中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和 suspend()方法为何不推荐使用? 答:有两种实现方法,分别是继承 Thread 类与实现 Runnable 接口 用 synchronized 关键字修饰同步方法 反对使用 stop(),是因为它不安全。它会解除由线程获取的锁,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和 修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用 suspend()的时候,目标线程会停下来,但却仍然持有在 这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。对任何线程来说,如果它们想恢复目标 线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用 suspend(),而应在自己的 Thread 类中置入一个标志,指出 线程应该活动还是挂起。若标志指出线程应该挂起,便用 wait()命其进入等待状态。若标志指出线程应当恢复,则用一个 notify()重新启动 线程。 sleep() 和 wait() 有什么区别? 答:sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。 调用 sleep 不会释放对象锁。 wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出 notify 方 法(或 notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 同步和异步有何异同,在什么情况下分别使用他们?举例说明。 答:多线程下对共享数据的保护必须使用同步。例如:用容器存取聊天数据,多个人来聊天存储在同一个容器中,该容器必须是同步的 才安全 可以使用 vector. 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情 况下采用异步途径往往更有效率。如:用户注册时,验证该用户是否已经注过册。可以用异步刷新来检测。 启动一个线程是用 run()还是 start()? 答:启动一个线程是调用 start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由 JVM 调度并执行。这并不意味着线 程就会立即运行。 当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法? 答:不能,一个对象的一个 synchronized 方法只能由一个线程访问。 请说出你所知道的线程同步的方法。 答:wait():使一个线程处于等待状态,并且释放所持有的对象的 lock。 sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉 InterruptedException 异常。 notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由 JVM 确定唤醒 哪个线程,而且不是按优先级。 notityAll ():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。 多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 答:多线程有两种实现方法,分别是继承 Thread 类与实现 Runnable 接口 同步的实现方面有两种,1:同步对象 2:同步方法 线程的基本概念、线程的基本状态以及状态之间的关系 答:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。 Java 中的线程有四种状态分别是:新建 ,就绪、运行、阻塞、死亡 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同 ? 答:主要相同点:Lock 能完成 synchronized 所实现的所有功能 主要不同点:Lock 有比 synchronized 更精确的线程语义和更好的性能。synchronized 会自动释放锁,而 Lock 一定要求程序员手工释放, 并且必须在 finally 从句中释放。 多线程的优点。 答:可分两方面来答: 1、 相对于单线程而言 : 可以响应多任务的并发操作。 多线程取消了主循环和轮流检测机制,一个线程可以暂停而不阻止系统其他的部分的执行,而且当程序中一个线程阻塞时,只有那个被阻塞的 线程暂停,所有其他的线程继续执行。 2、 相对于进程而言:(可以答也可以不答) 它所要求的开销比较小,转换成本较小。 所有线程共享同一地址空间,相互协作。 彼此之间通信很容易。 线程在一定条件下,状态会发生变化。线程变化的状态转换图如下: 1、新建状态(New):新创建了一个线程对象。 2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的 start()方法。该状态的线程位于可运行线程池中, 变得可运行,等待获取 CPU 的使用权。 3、运行状态(Running):就绪状态的线程获取了 CPU,执行程序代码。 4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃 CPU 使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。 阻塞的情况分三种: (一)、等待阻塞:运行的线程执行 wait()方法,JVM 会把该线程放入等待池中。 (二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则 JVM 会把该线程放入锁池中。 (三)、其他阻塞:运行的线程执行 sleep()或 join()方法,或者发出了 I/O 请求时,JVM 会把该线程置为阻塞状态。 当 sleep()状态超时、join()等待线程终止或者超时、或者 I/O 处理完毕时,线程重新转入就绪状态。 5、死亡状态(Dead):线程执行完了或者因异常退出了 run()方法,该线程结束生命周期。 设计 4 个线程,其中两个线程每次对 j 增加 1,另外两个线程对 j 每次减少 1。写出程序。 以下程序使用内部类实现线程,对 j 增减的时候没有考虑顺序问题。 public class ThreadTest1{ private int j; public static void main(String args[]){ ThreadTest1 tt=new ThreadTest1(); 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(); } } } } ================================jsp-servlet-jdbc======================================= Jsp 中 forward 和 redirect 的区别 答:forward 是重定向,redirect 是转发:forward 能共享 request 数据,redirect 不能共享 request 数据。 具体的表现:使用 forward 地址栏地址不会变化。使用 Redirec 地址栏的地址立即变为目的地址。 forward:只发出一次请求。 redirect 发出了两次请求。 jsp 有哪些内置对象?作用分别是什么? 答:JSP 共有以下 9 种基本内置组件 request (请求对象)用户端请求,此请求会包含来自 GET/POST 请求的参数 response (响应对象)网页传回用户端的回应信息 pageContext (页面上下文对象)网页的属性是在这里管理 session (会话对象)与请求有关的会话期 application (全局作用域对象)表示一个 javax.servle.ServletContext 对象。这有助于查找有关 servlet 引擎和 servlet 环境的信息 out 向客户端输出 config (配置对象)表示一个 javax.servlet.ServletConfig 对象。该对象用于存取 servlet 实例的初始化参数 page (页面对象)JSP 网页本身,表示从该页面产生的一个 servlet 实例 exception (错误处理对象)针对错误网页,未捕捉的例外 request 对象:在服务器内存中,生命周期最短。一个请求中。请求完了,服务器会销毁它。 session 对象:在服务器内存中,能实现所有页面数据共享。每个浏览器都对应一个 session. 尽量少用。 Application 对象: 在服务器内存中,全局一个,但是生命周期特长,服务器启动生产,服务器关闭失效。 Cookie:在客户端浏览器中运行。用来保存客户端的数据。是写文件的方式:安全性不高。主要针对于安全性要求低网站 你遇到过 session 数据丢失吗? 用 response.sendRedirect(rul)跳转时候遇到过 session 丢失数据。这个原因与 http 协议有关 因为 session 得通过 cookie 维持,有时客户端关闭 cookie 解决的办法: 使用 response. encodeURL (url)对对 URL 进行编码,如果 cookie 打开的话,sessionid 通过 cookie 传递,如果 cookie 没打开的 话,这个方法会在你的 url 后面加上 sessionid 的参数,保证你的 session 传递。整个用法是: response.sendRedirect(response.encodeURL(url)); jsp 有哪些动作?作用分别是什么? 答:JSP 共有以下 6 种基本动作 jsp:include: 在页面被请求的时候引入一个文件。 jsp:useBean: 寻找或者实例化一个 JavaBean。 jsp:setProperty: 设置 JavaBean 的属性值。 jsp:getProperty: 输出某个 JavaBean 的属性值。 jsp:forward: 把请求转到一个新的页面。 jsp:plugin: 根据浏览器类型为 Java 插件生成 OBJECT 或 EMBED 标记 JSP 中动态 include 与静态 include 的区别? 答:动态 include 用 jsp:include 动作实现 <%@ page include%> 和 都可以包含动态静态页面。 <%@ page include%> 编译阶段执行, 他是指令元素,编译后是一个文件 请求阶段执行, 他是行为元素 , 并且可以使用来实现传递参数,编译后各是各的文件 jsp 两种跳转方式分别是什么?有什么区别? 答:有两种,分别为: forward 重定向 和 sendRedirect 转发 A: 完全转向新页面,不会再回来。相当于 goto 语句.地址栏的地址不变。能共享 request 数据,浏览器只发出一次请求。 B:response.sendRedirect::地址栏的地址指向新的跳转页面。不能共享 request 数据,浏览器发出两次请求。 Servlet 跳转 redirect 与forward 跳转的区别 1) redirect 方式: 1:跳转后浏览器地址栏变化。 因为浏览器发出了两次请求。 2:这种方式无法使用request.setAttribute 来传递参数。 3:这种方式是在客户端作的重定向处理。 2) forward 方式 RequestDispatcher dispatcher = request.getRequestDispatcher("/a.jsp"); dispatcher .forward(request, response); 1:页面的路径是相对路径。forward 方式只能跳转到本web 应用中的页面上。 2:跳转后浏览器地址栏不会变化。 因为浏览器只发出一次请求。 3:这种方式是在服务器端作的重定向。这种重定向方式是利用服务器端的缓冲区机制来完成的。 jsp 下页面跳转的几种方法小结 1. response.sendRedirect() 2<jsp:forward page="" /> 3:request.getRequestDispatcher("/要跳转的页面").forward(request, response); 4:修改 HTTP header 的 Location 属性来重定向,通过设置直接修改地址栏来实现页面的重定向。 jsp 文件代码如下: <% response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); String newLocn = "/a.jsp"; response.setHeader("Location",newLocn); %> 5. JSP 中实现在某页面停留若干秒后,自动重定向到另一页面 在 html 文件中,下面的代码: <meta http-equiv="refresh" content="300; url=target.jsp"> Servlet的生命周期 : Servlet部署在容器中,它的生命周期由容器管理。Servlet的生命周期始于将它装入Web服务器的内存时,并在终止或重新装入Servlet时结束。 Servlet的生命周期可以归纳为以下几个阶段:(必须背熟:面试问题) 当根据路径访问servlet时: 1: 由容器加载Servlet类:创建一个Servlet对象。 2:调用Servlet的init()方法进行初始化。 3:当有请求到来时: 创建一个请求对象 request。 创建一个响应对象 response。 4: 激活 Servlet 的 Service()方法处理业务逻辑。实质:根据请求类型:分别调用我们写的 servlet 类的 doGet 或 doPost 方法。 5:处理完成后:调用 Servlet 的 destroy()方法来销毁 Servlet。 jsp 页面传递参数的方法: 页面间对象传递的方法使用: request,session, cookie 对象 , url 带参数走。 MVC 的各个部分都有那些技术来实现? MVC 是 Model-View-Controller 的简写。 "Model" 代表的是应用的业务逻辑(通过 JavaBean,EJB 组件实现), "View" 由 JSP 页面产生 "Controller" 由 struts 的 action 控制:实现页面导航 JSP 和 Servlet 有哪些相同点和不同点,他们之间的联系是什么? JSP 是 Servlet 技术的扩展,JSP 编译后形成一个 servlet 类。 JSP 侧重于视图,Servlet 主要用于控制逻辑 Statement 和 PreparedStatement 之间的区别 PreparedStatement 继承了 Statement (1)PreparedStatement代码的可读性和可维护性好:支持参数化SQL (2)PreparedStatement性能高 因为是预先编译sql的。 (3)PreparedStatement 安全性好.因为每次 sql 都是编译过的。在网上传输没有明码 说出数据连接池的工作机制是什么? 1:从连接池获取连接或建立可用的连接 2:使用完毕之后,把连接返还给连接池, 3:在系统关闭前,断开所有的连接并且释放连接占用的资源。 4:还能够处理无效的连接(原来可以用的,但是超时了,或某种原因不能用了) 并能够限制连接池中最大连接数。和初始化连接的个数。 用 java 访问 Oracle 数据库、取得记录并输出到界面 Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn=DriverManager.getConnection( url , username , password ); Statement stmt=conn.createStatement(); String str="select * from [table]"; ResultSet rs=stmt.executeQuery(str); While(rs.next()) { ........................ } rs.close(); stmt.close(); conn.close(); 什么情况下调用 doGet()和 doPost()? 答:Jsp 页面中的 form 标签里的 method 属性为 get 时调用 doGet(),为 post 时调用 doPost()。 如何现实 servlet 的单线程模式 答:<%@ page isThreadSafe="false"%> 我们在 web 应用开发过程中经常遇到输出某种编码的字符,如 iso8859-1 等,如何输出一个某种编码的字符串? 答: tempStr = new String(str.getBytes("ISO-8859-1"), "GBK"); ================================================================================ xml 有哪些解析技术?区别是什么? 答:有 DOM, JDOM DOM4J, SAX 等) SAX: 执行速度快,但是只能读不能写。 DOM: 效率低,解析速度慢,内存占用量过高,对于大文件来说几乎不可能使用 JDOM :是 j2ee 平台的一部分,将 SAX 和 Dom 的优点结合起来,能读能写。 DOM4J:它是 JDOM 的一种智能分支。 什么是 xml 语言: 可扩展标记语言 (Extensible Markup Language, XML) ,用来存取数据 作用: 能在不同的语言中传递数据。也就是说:一个 xml 文件 java 能解析,c#或其他语言也能解析。 XML 与 HTML 的设计区别是:XML 是用来存储数据的,重在数据本身。而 HTML 是用来定义数据的,重在数据的显示模式 谈谈对流的理解? 所谓“流”,就是指数据通信通道。流是一个很形象的概念。 Java 中的流,可以从不同的角度进行分类。 按照数据流的方向不同可以分为:输入流和输出流。 按照处理数据单位不同可以分为:字节流和字符流。 按照实现功能不同可以分为: 节点流和处理流。 EJB 与 JAVA BEAN 的区别? 答:Java Bean 是可复用的组件,Enterprise Java Bean 是分布式组件。它是基于 Java 的远程方法调用(RMI)技术的,所以 EJB 可以被远程 访问(跨进程、跨计算机)。但 EJB 必须被布署在诸如 Webspere、WebLogic 这样的容器中, ===========================解释下面关于 J2EE 的名词(绿色的了解)============================ (1)JNDI:Java Naming & Directory Interface,JAVA 命名目录服务.主要提供的功能是:提供一个目录系统, 让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能. (2)JMS:Java Message Service,JAVA 消息服务.主要实现各个应用程序之间的通讯.包括点对点和广播. (3)JTA:Java Transaction API,JAVA 事务服务.提供各种分布式事务服务.应用程序只需调用其提供的接口即可. (4)JAF: Java Action FrameWork,JAVA 安全认证框架.提供一些安全控制方面的框架.让开发者通过各种部署和自定义实现自己的 个性安全控制策略. (5)RMI:Remote Method Interface,远程方法调用 web service 名词解释。JSWDL 开发包的介绍。JAXP、JAXM 的解释。SOAP、UDDI,WSDL 解释。 (绿色的了解不要去背) Web Service: web 服务,能提供远程调用。 soap(简单对象传输协议)是 web service 最关键的技术,是 web service 中数据和方法调传输的介质。 WSDL(web service definition language):webservices 的描叙文件。 UDDI是一种目录服务,企业可以使用它对Webservices迚行注册和搜索。 java 的(PO,VO, DTO,BO,DAO,POJO)解释: POJO(plain ordinary java object) 简单无规则 java 对象,纯的传统意义的 java 对象 PO(persistant object) 持久对象:hibernate 中映射的对象。 VO(value object) 值对象:通常用于业务层之间的数据传递 BO(business object) 业务对象 DTO :Data Transfer Object 数据传输对象 PO,VO, DTO,BO POJO 其实都一样的。 DAO(data access object) 数据访问对象 什么是 JPA? Java Persistence API 是 Sun 官方提出的 Java 持久化规范. JPA 通过 JDK 5.0 注解或 XML 描述对象-关系表的映射关系(ORM),并将运行期的实体对象持久化到数据中。 什么事 ERP ERP——Enterprise Resource Planning 企业资源计划系统,如用友软件就是开发企业 ERP 的。ERP 系统是指建立在信息技术基础上,以系 统化的管理思想,为企业决策层及员工提供决策的管理平台 SAP 起源于 Systems Applications and Products in Data Processing。是 SAP 公司的产品——企业管理解决方案的软件名称。SAP 是目前 全世界排名第一的 ERP Jdo 是什么? JDO 是 Java 对象持久化的新的规范,为 java data object 的简称,也是一个用于存取某种数据仓库中的对象的标准化 API。 什么是 JNDI 答:(Java Naming & Directory Interface)JAVA 命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下 自己的索引,从而满足快速查找和定位分布式应用程序的功能. 如 jboss 中发布 ejb 通过 jndi 查找数据库的连接。 什么是防盗链? 盗链是他人在您的站点外,未经您同意直接引用您站点上的文件,如图片等,他们在耗用您的宽带资源 防盗链其实就是采用服务器端编程,通过 url 过滤技术实现的防止盗链的软件。 比如 file.uudog.com/test.rar 这个下载地址,如果没有装防盗链,别人就能轻而易举的在他的网站上引用这个地址。来下这个东西。 通过盗链的方法可以减轻自己服务器的负担,因为真实的空间和流量均是来自别人的服务器。 防止办法: 可以使用“登录验证”的方法进行防盗链。只有登录了的,才能下载。 针对不同的服务器,可以采取第三方插件来实现防盗链。 ====================================设计模式===================================== 什么是模式: 模式(Pattern)其实就是解决某一类问题的方法论。把解决某类问题的方法总结归纳到理论高度,那就是模式。 模式是一种指导。我们 java 中有很多设计模式。如单列模式 工厂模式 适配器模式 享元模式.,外观模式 答几种就可以了。 数据库也有三种模式:外模式 模式 内模式。外模式指查询的数据显示,模式指数据库的表结构,内模式指数据的内部存储结构。 什么是设计模式? 设计模式就象数据库的范式:是一些代码设计经验总结。使用设计模式:代码重用性好,可维护性好。 开发中都用到了那些设计模式?用在什么场合? 主要用到了 MVC 的设计模式。 开发中我们用到:简单工厂模式,单列模式等.适配器模式,代理模式,享元模式 设计模式有哪些:主要用了那些: 创建型模式: 1:简单工厂模式:同过一个类:用单列模式的方式获取类对象。 2:Singleton 模式示例:保障系统中一个类只有唯一的一个实例。 结构型模式 1:Adapter 模式:主要指对象适配器:利用系统中现有的类:完成我的业务:做到代码复用。 如:做数据库操作时有一个 add 方法,我需要写 log4j 日志和执行 jdbc 代码。目前系统中有一个写日志的通用类: 还有一个执行 jdbc 的封装类。我们可以将这两个类类对象作为我业务逻辑类的类对象。调用其方法完成写日志和执行 jdbc 操作。 我们不必在方法中再去完成写日志的代码和执行 jdbc 代码。 2:Bridge 桥梁模式:通俗点说就是在不同的东西之间搭一个桥,让他们能够连接起来,可以相互通讯和使用。 设计中抽象部分和行为部分都不稳定,抽象部分和行为部分来搭桥。避免使用大量的类来完成设计。 再如:我们 java 代码操作不同的数据库就是使用了桥接模式。 基于 JDBC 的应用程序,使用 JDBC 的 API,相当于是对数据库操作的抽象的扩展,算作桥接模式的抽象部分;而具体 的接口实现是由驱动来完成的,驱动这边自然就相当于桥接模式的行为部分了。而桥接的方式,不再是让抽象部分持有 实现部分,而是采用了类似于工厂的做法,通过 DriverManager 来把抽象部分和实现部分对接起来,从而实现抽象部 分和实现部分分离。 3:Decorator 装饰模式:文件输入输出流中用得最多:将文件流用:BufferedReader 包装起来:增加缓冲读写功能。 FileReader fileReader = new FileReader(PathFileName) BufferedReader bufReader=new BufferedReader(fileReader); 4:Facade 外观模式:我们项目中就是层次之间面向接口编程:先定义业务逻辑的接口,再有业务的现实类。 5:Flyweight 享元模式:主要是对数据的缓冲作用:如 jdbc 的连接池使用了享元模式。连接对象初始化在容器中,使用时拿出连接, 使用完了后,将其放回去。从而提高了效率。再如对 xml 文件我们可以将 xml 节点的值缓冲在 hashMap 中;而不必每次去读 xml 文件,从而提高了性能。 6:Proxy 模式:动态代理 / 静态代理: spring 中的 AOP 就是使用了动态代理模式。 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 静态代理与动态代理区别: 静态代理:由程序员编写源代码,再对其编译。在程序运行前,代理类的.class 文件就已经存在了。 动态代理:动态代理类不需要程序开发人员编写源代码。在程序运行时运用 Java 的反射机制生成。 什么是动态代理: “动态”应该指的是“运行期”。 其核心思想是在运行时动态生成一个代理类,并实例化成代理对象。代理对象和真实对象实现了相同的接口, 对代理对象方法的调用,都动态的分派到代理处理程序(委托类)去执行,开发者可以截获调用,加入自己的处理. 动态代理是很多框架和技术的基础, struts2 的拦截器中就用到了动态代理机制 spring 的 AOP 实现就是基于动态代理实现的。 行为型模式: 1:TemplateMethod 方法模板模式:spring 操作数据库的: jdbcTemplate 就是使用了方法模板模式。 Servlet 中:init ---doGet/doPost----destory------调用维持了一个调用顺序。也是使用了方法模板模式。 2:Command 模式:例如 菜单上所有的功能按钮就是用了命令模式实现的 3:Iterator 模式: 如容器里面的迭代器:就是好用了迭代模式 4:职责链模式:将处理形成一个链。一个一个的匹配处理. 如:错误处理 try{}catch()就是应用了职责链模式 我们主要用:单列模式 工厂模式 适配器模式 享元模式.,外观模式。 编程题: 写一个 Singleton 出来。 Singleton 模式主要作用是保证在 Java 应用程序中,一个类 Class 只有一个实例存在。 一般 Singleton 模式通常有几种种形式: 第一种形式: 定义一个类,它的构造函数为 private 的,它有一个 static 的 private 的该类变量,在类初始化时实例话,通过一个 public 的 getInstance 方法获取对它的引用,继而调用其中的方法。 public class Singleton { private Singleton(){} //在自己内部定义自己一个实例,是不是很奇怪? //注意这是 private 只供内部调用 private static Singleton instance = new Singleton(); //这里提供了一个供外部访问本 class 的静态方法,可以直接访问 public static Singleton getInstance() { return instance; } } 第二种形式: public class Singleton { private static Singleton instance = null; public static synchronized Singleton getInstance() { //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次 //使用时生成实例,提高了效率! if (instance==null) instance=new Singleton(); return instance; } } 第三种:单列模式的其他形式: 为了防止单态模式的类被多次实例化,应将类的构造器设成私有,这样就保证了只能通过静态方法获得类实例。 ============================================================================== 软件建模时要画哪些图 1:前期的调研阶段:主要写出需求调研说明书 画用列图,流程图:(活动图 状态图补充用列图) 2:概要设计阶段: 写出概要设计说明书。画类图包图。 3:详细设计阶段: 写出详细设计说明书。画时序图。 项目开发流程? 1:前期的调研阶段:主要写出需求调研说明书 画用列图,流程图:(活动图 状态图补充用列图) 2:概要设计阶段: 写出概要设计说明书。画类图包图,设计到函数。 3:详细设计阶段: 写出详细设计说明书。画时序图。 设计到伪代码。 4:编码阶段: 编写代码。 5:测试阶段: 编写测试报告。包挂:单元测试、集成测试、系统测试 UML 方面的图 答:标准建模语言 UML。用例图,静态图(包括类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图, 什么是 cmm3(cmm4/cmm5): CMM3 是能力成熟度模 型(Capability Maturity Model)的缩写 是软件开发的一个流程,对软件开发过程进行文档化,保证了软件产品一致性和可追溯性。提高了产品质量,降低了开发 成本。下面的作为参考:图解了一个项目开发流程的详细的过程 事业环境因素 启动过程组 规划过程组 执行过程组 监控过程组 收尾过程组 组织文化 项目管理信息系统 后备人力资源 项目发起人或 赞助人 工作说明书 合同 项目章程 项目初步范围说明书 组织过程资产 方针、程序、标准、原则 确定的过程 历史信息 吸取的教训 项目管理计划 可交付的成果 请求的变更 实施的变更请求 实施的纠正措施 实施的预防措施 实施的缺陷补救 工作业绩信息 批准的变更请求 否决的变更请求 批准的纠正措施 批准的预防措施 批准的缺陷补救 项目管理计划(更新) 项目范围说明书(更新) 推荐的纠正措施 推荐的预防措施 绩效报告 推荐的缺陷补救 预测 确认的缺陷补救 批准的可交付使用成果 顾客 最终产品、服务和成果 组织过程资产(更新) 行政收尾程序 合同收尾程序 ===========================================Struts=============================== === Struts 的应用(如 Struts 架构) Struts 是一个实现 MVC(Model-View-Controller)设计模式的开源框架。 Struts 有如下的主要功能: 1: 采用标签库 2: 页面导航(跳转控制) 3:支持国际化 strust 的 Action 是不是线程安全的?如果不是,有什么方式可以保证 Action 的线程安全?如果是,说明原因 Struts1.3 采用了单例模式的。如果在 action 中定义了变量则会被所有线程共享,所以不是线程安全的。 解决方案是:不要在 action 里用实例变量。 Struts2.0 采用非单列模式的。是线程安全的。 strust 的优点? Struts 的优点主要集中体现在两个方面:大量的标签库和页面导航(也就是控制跳转) 项目的启动要组织人员,定项目章程,制定项目初步 范围说明书。( 明确项目中需要完成什么) 进行项目成本估算。 项目经理来制定项目管理计划:主要是: 工期估算表 项目进度计划表 成本估算表 费用估算表 风险应对计划表等等 1 前期的调研计划:形成需求说明书 2 概要设计:到包到类:形成概要设计文档 3 详细设计:到函数到伪代码,形成详细设计文档 4 然后是编码和测试工作。形成测试报告。 5 对项目进行风险评估,提出风险补救措施和预防措施。 (如项目有难点可以另外招人或者找合作伙伴,对团队人 员离职情况如果采取措施等) 主要是:监督项目的执行情况: 包挂需求变更的批准和否决, 对项目的风险和缺陷提出一些建议和 纠正措施。(由质量保证部完成) 正式验收产品:有条不紊的结束项目或项目阶段 struts2 的最大特点(Strut1 与 struts2 的区别就答这个) Struts 2 以 WebWork 为核心,采用拦截器的机制来处理用户的请求,使得 action 不依赖于(servert)容器。 Struts2 面向接口编程并且提供一个 ActionSupport 基类去实现常用的接口 Struts2 Action 采用非单列模式,因此线程安全。 Struts2 支持强大的 OGNL 表达式 Struts1 是单列模式。线程不安全。 Struts2 的体系结构: Struts2 框架由 3 个部分组成: 核心控制器 FilterDispatcher、 业务控制器:就是用户自己写的 action 用户实现的业务逻辑组件:也就是后台业务逻辑实现类 在这 3 个部分里,Struts 2 框架提供了核心控制器 FilterDispatcher,而用户需要实现业务控制器和业务逻辑组件。 Struts2 的工作流程:(答这个) 基本简要流程如下: 1、客户端浏览器发出 HTTP 请求。 2、根据 web.xml 配置,该请求被 struts2 的总控制器接收。 3、strus2 的总控制器根据 struts.xml 配置,找到需要调用的 Action 类和方法,并执行相应的方法。调用后台的业务逻辑处理类 4、Action 执行完毕,根据 struts.xml 中的配置找到对应的返回结果 result,并跳转到相应页面。 5、返回 HTTP 响应到客户端浏览器 动作映射器 动作执行器 动作代理器 配置管理器 过滤控制器 过滤器:如字 符过滤器 详细流程如下:(这个了解就行,答上面简单流程就可以了) 一个请求在 Struts2 框架中的处理大概分为以下几个步骤: 1) 客户端初始化一个指向 Servlet 容器(例如 Tomcat)的请求。 2) 这个请求经过一系列的过滤器(Filter)后。 3) 接着 FilterDispatcher 被调用,FilterDispatcher 询问 ActionMapper(动作映射器)来决定这个请是否需要调用某个 Action。 4) 如果 ActionMapper 决定需要调用某个 Action,FilterDispatcher 把请求的处理交给 ActionProxy(动作代理类)。 5) ActionProxy 通过 Configuration Manager(配置文件管理器)询问框架的配置文件 struts.xml,找到需要调用的 Action 类。 6) ActionProxy 创建一个 ActionInvocation(动作执行器:就是 Action 的调用者)的实例。 7) ActionInvocation 实例在调用 Action 的过程前后,涉及到相关拦截器(Intercepter)的调用。 8) 一旦 Action 执行完毕,ActionInvocation 负责根据 struts.xml 中的配置找到对应的返回结果。 Struts2 的核心就是拦截器。Struts.xml 中所有的 package 都要 extends="struts-default"。 参考: Struts2 的核心 FilterDispatcher 在 web.xml 中的配置如下: setCharactor org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 struts2 org.apache.struts2.dispatcher.FilterDispatcher setCharactor /* struts2 /* 介绍下 struts2 的拦截器: 拦截器的工作原理如上图,每一个 Action 请求都包装在一系列的拦截器的内部。拦截器方法都是通过动态代理的方式来调用的。Struts2 的拦截器实现相对简单。当请求到达 Struts2 的总控制器时,Struts2 会查找配置文件,并根据其配置实例化拦截器对象,放到一个列表(list) 中,最后一个一个地调用列表中的拦截器 我们从 jsp 页面获取表单的值:就是利用了 struts2 的拦截器来完成的 这个操作是由参数拦截器完成的,在访问 action 作时,Struts2 会自动执行相应的 setter 方法,给 action 相应的变量赋值。 项目中如何读写属性资源文件? 答:用 ResourceBundle 这个类可以读资源文件。并且按照 key 来取值。 a.properties 文件内容: driver=oracle.jdbc.driver.OracleDriver url=jdbc:oracle:thin:@localhost:1521:myoracle user=hnlg ResourceBundle rb=ResourceBundle.getBundle("a"); System.out.println(rb.getObject("driver")); System.out.println(rb.getObject("url")); System.out.println(rb.getObject("user"));

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 2 人已下载

下载文档

相关文档