首页 > 代码库 > java面试题03

java面试题03

1.web开发

1)简述servlet的生命周期

Servlet 生命周期:Servlet 加载--->实例化--->处理请求--->销毁。

init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。

Service():它是Servlet的核心,负责处理客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的doGet或doPost功能。

Destroy(): 仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。

2session的使用:servlet中创建、销毁session的语句,如何从session中取值

      创建Session: HttpSession session=reqest.getSession();

   销毁Session:session.invalidate();

      获取session中的值:session.getAttribute(String name);返回值是Object类型。

3)简述过滤器filter和监听器Listener的区别

Filter(过滤器)

它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

filter功能:

在HttpServletRequest到达 Servlet 之前,拦截客户的HttpServletRequest 。根据需要检查HttpServletRequest,也可以修改HttpServletRequest 头和数据。

在HttpServletResponse到达客户端之前,拦截HttpServletResponse 。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

监听器:

监听器实际上是一个类,这个类实现了特定的接口,然后将这个类在 web.xml 文件中进行描述,这样服务器在启动的时候就可以实例化这个类,启动监听器。当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。

功能:

统计在线人数和在线用户;系统加载时进行信息的初始化工作;统计网站的访问量;跟Spring结合

2.java基础

1)说明hashSethashMap的关系

hashSet实现了set接口,存储对象唯一、无序,存储的元素是无序排列的,是一个非线程安全的,且允许有值为null;

hashMap实现了Map集合,以键-值(key-value)对形式存储元素,其中key不要求有序,但是不能重复,而value不要求有序但是可以重复;

2)说明hashMaphashTable的区别,如何将hashMap编程线程同步

区别:HashMap继承了AbstractMap,hashTable继承了Dictionary类,两这都实现了Set接口; HashMap是非线程安全的,hashTable是线程安全的;HashMap的方法不是Synchronize的,多线程访问时需要提供外部同步方法,HashTable的方法是Synchronize;HashMap允许有Null的键和值,HashTable不允许有null的键和值;HashMap的效率比HashTable的效率高一点;HashMap有containsvalue和containsKey方法,HashTable有contains方法。

HashMap线程同步

Map map = Collections.synchronizedMap(new HashMap());

3publicprivatestaticfinal使用场景的阐述

public和private是访问权限修饰符,用于控制外界对类内部成员的访问。

public:表明对象成员是完全共有的,外界可以随意访问。

private:表明对象成员是完全私有的,不容许外界的任何访问,只有本类可以访问,外界可以通过本类提供的set/get方法访问。

static和final是控制类成员变化的修饰符

static:修饰的方法或变量属于类,被所有的类对共享,只在类被加载的时候执行一次,非静态方法可以直接访问静态方法以及非静态方法。静态方法不可以直接访问非静态方法;

final:使用final关键字可以声明类、成员变量和成员方法,一经声明,便不可继承、不可修改和不能覆盖。修饰方法时表示方法不能被重写;修饰属性时表示属性不能被改变,这里属性又分为对象和基本类型,修饰基本类型表示基本类型赋值以后不能再被赋值,修饰对象表示这个属性不能再指向其他对象(引用不变),但是他指向的这个对象本身还是可以被改变的。

3.前端开发------ajax的原理说明

Ajax的工作原理相当于在用户和服务器之间加了—个中间层(AJAX引擎), 通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。这其中最关键的一步就是从服务器获得请求数据,使用户操作与服务器响应异步化。

XMLHttpRequest是ajax的核心机制,它是在IE5中首先引入的,是一种支持异步请求的技术。简单的说,也就是javascript可以及时向服务器提出请求和处理响应,而不阻塞用户。达到无刷新的效果。

XMLHttpRequest属性介绍

onreadystatechange  每次状态改变所触发事件的事件处理程序。

responseText     从服务器进程返回数据的字符串形式。

responseXML    从服务器进程返回的DOM兼容的文档数据对象。

status           从服务器返回的数字代码,比如常见的404(未找到)和200(已就绪)

status Text       伴随状态码的字符串信息

readyState       对象状态值

0 (未初始化) 对象已建立,但是尚未初始化(尚未调用open方法)

1 (初始化) 对象已建立,尚未调用send方法

2 (发送数据) send方法已调用,但是当前的状态及http头未知

3 (数据传送中) 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误,

4 (完成) 数据接收完毕,此时可以通过通过responseXml和responseText获取完整的回应数据

代码编写:

function CreateXmlHttp() {

    //非IE浏览器创建XmlHttpRequest对象
    if (window.XmlHttpRequest) {
        xmlhttp = new XmlHttpRequest();
    }

    //IE浏览器创建XmlHttpRequest对象
    if (window.ActiveXObject) {
        try {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (e) {
            try {
                xmlhttp = new ActiveXObject("msxml2.XMLHTTP");
            }
            catch (ex) { }
        }
    }
}

function Ustbwuyi() {

    var data = http://www.mamicode.com/document.getElementById("username").value;
    CreateXmlHttp();
    if (!xmlhttp) {
        alert("创建xmlhttp对象异常!");
        return false;
    }

    xmlhttp.open("POST", url, false);

    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 4) {
            document.getElementById("user1").innerHTML = "数据正在加载...";
            if (xmlhttp.status == 200) {
                document.write(xmlhttp.responseText);
            }
        }
    }
    xmlhttp.send();
}

4.DB数据库

