资源描述
设置超时:
采用HTTPclient访问远程地址并提交数据的过程如下:
1建立Socket连接
2通过GET/POST方法提交数据
3等待对方服务器应答,接收返回数据
因此从上述过程看,超时会涉及1和3,也就是说超时的原因主要有二:一是建立网络连接慢,二是虽然成功建立连接但是对方页面处理过慢,返回数据超时。而这两个过程是互不覆盖的。因此,超时就得针对这两个过程设置:
client.getHttpConnectionManager().getParams().setConnectionTimeout(30000);// 针对连接建立时间
client.getHttpConnectionManager().getParams().setSoTimeout(3);// 针对页面返回数据时间
Servlet
对于servlet的认识,对于forward和redirect概念
Servlet运行在servlet容器中,其生命周期由容器来管理。他的生命周期通过servlet接口中的init()、service()、destory()方法
1.从地址栏显示
Forward:是容器控制权的转向,是服务器请求资源,服务器直接访问目标地址的URL,把那个地址的URL的响应内容读取过来,发送给浏览器,浏览器不知道服务器发送的内容是从哪里来的,所以它的地址栏中还是原来的地址
Redirect就是服务器根据逻辑啊,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,并且可以看到跳转后的链接地址。
Forward更加高效,并且有助于隐藏实际链接
2.从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.
jsp和servlet的区别
jsp是servlet技术的扩展,本质上是servlet的简易方式,更强调应用的外表表达。Jsp编译后就是“类servlet”。他们最主要的不同是servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离出来。而JSP的情况是Java和HTML可以组合成一个扩展名为。Jsp的文件。JSP侧重于视图,servlet主要用于控制逻辑
Jsp编译过程
Web容器处理JSP文件请求的执行过程主要包括以下4个部分:
1. 客户端发出Request请求
2. JSP Container 将JSP转译成Servlet的源代码
3. 将产生的Servlet源代码经过编译后,并加载到内存执行
4. 把结果Response(响应)至客户端
我先以tomcat中的jsp编译过程为例,tomcat先将整个jsp页面的代码读取出来,写到一个新的Java文件中。(在读取jsp文件时,会获取他的编码格式,先读取pageencoding,如果pageencoding没有指定,他会读取contenttype的编码格式,如果contenttype也没有指定,就会使用默认的ISO-8859-1编码格式
时 )
Tomcat读取完jsp文件后,会将这些内容写到一个新文件中(默认UTF-8)格式,然后编译
当jsp文件显示时,会使用contenttype中指定的MIME类型和charset.如果charset没有指定,就使用pageEncoding中指定的编码,如果pageEncoding也没有指定,就使用默认的ISO-8859-1编码。
Jsp和servler的执行性能只在第一次有差别,因为jsp在执行一次过后,会被编译成servlet的类文件,即。Class,当再重复调用执行时,就直接执行第一次所产生的servlet。因此除了第一次,之后的jsp和servlet执行执行速度几乎相同。
servlet的生命周期
Servlet运行在servlet容器中,其生命周期由容器来管理。他的生命周期通过servlet接口中的init()、service()、destory()方法
Servlet的生命周期又包含了4个阶段:
1加载和实例化:servlet容器启动时,或者在容器检测到需要这个servlet来响应第一个请求时,创建servlet实例。
2初始化,初始化就是servlet会调用提供init(),对于每一个servlet实例,init只被调用一次。
3请求处理,Servlet容器调用Servlet的service()方法对请求进行处理
4服务终止:当容器检测到一个Servlet实例应该从服务中被移除的时候,容器就会调用实例的destroy()方法,以便让该实例可以释放它所使用的资源,保存数据到持久存储设备中。
UML
UML类图怎么画?类与类图之间的关系。
UML类图 用rose画的比较多,或者是微软的visio也可以。
1.关联关系:直线。关联是一种结构化的关系,指一种对象和另一种对象有联系。给定有关联的两个类,可以从一个类的对象得到另一个类的对象。关联有两元关系和多元关系。两元关系是指一种一对一的关系,多元关系是一对多或多对一的关系。一般用实线连接有关联的同一个类或不同的两个类。当你想要表示结构化关系时使用关联。
2.依赖关系:带箭头的虚线。 依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的事物,反之不成立。在你想显示一个事物使用另一个事物时使用。
3.继承/泛化:带三角箭头的实线。泛化是父类和子类之间的关系,子类继承父类的所有结构和行为。在子类中可以增加新的结构和行为,也可以覆写父类的行为。
4.实现:带三角箭头的虚线
5.聚合:带空心菱形的虚线
6.组合:带是新菱形的虚线
设计模式
设计模式,画出prototype设计模式
老板说:“给我盖一座大楼。”
工程师说:“盖什么样的大楼呢?”
老板指着身后的一座楼说:“和那个一模一样的
从老板的角度来讲,他采用的就是,Prototype模式,即原型模式。否则,他需要再花费一些时间和工程师一点一点的探讨关于大楼的一些设计问题。
prototype模式(原型模式),是一个使得新对象不用使用构造器来创建对象的模式
* 试想如果你要创建一个新对象,实际上这个对象已经创建过了,我不想再调用它的构造器来创建
* 那我能不能从这个已创建的对象身上“克隆”新的对象呢?呵呵,这就是PROTOTYPE模式,这个
* 已创建的对象就称为原型。
在一个图形编辑器中,每一个图形元素,如线、圆、文字等都应该支持拷贝操作,即点中图形,按下Ctrl+C,再按下Ctrl+V后就会复制一个新的图形。显然这是一种clone操作。所以在每个从Graphic派生出的图形子类都应运用Prototype模式,加上Clone操作
16.对设计模式的理解,工厂模式的描述.
举例说明XX模式在项目中的实现过程。
每个模式都描述了一个我们在实际中不断出现的问题,然后描述该问题的解决方案的核心,通过这种方式你可以无数次使用那些已有的解决方案,无需重复相同的工作。主要用到了MVC的设计模式用来开发JSP/SERVLER的j2ee的相关应用。还有简单工厂模式
单例模式:单例模式作用是保证Java程序中,一个类class只有一个实例的存在
SPRING
Spring mvc是否是线程安全的
Spring的controller是singleton的,每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:我们不用每次创建controller,减少了对象创建和垃圾回收的时间。由于只有一个controller的instance,当多个线程调用它的时候,它里面的instance变量不是线程安全的。
Spring相关
IOC:Spring 的控制反转IOC降低了业务逻辑中各个类的依赖关系、
作用域:singleton(bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean。),
prototype,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例,相当一个new的操作
request,request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效。
session session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效,application
spring里的AOP:
AOP:面向切面编程。
AOP优势:1允许开发者使用声明式企业服务,比如事务服务器、安全性服务;EJB开发者都知道,EJB组件能够使用J2EE容器提供的声明式服务,但是这些服务要借助于EJB容器,而SPRING AOP却不需要EJB容器,借助于SPRING的事务抽象框架就可以这些服务。
2开着可以开发满足业务需求的自定义切面。
3.开发spring aop advice很方便。因为这些aop advice只是pojo类,借助SPRING提供的proxyFactoryBean,能够快速的搭建spring AOP Advice.
通知(Advice):用于告知系统将有哪些新的行为。
l 切入点(Pointcut):定义了通知应该在应用到那些连接点。
l 目标对象(Target):被通知的对象。
l 代理(Proxy):将通知应用到目标对象后创建的对象。
spring里面怎么配置单例bean,以及Bean的注入方式
spring 可以对定义的bean设置scope属性,配置单例就是把scope设置为singleton
bean的注入方式:1通过构造器注入2通过setter注入3通过接口注入
String
2.stringbuffer和stringbuiler区别
StringBuffer的长度是可变的,如果经常对字符串进行操作的话,使用StringBuffer,他是线程安全的。
StringBuilder 一般应该优先使用stringbuilder累,因为他支持stringbuffer所有的操作,还由于他不执行同步,所以速度更快
3.stringbuffer是怎么实现的
c.equal 用法,复杂对象equal是怎么用的
答:(是覆盖object对象的equal 没有覆盖就按object的equal来比的 object的equal是==来判断的 也就是指向同一个内存区域的就相等)
equals 是比较二个对象的属性值是否相等,==用于比较基本类型数值是否相等,及地址是否相等,可以这样回答
复杂OBJECT 中的EQUAL方法,通过多态来实现扩展自已所需要的需求
equals
equals方法对于普通的类是比较引用是否相等,和==效果一样
equals方法对于基础数据类型的包装类来说,他是比较的值,对于基本数据类型的包装类来说,使用“==”才是比较的引用
String这个类的equals方法比较特殊,它先比较引用,如果引用相等,那么返回值就是true,如果引用不相等,
那么再比较值,如果值相等,那么返回值也是true,只有当引用和值都不相等的情况下,返回的才是false
23.final关键字----例如:final关键字在java的用法,finally和finalize、
Final:是修饰符;如果一个类被声明为final,意味着他不再派生出新的子类,不能作为父类被继承,因此一个类不能即被声明为abstract,又被声明为final。将变量和方法声明为final,可以保证他们在使用过程中不会发生改变。被声明的final变量必须在声明时,付初始值,在以后的引用过程中,只能被读取,不能被修改;被final声明的方法也是只能被使用,不能重载
Finally:是异常处理语句中进行清理操作。在异常处理的最后执行
Finalize:方法名。是在垃圾回收器前将对象从内存中清理出去之前,做一些清理工作
STRUTS
15.struts1 和struts2的区别?
1) action方面:1的action必须继承抽象基类,而2不需要。
2) 线程方面:1的action必须是单利而且必须是线程安全的,因为一个action实例就要处理所有请求,而2的action为每个请求创建一个实例所以不存在线程安全的问题
3 )formbean,获取数据:1的formbean必须继承抽象基类,而且与JavaBean重复造成了一些重复的编写,2就不需要formbean, 直接包装其中,减少了重复的代码。
4.) servlet依赖性 1更依赖于servletAPI。
5.Struts1使用jstl表达式语言。Struts2支持jstl,同时支持更加强大的OGNL表达是语言
6.类型转换不一样:struts1的actionform通常都是String类型的,而struts2通过COMMons-beanutils实现类型转换
struts做表单验证:
struts1的标单验证一般有两种方式,一种是通过ActionForm的validate函数进行验证,另一种就是利用validate框架进行验证Validate函数验证 public ActionErrors alidate(ActionMapping mapping, HttpServletRequest request)
这个验证是 在客户端的ActionForm的public ActionErrors validate(ActionMapping mapping,HttpServletRequest request)方法中进行的,该函数通过对标单进行检验,返回一个ActionErrors的对象,如果这个对象为空就返回到输入页面中,并通过<html:errors/>标签进行错误的显示
struts-config.xml:这里主要是配置了一个Form和一个Action,注意validate="true"这是必须的。
HIBERNATE
Hibernate 延迟加载
延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。
Hibernate延迟加载技术包括实体对象的延迟加载(通过将class的lazy属性设置为true,来开启实体的延迟加载特性。)、集合类型的延迟加载等。我们在一对多关联中,定义的用来容纳关联对象的Set集合,并不是java.util.Set类型或其子类型,而是net.sf.hibernate.collection.Set类型,通过使用自定义集合类的实现,Hibernate实现了集合类型的延迟加载。为了对集合类型使用延迟加载,我们必须如下配置我们的实体类的关于关联的部分通过将<set>元素的lazy属性设置为true来开启集合类型的延迟加载特性。
数据库
13.数据库的事务,性能优化(比如索引,隔离,执行计划)。
1.用索引提高效率
2.选择最有效率的表明顺序(Oracle解析器是按照从右到左的顺序处理from后的表名,from中写在最后的表最先被执行)
3.Where子句的链接顺序,Oracle是采用自下往上的顺序解析where 子句,根据这个原理呢,表之间的连接条件应该写在最前面,那些可以过滤掉最大数据记录的条件必须写在最后面。
4.Select中避免使用*
5选择适合的Oracle优化器(RULE(基于规则的),COST(基于成本),CHOOSE(基于选择的)) 设置默认的优化器,可以通过对init.ora文件中的OPTIMIZER_MODE蚕食的各种声明来设置
6.删除重复数据
7.数据进行分区
8.用TRUNCATE代替DELETE
。。f.f.f.f.f.f.21.性能测试/优化
22,数据库锁
锁机制用于管理对共享资源的并发访问,有可能造成丢失修改、阻塞、死锁
悲观锁:只用于由状态或有连接环境,也就是说,你的应用于数据库有一条连续的链接,而且至少在事务生存期中只有你一个使用这条链接。
乐观锁:所有锁定都延迟到即将执行更新之前才做。换句话说,我们会修改屏幕上的信息而不要锁,我们很乐观,认为数据不会被其他用户修改。
锁有两种:排它锁(Exclusive locks 记
为X 锁)和共享锁(Share locks记为 S锁)。
排它锁:若事务T对数据D加X锁,则其它任何事务都不能再对D加任何类型的锁,
直至T 释放D 上的X 锁;一般要求在修改数据前要向该数据加排它锁,所以排它锁又称为写锁。
共享锁:若事务T对数据D加S 锁,则其它事务只能对D加 S锁,而不能加X 锁,直
至 T 释放 D 上的 S 锁;一般要求在读取数据前要向该数据加共享锁,所以共享锁又称为读锁。
Java基础知识
Java的异常分配?
DoGet doPost作用域修饰符?
AJAX会用哪个工具类,及其原理?
s
6.linux基本命令
root@localhost root]#shutdown –h now ← 要求系统立即关机
l 指定关机时间:time参数可指定关机的时间;或设置多久时间后运行shutdown命令,范例如下:
[root@localhost root]#shutdown now ← 立刻关机
[root@localhost root]#shutdown +5 ← 5分钟后关机
[root@localhost root]#shutdown 10:30 ← 在10:30时关机
关机后自动重启:-rl 参数设置关机后重新启动。范例如下:
[root@localhost root]#shutdown -r now ← 立刻关闭系统并重启
[root@localhost root]#shutdown -r 23:59 ← 指定在23:59时重启动
ls(list)命令是非常有用的命令,用来显示当前目录中的文件和子目录列表。配合参数的使用,能以不同的方式显示目录内容。
切换目录的cd命令
创建目录的mkdir命令
删除目录的rmdir命令
cp data1.txt data2.txt 复制
rm 删除目录或者文件
cat 显示文件内容
mv 移动文件
pwd显示当前所在文件夹
7.分页怎么实现
一般两种,一种是通过Java代码进行分页,通过hibernate也可以,在代码中计算,从数据库中获取当前页数据。
另一种比较常用,效率也更好,java代码中不作分页的实现代码直观从数据库中取出数据返回到页面,数据分页功能交给数据库做,Java代码中只做总页数的计算
18Java 内存
Java 把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。
堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。
1.system.gc调用后是否立即进行垃圾回收.
调用system.gc只是告诉虚拟机要回收,但是什么时候回收是虚拟机说了算,一般等到内存快不够用了才回收。不同的虚拟机有不同的策略
8.java什么时候可能产生内存溢出
1.在数据量过于庞大;死循环;静态变量和静态方法过多;无法确定是否被引用对象
2.虚拟机不回收内存
3.程序运行要用到的内存大于虚拟机可以提供的最大量时就会内存溢出
解决方案:
1优化代码,如果业务庞大,逻辑复杂,尽量少用全局变量的引用。在程序使用完变量的时候释放资源让垃圾回收器回收
2.增加物理内存。修改容器的内存大小
29JVM垃圾收集,字符串拼接,java代理
9.classloader的了解
Classloader和他的子类实现了JVM中类的装载,他是一个Java运行时系统组件。它负责在运行时查找和装入类文件的类
11.单点登录怎么实现?
1.首先要建立起A系统中用户和其他用户的关联关系并且保存、可以保存在表中或者文件系统中。
2,考虑到这些系统的之间的数据同步问题比较好的方式是找到用户在这些系统中都存在的唯一信息(比如员工号,EMAIL地址啊,姓名啊等等),通过唯一的信息实时到各个系统中去取认证所需要的信息。
3.然后通过URL传参的方式,访问目标系统,为了提高安全性,要对参数进行加密。
12.处理话单怎么实现的? (采用双向队列,读文件到内存中,对实现的具体细节)
17Java 反射
Java反射机制,是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用他的任意一个方法。这种动态获取信息,以及动态调用对象的属性方法的机制,叫做Java反射机制
Java反射机制主要提供了以下功能:在运行时判断任意一个对象所属的类,在运行时构造任意一个类的对象,在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
19Java文件读写
14.java的多线程?
多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口。
20.线程同步
同步的实现方面有两种,分别是synchronized, WAIT与notify
27java基础概念,异常体系,hashmap原理
Java是面向对象语言,健壮,多线程,结构中立,跨平台
10.jms和jgroup区别
jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API。
30J2EE的知识面,如对JMS,webservice的了解。
Webservice接口流程 ?
在构建和使用Web Service时,主要用到以下几个关键的技术和规则:
1.XML:描述数据的标准方法.
2.SOAP:表示信息交换的协议.
3.WSDL:Web服务描述语言.
4.UDDI(Universal Description, Discovery and Integration):通用描述、发现与集成,它是一种独立于平台的,基于XML语言的用于在互联网上描述商务的协议。
a、广告系统
现在有一个广告系统,每天广告系统的访问量很大,每当用户点击一个广告时,需要记录广告的访问时间和每个IP每日访问次数,请给出系统优化方案?说得越多越好。
为表按照时间创建rang分区
然后在每个分区的时间上建索引在
b、数据优化
现在有一张3000万用户数据的积分表,每年的1月1日0时需要对用户积分进行清零操作,而积分数据时时更新的,在不影响当然用户系统使用情况下,进行清零操作,请问你将如何设计系统?
给表增加个字段,清零时间
1.首先写一个定时任务。Quartz
2.通过这个quartz,调用数据库的JOB
3.JOB调用已经编写好的存储过程,这个存储过程分批的进行清零操作,清零后,将清零时间字段改为当前年份,对一些用户正在操作的记录,跳过并执行下一条,当可以执行的记录都清零完毕后,再回头来对清零日期不是今年的数据进行清零操作,如此循环。
d.-Xms128m -Xmx512m -Xms是干什么用的 -Xmx是干什么用的 原理
答:最大最小JVM内存空间大小不小,如果大于最大,会导致MYECLIPSE自动跳掉
24Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
ArrayList内部数据结构
ArrayList和Vector都是LIST的具体实现,他们都是采用数组方式存储数据,此数组的元素数量大于实际存储的数据以便增加和插入元素,允许直接按序号索引元素,但是插入元素要设计数据元素移动等内存操作,所以ArrayList索引速度比较快,但是插入数据比较慢
VECOTR 由于是线程安全的,所以性能上要比ARRAYLIST要差一点,。
LINKEDLIST:使用双向链表实现存储,按序号索引需要前向或后巷进行遍历,所以索引速度慢,插入速度快
e.讲讲集合框架的体系 list 和 set有什么区别
答:(问的很深) COLLECTION是最基本的集合接口,一个COLLECTION代表一组OBJECT,即COLLECTION的元素(ELEMENTS),一些可以排序,而另外一些不行。比如LIST。
一些允许有重复元素,另一些不行,比如SET不可以有重复,比如任意两个元素A1,A2 他们俩通过equals比较的结果是false,并且set只能有一个null元素
你要是回答 set 不可以放重复的对象 list不能放 他会问你 set放对象的时候根据什么判断是否是重复的
HASHSET中是采用比较hashcode的方式判断是否重复
使用TREESET构造类的函数。使用compareto方法判断元素是否相同的
区别:同: 都实现了Collection接口
不同:
list 可以重复,
set 不可重复,采用抛弃的思想(MAP采用覆盖的思想)
通过HASH码来唯一区别
Map接口
请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
25Map
├Hashtable
├HashMap
└WeakHashMap
4.hashtable和hashmap有什么区别
两者都实现了MAP接口
主要区别在于:1。hashmap没有排序,允许一个null键和多个null值,hashtable不允许。
2.hashtable继承Dectionary类,hashmap是Map接口的实现。
3.Hashtable的方法是同步的,多个线程访问hashtable时不需要自己为他的方法实现同步,而hashmap则需要给他的方法实现。
他们的性能都是采用的hash/rehash算法大致一样,所以性能相差无几
展开阅读全文