就业辅导用Java面试题(精简版)
1.面向对象的特征有哪些方面
1).抽象:
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2).继承:
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
3).封装:
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
4). 多态性:
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
2.String、StringBuffer和StringBuilder的区别
相同点:
1、String和StringBuffer都可以储存和操作字符串。
2、StringBuffer,与StringBuilder都实现了相同的接口,而且都继承相同的父类,
不同点:
1、String类用于构造数值不可改变的字符串;
2、StringBuffer类用于构造可变长度的字符串。典型地,你可以使用StringBuffers来动态构造字符数据。
3、StringBuffer的大部分方法都是同步的,所以是线程安全,StringBuilder没有同步,所以通常情况下效率上StringBuilder是优于StringBuffer的。
4、StringBuffer与StringBuilder随着append会扩大value[]的容量,这里具体做法是使用System类中的arraycopy方法拷贝,这个方法是调用底层本地方法来处理的,类似于直接使用C的指针操作,比较快。
3.说出ArrayList[ərei] [list],Vector[vektə], Linked List的存储性能和特性
相同点: ArrayList和Vector都是使用数组方式存储数据,数组方式允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢;
不同点: Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差;
LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快而索引速度慢。
4.struts1.2和struts2.0的区别?如何控制两种框架中的单例模式?
struts1.2和struts2.0的对比
a、Action类:
struts1.2要求Action类继承一个基类。struts2.0 Action要求继承ActionSupport基类
b、线程模式
struts1.2 Action是单例模式的并且必须是线程安全的,因为仅有一个Action的实例来处理所有的请求。
单例策略限制了Struts1.2 Action能做的事情,并且开发时特别小心。Action资源必须是线程安全的或同步的。
struts2.0 Action为每一个请求产生一个实例,因此没有线程安全问题。
c、Servlet依赖
struts1.2 Action依赖于Servlet API,因为当一个Action被调用时HttpServletRequest和HttpServletResponse被传递给execut方法。
struts2.0 Action不依赖于容器,允许Action脱离容器单独测试。如果需要,Struts2 Action仍然可以访问初始的Request和Response。
但是,其他的元素减少或者消除了直接访问HttpServletRequest和HttpServletResponse的必要性。
d、可测性
测试struts1.2 Action的一个主要问题是execute方法暴露了Servlet API(这使得测试要依赖于容器)。需要三方扩展struts TestCase提供了一套struts1.2的模拟对象来进行测试。
Struts2.0 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”也使得测试更容易。
5.Struts工作机制?为什么要使用Struts?
Struts的工作流程:
1、request请求会先通过一系列过滤器,配置PreparedAndExecuteFilter过滤HttpServletRequest请求;
2、过滤器根据访问的路径来决定是否调用,若符合,则调用ActionMapper
3、ActionMapper调用ActionProxy,通过配置文件,找到相应的Action类
4、Action类实例化一个ActionInvocation的实例,该实例涉及到一系列的拦截器
5、一旦方法运行完毕,ActionInvocation根据返回值去配置文件查找要去访问的路径,通常可以是Jsp页面和另一个Action
为什么要用Struts:
JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。
基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件
6.说下Struts的设计模式
1、MVC模式:将控制层、模型层、视图层分开(配合详细的MVC工作流程,自由发挥)
2、Treadlocal模式:针对同一个Servlet实例
3、代理模式
7.HashMap和Hashtable的区别。
相同点:
1、Hashtable和HashMap都采用哈希算法,从算法角度来说,效率差别不大;
2、HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口;
主要区别:
1、HashMap由于非线程安全,效率上可能高于Hashtable。
2、HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
3、HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
8.Oracle跟SQL Server 2005的区别?
宏观上:
1.最大的区别在于平台,oracle可以运行在不同的平台上,sql server只能运行在windows平台上,因此sql server的稳定性和安全性受到了WINDOWS平台的影响;
2.oracle使用的脚本语言为PL-SQL,而sql server使用的脚本为T-SQL
9.如何使用Oracle的游标?
oracle中的游标分为显示游标和隐式游标:
1、显示游标是用cursor...is命令定义的游标,它可以对查询语句(select)返回的多条 记录进行处理;
隐式游标是在执行插入 (insert)、删除(delete)、修改(update)和返回单条记录的查询(select)语句时由PL/SQL自动定义的。
2、显式游标的操作:打开游标、操作游标、关闭游标;
PL/SQL隐式地打开SQL游标,并在它内部处理SQL语句,然后关闭它
10.Oracle中function和procedure的区别?
1.函数也是存储过程的一种
2.函数可以没有参数,但是一定需要一个返回值,存储过程可以没有参数,不需要返回值
3.两者都可以通过out参数返回值, 如果需要返回多个参数则建议使用存储过程
4.在sql数据操纵语句中只能调用函数而不能调用存储过程
11.final,finally,finalize的区别。
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
详细属性和功能:
final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize—方法名Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
12.Overload[əuvələud]和Override[əuvəraid]的区别。
1、方法的重写Overriding和重载Overloading是Java多态性的不同表现。
2、作用域不同:重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
3、如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了;
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。
13.Oracle的导入导出有几种方式,有何区别?
1. 使用oracle工具 exp/imp,导入/导出的是二进制的数据
2. 使用plsql相关工具,导入/导出的是sql语句的文本文件
14.Oracle中有哪几种文件?
数据文件(一般后缀为.dbf或者.ora),日志文件(后缀名.log),控制文件(后缀名为.ctl)
15.forward[fɔ:wəd] 和redirect[ri:direkt]的区别
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。
16.说出数据连接池的工作机制是什么?
J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。
17.JSP的内置对象及方法。
Request:表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。
Response:表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等)
out:对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。
pageContext:表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。
Session:表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息
application :表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息
config:表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。
Page:表示从该页面产生的一个servlet实例
18.Hibernate工作原理及为什么要用?
原理:
1.读取并解析配置文件
2.读取并解析映射信息,创建SessionFactory
3.打开Sesssion
4.创建事务Transcation
5.持久化操作
6.提交事务
7.关闭Session
8.关闭SesstionFactory
为什么要用:
1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。
3. hibernate映射很灵活性。它支持各种关系数据库,从一对一到多对多的各种复杂关系
19.Hibernate与jdbc的联系
1、hibernate是jdbc的轻量级封装,包括jdbc的与数据库的连接,增删改查等功能
2、hibernate用面向对象的思想,通过配置文件把pojo类的字段和数据库的字段关联起来;
3、其实hibernate=封装的jdbc+xml文件
20.Hibernate与spring的联系
Spring实现了程序的全局性管理,包括对Hibernate的管理:
1、hibernate中的一些对象可以给Spring来管理,让Spring容器来创建hibernate中一些对象实例化。例如:SessionFactory,HibernateTemplate等。
2、Hibernate本来是对数据库的一些操作,放在DAO层,而Spring给业务层的方法定义了事务,业务层调用DAO层的方法,很好的将Hibernate的操作也加入到事务中来了。
21.什么是Hibernate的并发机制?怎么去处理并发问题?
Hibernate并发机制:
a、Hibernate的Session对象是非线程安全的,对于单个请求,单个会话,单个的工作单元(即单个事务,单个线程),它通常只使用一次,然后就丢弃。
如果一个Session 实例允许共享的话,那些支持并发运行的,例如Http request,session beans将会导致出现资源争用。
b、并发可能会引发第一类丢失更新,脏读,不可重复读,第二类丢失更新一系列的问题。
处理并发问题:
1、将session绑定到ThreadLocal,每个线程使用的只是session的副本,不会影响到session;
2、设置事务隔离级别:
Serializable:串行化。隔离级别最高
Repeatable Read:可重复读
Read Committed:已提交数据读
Read Uncommitted:未提交数据读。隔离级别最差
3、设置锁:乐观锁和悲观锁。
乐观锁:使用版本号或时间戳来检测更新丢失,在<class>的映射中设置 optimistic-lock="all"可以在没有版本或者时间戳属性映射的情况下实现 版本检查,此时Hibernate将比较一行记录的每个字段的状态
行级悲观锁:Hibernate总是使用数据库的锁定机制,从不在内存中锁定对象!只要为JDBC连接指定一下隔 离级别,然后让数据库去搞定一切就够了。类LockMode 定义了Hibernate所需的不同的锁定级别:LockMode.UPGRADE,LockMode.UPGRADE_NOWAIT,LockMode.READ;
22.abstract class[æbstrækt]和interface[intəfeis]有什么区别?
抽象类:声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。
规则:
1、不能创建abstract类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。
2、不能有抽象构造函数或抽象静态方法。
3、Abstract类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。
接口:接口(interface)是抽象类的变体。多继承性可通过实现接口而获得。
规则:
1、接口中的所有方法都是抽象的,没有一个有程序体。
2、接口只可以定义static final成员变量。
3、接口的实现与子类相似,当类实现接口时,必须所有这种接口的方法。
4、接口类型可作为属性注入到类中,实现动态联编。
23、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
相同点:JSP本质上是Servlet的简易方式,更强调应用的外表表达;因此JSP编译后是"类servlet"。
最主要的不同点在于:Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。总之,JSP侧重于视图,Servlet主要用于控制逻辑。
24.XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
XML文档定义有两种形式:dtd和schema
两者的本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的);
解析XML文档的方式:
DOM:由DOM的树结构进行解析,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,优点:适合对XML的随机访问,缺点:当XML较大时,解析性能大幅下降;
SAX:不同于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问
STAX(Streaming API for XML):从SAX上发展而来,不基于事件驱动,而是采用观察者模式,真正实现“解析你想解析的部分”。
25.说下Hibernate的缓存机制
1.内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存
2.二级缓存:
a)应用及缓存
b)分布式缓存
条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据
c) 第三方缓存的实现:使用第三方缓存插件
26、Hibernate的查询方式
1、Hibernate特有的语句Hql:
1、属性查询
2、参数查询、命名参数查询
3、关联查询
4、分页查询
5、统计函数
2、Criteria查询
3、Sql查询
27.怎样优化Oracle数据库,有几种方式?
数据库性能最关键的因素在于IO,因为操作内存是快速的,但是读写磁盘是速度很慢的,优化数据库最关键的问题在于减少磁盘的IO,所以数据库优化应该分为物理的和逻辑的优化, 物理的是指oracle产品本身的一些优化,逻辑优化是指应用程序级别的优化
物理优化的一些原则:
1.Oracle的运行环境(网络,硬件等)
2.使用合适的优化器
3.合理配置oracle实例参数
4.建立合适的索引(减少IO)
5.将索引数据和表数据分开在不同的表空间上(降低IO冲突)
6.建立表分区,将数据分别存储在不同的分区上(以空间换取时间,减少IO)
逻辑上优化:
1.可以对表进行逻辑分割,如中国移动用户表,可以根据手机尾数分成10个表,这样对性能会有一定的作用
2.Sql语句使用占位符语句,并且开发时候必须按照规定编写sql语句(如全部大写,全部小写等)oracle解析语句后会放置到共享池中
如: select * from Emp where name=? 这个语句只会在共享池中有一条,而如果是字符串的话,那就根据不同名字存在不同的语句,所以占位符效率较好
3.数据库不仅仅是一个存储数据的地方,同样是一个编程的地方,一些耗时的操作,可以通过存储过程等在用户较少的情况下执行,从而错开系统使用的高峰时间,提高数据库性能
4.尽量不使用*号,如select * from Emp,因为要转化为具体的列名是要查数据字典,比较耗时
5.选择有效的表名
对于多表连接查询,可能oracle的优化器并不会优化到这个程度, oracle 中多表查询是根据FROM字句从右到左的数据进行的,那么最好右边的表(也就是基础表)选择数据较少的表,这样排序更快速,如果有link表(多对多中间表),那么将link表放最右边作为基础表,在默认情况下oracle会自动优化,但是如果配置了优化器的情况下,可能不会自动优化,所以平时最好能按照这个方式编写sql
6.Where字句 规则
Oracle 中Where字句时从右往左处理的,表之间的连接写在其他条件之前,能过滤掉非常多的数据的条件,放在where的末尾, 另外!=符号比较的列将不使用索引,列经过了计算(如变大写等)不会使用索引(需要建立起函数), is null、is not null等优化器不会使用索引
7.使用Exits Not Exits 替代 In Not in
8.合理使用事务,合理设置事务隔离性
数据库的数据操作比较消耗数据库资源的,尽量使用批量处理,以降低事务操作次数
28.Oracle是怎样分页的?
Oracle中使用rownum来进行分页, 这个是效率最好的分页方法,hibernate也是使用rownum来进行oralce分页的
select * from
( select rownum r,a from tabName where rownum <= 20 )
where r > 10
29.java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
主要分为字节流,字符流。
字节流继承于InputStream,OutputStream。
字符流继承于InputStreamReader OutputStreamWriter。
在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
30.说出一些常用的类,包,接口,请各举5个
常用的类:BufferedReader BufferedWriter FileReader FileWirter String Integer
常用的包:java.lang java.awt java.io java.util java.sql
常用的接口:Remote List Map Document NodeList
31.什么是java序列化,如何实现java序列化?
什么是序列化:
1、序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。为了解决在对对象流进行读写操作时所引发的问题。
2、可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的;
然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
32.请对以下在J2EE中常用的名词进行解释(或简单描述)
web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。
EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。
JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。
JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。
JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。
JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。
RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。
33.Struts的应用(如STRUTS架构)
Struts是采用Servlet技术,开发Web应用程序的开放源码的framework。 采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。
Struts有如下的主要功能:
一.包含一个controller servlet,能将用户的请求发送到相应的Action对象。
二.JSP自由tag库,并且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。
三.提供了一系列实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息。
34.比较truncate和delete命令 ?
相同点:Truncate 和delete都可以讲数据实体删掉;
不同点:
1、truncate 的操作并不记录到 rollback日志,所以操作速度较快,但同时这个数据部能恢复
2、Delete操作不能腾出表空间的空间
3、Truncate 不能对视图等进行删除
4、Truncate是数据定义语言(DDL),而delete是数据操纵语言(DML)
35.简述oracle中 dml、ddl、dcl的使用
Dml 数据操纵语言,如select、update、delete,insert
Ddl 数据定义语言,如create table 、drop table 等等
Dcl 数据控制语言, 如 commit、 rollback、grant、 invoke等
36.说说oracle中的经常使用到得函数
Length 长度、 lower 小写、upper 大写, to_date 转化日期, to_char转化字符
Ltrim 去左边空格、 rtrim去右边空格,substr取字串,add_month增加或者减掉月份、to_number转变为数字
37.垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
1、对于GC(Garbage Collection)来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。
2、通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。
3、当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。垃圾回收器不可以马上回收内存。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
38.排序都有哪几种方法?请列举。用JAVA实现一个快速排序。
排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)
使用快速排序方法对a[ 0 :n- 1 ]排序:
1、从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点
2、把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点
3、递归地使用快速排序方法对left 进行排序
4、递归地使用快速排序方法对right 进行排序
5、所得结果为l e f t + m i d d l e + r i g h
39.项目中为什么使用SSH
1. 使用Struts是因为struts是基于MVC模式的,很好的将应非用程序进行了分层,使开发者更关注于业务逻辑的实现;第二,struts有着丰富的taglib,如能灵活运用,则能大大提高开发效率。
2. 使用Hibernate:因为hibernate为Java应用提供了一个易用的、高效率的对象关系映射框架。hibernate是个轻量级的持久性框架,功能丰富。
3. 使用Spring:因为spring基于IoC(Inversion of Control,反向控制)和AOP构架多层j2ee系统的框架,但它不强迫你必须在每一层中必须使用Spring,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;采用IoC使得可以很容易的实现bean的装配,而且能够在类与类之间解耦合,提供了简洁的AOP并据此实现事务管理(Transcation Managment)等。
40.简单工厂模式与抽象工厂模式的区别
简单工厂:一个具体工厂通过条件语句创建多个产品,产品的创建逻辑集中与一个工厂类。客户端通过传不同的参数给工厂,实现创建不同产品的目的增加新产品时,需要修改工厂类、增加产品类,不符合OCP(开闭原则)原则工厂方法
抽象工厂:一个具体工厂创建一个产品族,一个产品族是不同系列产品的组合,产品的创建的逻辑分在在每个具体工厂类中。所有的具体工厂继承自同一个抽象工厂。客户端创建不同产品族的工厂,产品族的工厂创建具体的产品对客户端是不可见的。增加新的产品族时,需要增加具体工厂类,符合OCP原则
(1) 企业JavaBean(Enterprise JavaBean,EJB)为开发服务器端企业应用程序组件提供了一个模型,利用这个模型开发用来创建可移植与分布式企业应用程序的服务器企业应用程序组件,比创建独立的企业应用程序所需使用的企业应用程序组件更为简单。
(2) EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现。
(3) 开发EJB的主要步骤一般来说,整个的开发步骤(开发,配置,组装)包括如下几个方面。
开发:首先要定义三个类:Bean类本身,Bean的本地和远程接口类。
配置:配置包括产生配置描述器-这是一个XML文件、声明了Enterprise Bean的属性、绑定了bean的class文件(包括stub文件和skeleton文件)。最后将这些配置都放到一个jar文件中。还需要在配置器中定义环境属性。
组装应用程序:包括将Enterprise beans安装到Server服务器中,测试各层的连接情况。程序组装器将若干个Enterprise Beans与其它的组件结合起来,组合成一个完整的应用程序;或者将若干个Enterprise beans组合成一个复杂的Enterprise Bean?管理Enterprise Bean
41.Spring mvc工作机制及为什么要用?
工作机制:
1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。
2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.
3.DispatcherServlet请请求提交到目标Controller
4.Controller进行业务逻辑处理后,会返回一个ModelAndView
5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
6.视图对象负责渲染返回给客户端。
为什么要用:参考struts,因为两者都是MVC框架
42.为什么要用spring?
Spring既是一个AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于替换对象。有了 Spring,只要用 JavaBean 属性和配置文件加入依赖性(协作对象)。然后可以很容易地在需要时替换不同的接口实现类。
Spring有两大特性:IOC和AOP
IOC:正如单词 倒置 所表明的,IOC 就像反 过来的 JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straight construction),把对象的创建和维护交由容器管理,从而使类与类之间的依赖关系发生反转,实现解耦合。
AOP: 让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用 AOP 后,公共服务 (比如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。
43.项目中如何体现Spring中的切面编程,具体说明。
面向切面编程:主要是横切一个关注点,将一个关注点模块化成一个切面。
具体操作:在切面上声明一个通知(Advice)和切入点(Pointcut);
1.通知(Advice):
通知定义了切面是什么以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。
2.连接点(Joinpoint):
程序能够应用通知的一个“时机”,这些“时机”就是连接点,例如方法被调用时、异常被抛出时等等。
3.切入点(Pointcut)
通知定义了切面要发生的“故事”和时间,那么切入点就定义了“故事”发生的地点,例如某个类或方法的名称,Spring中允许我们方便的用正则表达式来指定
4.切面(Aspect)
通知和切入点共同组成了切面:时间、地点和要发生的“故事”
项目中用到的Spring中的切面编程最多的地方:声明式事务管理。
a、定义一个事务管理器
b、配置事务特性(相当于声明通知。一般在业务层的类的一些方法上定义事务)
c、配置哪些类的哪些方法需要配置事务(相当于切入点。一般是业务类的方法上)
44.你对java中的socket编程了解多少?
Socket是网络上运行的两个程序间双向通讯的一端,他既可以使接收请求,也可以是发送请求,利用它可以较方便地编写网络上数据的传递。
在java中,利用Socket方法,可以实现两台计算机之间的通讯。Socket可理解为客户端或服务器端的一个非凡的对象,这个对象有两个重要的方法,一个是getInputStream方法,另一个是getOutputStream方法。
getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputStream方法得到的输入流实际上是从服务器端发出的数据流。
getOutputStream方法得到一个输出流,客户端Socket对象上的getOutputStream方法返回的输出流就是将要发送到服务器端的数据流。(其实是一个缓冲区,暂时存储将要发送到服务器的数据)。
45.项目中用到了那些测试方法?进行简单的描述?你是怎么测试的?项目中用了什么bug管理工具?在项目中如何去使用?
a、单元测试
单元测试用于测试软件中的各个组件。它是属于白盒测试的。用的最多的是使用Junit工具来进行单元测试。类只需继承TestCase类即可。
b、集成测试
把几个相关的单元集成在一起,通过检查集成单元或模块以发现缺陷的过程就称为集成测试。我们通常在项目中是将每个人的模块整合到一起进行统一测试。
c、系统测试
系统测试是一系列的测试,其主要目的是在模拟环境中完整、准确的运行软件系统。
我们通常的处理方法是:
1. 负载测试:使系统处理超过其能力的任务来测试系统的过程。
2. 压力测试:也叫做强度测试,获取系统正确运行的极限。
3. 性能测试:其目的不是为了发现任何错误或缺陷,而是消除瓶颈。
4. 可用性测试: 这个主要是体现在给用户的体验上。
d、用户验收测试
开发阶段之后的测试阶段确保开发的软件是完整且没有缺陷的。
项目中用到的bug管理工具很少,基本上没用。
46.Collection [kəlekʃən]和 Collections的区别。
Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作
47.heap和stack[stæk]有什么区别。
Heap(堆),stack(栈)
1、栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。
2、堆是栈的一个组成元素
第一,从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。
第二,堆与栈的分离,使得堆中的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象)。这种共享一方面提供了一种有效的数据交互方式(如:共享内存),另一方面,堆中的共享常量和缓存可以被所有栈访问,节省了空间。
第三,栈因为运行时的需要(比如保存系统运行的上下文),需要进行地址段的划分。由于栈只能向上增长,因此就会限制住栈存储内容的能力。而堆不同,堆中的对象是可以根据需要动态增长的,因此栈和堆的拆分,使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可。
48.JSP中动态include[inklu:d]与静态include的区别?
动态INCLUDE用jsp:include动作实现 <jsp:include page="included.jsp" flush="true" />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。
静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面<%@ include file="included.htm" %>
49.应用服务器有那些?
BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i Application Server,jBoss,Tomcat
50.项目中如何规范编码?
制定一份编码规范文档:
1、类名以大写开头、有意义的单词的组成,组合单词的每一个单词都要大写。
2、接口以I开头,实现类在类名后加Impl如:接口为IUserDAO,实现类为UserDAOImpl。
3、系统中涉及的常量字符串,不能采用硬编码,需从properties文件中读取。
4、编码需要多加注释
5、Jsp页面命名以小写字母开头、有意义的单词的组成,组合单词除第一个单词首字母小写,其他单词的首字母大写,其余小写。
6、包名全部小写
7、数据库中表字段:同5
51.存储过程优缺点:
优点:
1.存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
2.可保证数据的安全性和完整性。通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全;通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
3.再运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。 由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。
4.可以降低网络的通信量, 不需要通过网络来传送很多sql语句到数据库服务器了
5. 使体现企业规则的运算程序放入数据库服务器中,以便集中控制;
当企业规则发生变化时在服务器中改变存储过程即可,无须修改任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序工作量非常之大(修改、发行和安装应用程序)。如果把体现企业规则的 运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可以了,应用程序无须任何变化。
缺点:
1.可移植性差
2.占用服务器端多的资源,对服务器造成很大的压力
可读性和可维护性不好
Create [or replace] procedure 过程名字(参数 …)as
vs_ym_sn_end CHAR(6); --同期终止月份
CURSOR cur_1 IS --定义游标(简单的说就是一个可以遍历的结果集)
SELECT area_code,CMCODE,SUM(rmb_amt)/10000 rmb_amt_sn,SUM(usd_amt)/10000 usd_amt_sn
FROM BGD_AREA_CM_M_BASE_T
WHERE ym >= vs_ym_sn_beg
AND ym <= vs_ym_sn_end
GROUP BY area_code,CMCODE;
BEGIN
--用输入参数给变量赋初值,用到了Oralce的SUBSTR TO_CHAR ADD_MONTHS TO_DATE 等很常用的函数。
vs_ym_beg := SUBSTR(is_ym,1,6);
vs_ym_end := SUBSTR(is_ym,7,6);
vs_ym_sn_beg := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,'yyyymm'), -12),'yyyymm');
vs_ym_sn_end := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,'yyyymm'), -12),'yyyymm');
--先删除表中特定条件的数据。
DELETE FROM xxxxxxxxxxx_T WHERE ym = is_ym;
--然后用内置的DBMS_OUTPUT对象的put_line方法打印出影响的记录行数,其中用到一个系统变量SQL%rowcount
DBMS_OUTPUT.put_line('del上月记录='||SQL%rowcount||'条');
INSERT INTO xxxxxxxxxxx_T(area_code,ym,CMCODE,rmb_amt,usd_amt)
SELECT area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000
FROM BGD_AREA_CM_M_BASE_T
WHERE ym >= vs_ym_beg
AND ym <= vs_ym_end
GROUP BY area_code,CMCODE;
DBMS_OUTPUT.put_line('ins当月记录='||SQL%rowcount||'条');
--遍历游标处理后更新到表。遍历游标有几种方法,用for语句是其中比较直观的一种。
FOR rec IN cur_1 LOOP
UPDATE xxxxxxxxxxx_T
SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn
WHERE area_code = rec.area_code
AND CMCODE = rec.CMCODE
AND ym = is_ym;
END LOOP;
COMMIT;
--错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。
EXCEPTION
WHEN OTHERS THEN
vs_msg := 'ERROR IN xxxxxxxxxxx_p('||is_ym||'):'||SUBSTR(SQLERRM,1,500);
ROLLBACK;
--把当前错误记录进日志表。
INSERT INTO LOG_INFO(proc_name,error_info,op_date)
VALUES('xxxxxxxxxxx_p',vs_msg,SYSDATE);
COMMIT;
RETURN;
END;
52.MVC的各个部分都有那些技术来实现?如何实现?
MVC是Model-View-Controller的简写。
1、"Model" 代表的是应用的业务逻辑,通过JavaBean,EJB组件实现;
2、 "View" 是应用的表示面,是由JSP页面产生;
3、"Controller" 是提供应用的处理过程控制,一般是一个Servlet,通过这种设计模型把应用逻辑、处理过程和显示逻辑分成不同的组件实现。
4、这些组件可以进行交互和重用
53.存储过程的作用?
1、存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。
2、存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。
54.WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。
Web Service是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。
JAXP(Java API for XML Parsing) 定义了在Java中使用DOM, SAX, XSLT的通用的接口。这样在你的程序中你只要使用这些通用的接口,当你需要改变具体的实现时候也不需要修改代码。
JAXM(Java API for XML Messaging) 是为SOAP通信提供访问方法和传输机制的API。
WSDL是一种 XML 格式,用于将网络服务描述为一组端点,这些端点对包含面向文档信息或面向过程信息的消息进行操作。这种格式首先对操作和消息进行抽象描述,然后将其绑定到具体的网络协议和消息格式上以定义端点。相关的具体端点即组合成为抽象端点(服务)。
SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML编码信息的轻量级协议。
UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。
56.j2ee常用的设计模式?说明工厂模式。
Java中的23种设计模式:
Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式),
Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式),
Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式),
Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式),
Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式),
Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式),
Observer(观察者模式), State(状态模式), Strategy(策略模式),
Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)
工厂模式:工厂模式是一种经常被使用到的模式。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例
57.JSP的常用指令
<%@page language=”java” contenType=”text/html;charset=gb2312” session=”true” buffer=”64kb” autoFlush=”true” isThreadSafe=”true” info=”text” errorPage=”error.jsp” isErrorPage=”true” isELIgnored=”true” pageEncoding=”gb2312” import=”java.sql.*”%>
isErrorPage(是否能使用Exception对象),isELIgnored(是否忽略表达式)
<%@include file=”filename”%>
<%@taglib prefix=”c”uri=”http://……”%>/
58.编程题: 写一个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; }
}
其他形式:
定义一个类,它的构造函数为private的,所有方法为static的。
一般认为第一种形式要更加安全些
59.webservice的运行机制是什么?在项目中是怎么使用的?
客户端应用程序查找Web服务的信息或类型描述。这些信息是一个XML文件,称为Web服务描述(WSDL)语言。然后,客户端按要求使用简单对象访问协议(SOAP)将所需参数发送至服务器,服务器再将相应结果返回给客户端。
这里我们将发布web service的机器称为服务端,而将调用web service的机器称为客户端。
首先服务端将发布web 服务。
客户端调用步骤:
1: 加入web 应用,将刚才发布的web服务加入,这时生成了上述web服务在本地的一个代理,我们假设为WebProxy。
2: 客户端调用之前首先实例化一个该代理的对象,然后调用发布的方法
3: 客户端将调用信息包括方法名和参数加入到soap消息中通过http传送给web service服务端
4: 服务端从soap消息中获得调用信息,然后执行方法,将返回结果加入到soap消息中然后通过http传回
5: 客户端代理得到这个soap消息后解析处结果返回给调用客户端方法
60.hibernate的三种状态之间如何转换
当对象由瞬时状态(Transient)一save()时,就变成了持久化状态。
当我们在Session里存储对象的时候,实际是在Session的Map里存了一份,
也就是它的缓存里放了一份,然后,又到数据库里存了一份,在缓存里这一份叫持久对象(Persistent)。
Session 一 Close()了,它的缓存也都关闭了,整个Session也就失效了,
这个时候,这个对象变成了游离状态(Detached),但数据库中还是存在的。
当游离状态(Detached)update()时,又变为了持久状态(Persistent)。
当持久状态(Persistent)delete()时,又变为了瞬时状态(Transient),
此时,数据库中没有与之对应的记录
61.jsp有哪些动作?作用分别是什么?
答:JSP共有以下6种基本动作
jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记
62.BS与CS的联系与区别。
C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或 SQL Server。客户端需要安装专用的客户端软件。
B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、Informix或 SQL Server等数据库。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。
63.线程的基本概念、线程的基本状态以及状态之间的关系
1、概念:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。
2、状态:Java中的线程有四种状态分别是:运行、就绪、挂起、结束。
3、状态之间的关系:wait必须在synchronized内部调用。 调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当synchronized获得锁后,由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。
64.int 和 Integer [intidʒə] 有什么区别
Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。
原始类型封装类
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,存储方式不同:
1、当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。
2、原始类型(基本类型)在内存中存储的是值,而引用类型存储的是指向变量的指针。
65.运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态:
1运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。
2、java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
66.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、
67.如何优化Hibernate?
1.使用双向一对多关联,不使用单向一对多
2.灵活使用单向一对多关联
3.不用一对一,用多对一取代
4.配置对象缓存,不使用集合缓存
5.一对多集合使用Bag,多对多集合使用Set
6.继承类使用显式多态
7.表字段要少,表关联不要怕多,有二级缓存撑腰
68.Struts的validate框架是如何验证的?
在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。
70.tomcat、weblogic的调优
a、禁用DNS查询
当web应用程序要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。
DNS查询需要占用网络,并且包括可能从很远的服务器或者不起作用的服务器上获取对应IP的过程,这样会耗费一定的时间。为了消除DNS对性能的影响我们可以关闭DNS查询,方式是修改server.xml文件中的enableLoopups参数值为"false";
b、调整线程数
通过修改应用程序的连接器(connector)中的处理请求的线程数。Tomcat使用线程池加速响应速度来处理请求。
71.socket的连接方式,进行简单的说明
Socket client = new Socket("服务器Ip",服务器监听端口); 向服务器发送连接请求。
Socket(InetAddress address, int port): 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
Socket(String host, int port): 创建一个流套接字并将其连接到指定主机名上的指定端口号。
72.如何考虑一个项目的安全性?从哪些方面去体现?
项目的安全性并不是指一个系统的功能,而是属性。
要考虑的方面:
a、防止有人恶意破坏,如:sql注入。
b、编码、权限的严密控制,也能很好的控制项目的安全性。如页面尽量少用客户端验证,而使用服务器验证,
减少有人修改客户端代码而破环项目的安全性。
c、硬件设备等的支持,如:防火墙能够防止有人攻击Ip, 从端口访问服务器。
d、平台稳定性如何,如:考虑linux,window平台下项目是否能够很好的运行。
73.谈谈你mvc的理解
MVC是Model—View—Controler的简称。即模型—视图—控制器。MVC是一种设计模式,它强制性的把应用程序的输入、处理和输出分开。
MVC中的模型、视图、控制器它们分别担负着不同的任务。
视图: 视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。
模型: 模型表示业务数据和业务处理。相当于JavaBean。一个模型能为多个视图提供数据。这提高了应用程序的重用性
控制器: 当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求。然后根据处理的结果调用相应的视图来显示处理的结果。
MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。
74.struts与spring是如何集成的
有两种集成方式:
1.在Action 中取的spring 对象,此中方式不提倡使用,因为他与业务对象的依耐关系太紧密
2.将 Action 交有 spring 管理, Action 中需要的业务对象有 spring 注入,提倡使用这种方式