(场景一)存在一张表A,其中有一个字段col,存储的值为A,B,C,D;要求查处A表中的记录,将colA的显示为OKB的显示为NO,其他的显示为OTHER,写出sql语句

select decode(col,A,OK,B,NO,OTHER)

from A;

(场景二)存在两张表P,CC表中有number类型的字段名字为valueP为父表,C为子表,PC的关系是1n

要求:查询出父表的记录个数(条件:对应的子表中的value>300);写出sql语句

select count(0)

from P p,C c

 where c.value>300;

5.开源框架

1Hibernate中的session close问题的根源和解决方案;

Hibernate的OpenCurrentSession在commit或者rollback后会自动关闭session;

解决方法采用OpenSesionInView模式;确保用户的每一次请求都保持一个session打开

2)描述Spring的事务机制,并说出实现原理?

事务最重要的两个特性,是事务的传播级别和数据隔离级别。传播级别定义的是事务的控制范围,事务隔离级别定义的是事务在数据库读写方面的控制范围。

事务的7种传播级别:

a. PROPAGATION_REQUIRED ,默认的spring事务传播级别,使用该级别的特点是,如果上下文中已经存在事务,那么就加入到事务中执行,如果当前上下文中不存在事务,则新建事务执行。

b.PROPAGATION_SUPPORTS ,该传播级别的特点是,如果上下文存在事务,则支持事务加入事务,如果没有事务,则使用非事务的方式执行。所以说,并非所有的包在transactionTemplate.execute中的代码都会有事务支持。这个通常是用来处理那些并非原子性的非核心业务逻辑操作。应用场景较少。

c.PROPAGATION_MANDATORY , 该级别的事务要求上下文中必须要存在事务,否则就会抛出异常!配置该方式的传播级别是有效的控制上下文调用代码遗漏添加事务控制的保证手段。d.PROPAGATION_REQUIRES_NEW ,该传播级别的特点是,每次都会新建一个事务,并且同时将上下文中的事务挂起,执行当前新建事务完成以后,上下文事务恢复再执行。

e.PROPAGATION_NOT_SUPPORTED ,当前级别的特点就是上下文中存在事务,则挂起事务,执行当前逻辑,结束后恢复上下文的事务。

f.PROPAGATION_NEVER ,该事务更严格,上面一个事务传播级别只是不支持而已,有事务就挂起,而PROPAGATION_NEVER传播级别要求上下文中不能存在事务,一旦有事务,就抛出runtime异常,强制停止执行!

g.PROPAGATION_NESTED ,字面也可知道,nested,嵌套级别事务。该传播级别特征是,如果上下文中存在事务,则嵌套事务执行,如果不存在事务,则新建事务。

数据隔离级别分为不同的四种:

a.Serializable :最严格的级别,事务串行执行,资源消耗最大;

b.REPEATABLE READ :保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。

c.READ COMMITTED :大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。

d.Read Uncommitted :保证了读取过程中不会读取到非法数据。

实现原理:

Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。

    DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问 时,DataSource实际为SessionFactory,TransactionManager的实现为 HibernateTransactionManager。

根据代理机制的不同,Spring事务的配置又有几种不同的方式:

第一种方式:每个Bean都有一个代理

 第二种方式:所有Bean共享一个代理基类

第三种方式:使用拦截器

第四种方式:使用tx标签配置的拦截器

第五种方式:全注解

3)使用Struts2完成一个Login处理:参数如何接收?view层的校验如何做?业务层的校验如何做,阐述处理过程

参数接受:

      Action类参数接受方法:

(1)属性接收:直接通过

(2)JavaBean接受:通过声明对象,接受页面传递的参数

(3)通过实现ModelDriven接口:重写getModel方法,获得参数对象

View层的校验

View层可以采用js获取用户输入的内容,验证合理后再提交否则给出提示;或者采用Jquery异步验证。

业务层的校验

业务层验证使用验证框架,Action类继承ActionSupport

可以重写Validate()方法,采用全局验证;也可以写一个validateLogin()方法;对特定的login方法进行验证。

6.面向对象

用面向对象中的概念,解释以下事物

木材,桌子,椅子,桌子腿,办公室门口的桌子,方形椅子

木材面向对象中的接口;

桌子、椅子实现了木材接口的类;

桌子腿是桌子类中的属性;

办公室门口的桌子是桌子类的对象;

圆形椅子是椅子类中的内部类

7.[分析]Hibernate的使用场景:

DB5条主键不同的记录,DAO层通过Hibernate将这5条记录构造为对应的pojo返回给控制层,控制层将这5pojo重新组装为HashSet对象返回给视图层进行显示时,发现页面只显示了3条记录,你觉得可能是什么原因导致的呢?

      HashSet集合存储的是唯一,无序的对象集合;存储的对象不允许重复,但是允许为空,且判断是否重复采用的是equals判断两者之间的值是否相同。

出现上述情况可能是:可能是因为存储的记录的值有两个相同;或者是因为存储的是null值;

8.工作一周后,项目经理分配任务给你,任务的内容是为某个已有的模块加新一个**功能,预计你两天后交工,但实际执行过程中你一天就把任务完成了,剩下一天你打算如何安排呢?

 

9.曾经的工作中哪个项目收获最大?收获是什么?你在其中担当什么样的角色?你在该项目中,做的那件事自己比较清楚?详述

 

10.简要谈谈你最近学习的新技术

 

java面试题03