java web 面试题


中关村软件园人才基地研发部 中关村软件园人才基地 面试宝典 部门:中关村软件园人才基地研发部 目录 一. html&JavaScript&ajax 部分.........................................................................................- 2 - 1. 判断第二个日期比第一个日期大..........................................................................- 2 - 2. 用 table 显示 n 条记录,每 3 行换一次颜色,即 1,2,3 用红色字体,4,5, 6 用绿色字体,7,8,9 用红颜色字体。................................................................- 3 - 3.HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提 示用户并终止提交?.....................................................................................................- 4 - 4.请写出用于校验 HTML 文本框中输入的内容全部为数字的 javascript 代码....- 4 - 5. 说说你用过那些 ajax 技术和框架,说说它们的区别........................................- 5 - 二. 数据库部分.....................................................................................................................- 5 - 1.根据部门号从高到低,工资从低到高列出每个员工的信息。............................- 5 - 2.列出各个部门中工资高于本部门的平均工资的员工数和部门号,并按部门号排序 ........................................................................................................................................- 5 - 3. 存储过程与触发器必须讲,经常被面试到?........................................................- 6 - 4.数据库三范式是什么?..............................................................................................- 7 - 5.说出一些数据库优化方面的经验?..........................................................................- 7 - 6.union 和 union all 有什么不同?..............................................................................- 8 - 中关村软件园人才培训基地 - 1 - 7.分页语句..................................................................................................................- 10 - 8.用一条 SQL 语句 查询出每门课都大于 80 分的学生姓名 ..............................- 10 - 9.所有部门之间的比赛组合......................................................................................- 11 - 10.统计每年每月的信息............................................................................................- 11 - 11.显示文章标题,发帖人、最后回复时间...........................................................- 12 - 13.一个用户表中有一个积分字段,假如数据库中有 100 多万个用户,若要在每年 第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决?......................- 13 - 14. xxx 公司的 sql 面试............................................................................................- 14 - 三、jdbc..............................................................................................................................- 15 - 15.注册 Jdbc 驱动程序的三种方式.........................................................................- 15 - 1、DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());......- 15 - 16.用 JDBC 如何调用存储过程...............................................................................- 15 - 17.JDBC 中的 PreparedStatement 相比 Statement 的好处...............................- 16 - 18. 写一个用 jdbc 连接并访问 oracle 数据的程序代码.......................................- 17 - 19.Class.forName 的作用?为什么要用?................................................................- 17 - 20.大数据量下的分页解决方法。............................................................................- 18 - 21.用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大).............- 18 - 22.这段代码有什么不足之处?.................................................................................- 19 - 23.说出数据连接池的工作机制是什么?.................................................................- 19 - 24.为什么要用 ORM? 和 JDBC 有何不一样?..................................................- 20 - 三.Java web 部分.............................................................................................................- 20 - 1.Tomcat 的优化经验................................................................................................- 20 - 2.HTTP 请求的 GET 与 POST 方式的区别...........................................................- 21 - 3.解释一下什么是 servlet;........................................................................................- 22 - 4.说一说 Servlet 的生命周期?.................................................................................- 22 - 5.Servlet 的基本架构.................................................................................................- 22 - 6.SERVLETAPI 中 forward() 与 redirect()的区别?...........................................- 23 - 7.什么情况下调用 doGet()和 doPost()?...............................................................- 23 - 8.Request 对象的主要方法:..................................................................................- 23 - 9.forward 和 redirect 的区别...................................................................................- 24 - 10.request.getAttribute()和 request.getParameter() 有何区别?......................- 24 - 11. jsp 有哪些内置对象?作用分别是什么? 分别有什么方法?.........................- 24 - 12. jsp 有哪些动作?作用分别是什么?....................................................................- 26 - 13.JSP 的常用指令...................................................................................................- 26 - 14.JSP 中动态 INCLUDE 与静态 INCLUDE 的区别?.......................................- 26 - 15.两种跳转方式分别是什么?有什么区别?...........................................................- 27 - 16.页面间对象传递的方法........................................................................................- 27 - 17.JSP 和 Servlet 有哪些相同点和不同点,他们之间的联系是什么?............- 27 - 18.MVC 的各个部分都有那些技术来实现?如何实现?.........................................- 27 - 19.我们在 web 应用开发过程中经常遇到输出某种编码的字符,如 iso8859-1 等, 如何输出一个某种编码的字符串?.........................................................................- 27 - 四. 实际项目开发..............................................................................................................- 28 - 1.在 eclipse 中调试时,怎样查看一个变量的值?...............................................- 28 - 2.你们公司使用的代码配置管理工具是什么?......................................................- 28 - 中关村软件园人才培训基地 - 2 - 3.你们的项目总金额多少,多少人开发,总共花了多少个月?.........................- 28 - 一. html&JavaScript&ajax 部分 1. 判断第二个日期比第一个日期大 如何用脚本判断用户输入的的字符串是下面的时间格式 2004-11-21 必须要 保证用户的输入是此格式,并且是时间,比如说月份不大于 12 等等,另外我需 要用户输入两个,并且后一个要比前一个晚,只允许用 JAVASCRIPT,请详细 帮助作答,, //这里可用正则表达式判断提前判断一下格式,然后按下提取各时间字段内容
2. 用 table 显示 n 条记录,每 3 行换一次颜色,即 1,2,3 用红色 字体,4,5,6 用绿色字体,7,8,9 用红颜色字体。
1
2
3
4
5
6
7
8
9
10
3.HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交?
4. 请 写 出 用 于 校 验 HTML 文本框中输入的内容全部为数字 的 javascript 代码 除了写完代码,还应该在网页上写出实验步骤和在代码中加入实现思路,让面试 官一看就明白你的意图和检查你的结果。 5.说说你用过那些 ajax 技术和框架,说说它们的区别 二. 数据库部分 1.根据部门号从高到低,工资从低到高列出每个员工的信息。 select * from employees order by department_id desc,salary 2.列出各个部门中工资高于本部门的平均工资的员工数和部门号,并 按部门号排序 select ta.department_id,count(*) from employees ta, (select department_id,avg(salary) avgsal from employees group by department_id) tb where ta.department_id=tb.department_id and ta.salary>tb.avgsal group by ta.department_id order by ta.department_id 中关村软件园人才培训基地 - 6 - 3.存储过程与触发器必须讲,经常被面试到? 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的 SQL 语 句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过 程带有参数)来执行它。 创建存储过程的语法: create or replace procedure test_p3(v_id in integer) as v_id1 integer := v_id; Begin xxx end; 调用: 调用存储过程: declare v_name varchar2(20); v_password varchar2(20); begin test_p3(5, v_name, v_password); xxx end; 触发器:类似于 java 中监听器,当某一个动作发生则会被触发,进而运行相应的动作。 触发器分为行级触发器和表级触发器两种,触发器发生的时机有两种,分别在动作之前和动 作之后。当在数据库中有 insert,update 或者 delete 操作的时候,会触发相应的事件。 创建表级触发器: create or replace trigger tri13 before insert on users begin dbms_output.put_line('before insert users'); end; 创建行级触发器: 创建行级触发器 create or replace trigger tri13row after delete on users for each row begin dbms_output.put_line('after insert users'||'old:'||:old.id); end; 测试: begin delete from users where id=5; delete from users where id=6; --commit; end; 中关村软件园人才培训基地 - 7 - 4.数据库三范式是什么? 第一范式(1NF):字段具有原子性,不可再分。所有关系型数据库系统都满足第 一范式) 数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓 和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和 名,必须设计成两个独立的字段。 第二范式(2NF): 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式 (2NF)必须先满足第一范式(1NF)。 要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个 列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。 第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能 存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一 部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为 实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第 二范式就是非主属性非部分依赖于主关键字。 第三范式的要求如下: 满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF) 要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。 所以第三范式具有如下特征: 1,每一列只有一个值 2,每一行都能区分。 3,每一个表都不包含其他表已经包含的非主关键字信息。 例如,帖子表中只能出现发帖人的 id,而不能出现发帖人的 id,还同时出现发帖 人姓名,否则,只要出现同一发帖人 id 的所有记录,它们中的姓名部分都必须 严格保持一致,这就是数据冗余。 5.说出一些数据库优化方面的经验? 用 PreparedStatement 一般来说比 Statement 性能高:一个 sql 发给服务器去 执行,涉及步骤:语法检查、语义分析, 编译,缓存 “inert into user values(1,1,1)”-二进制 “inert into user values(2,2,2)”-二进制 “inert into user values(?,?,?)”-二进制 中关村软件园人才培训基地 - 8 - 有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在 设计数据库时就去掉外键。(比喻:就好比免检产品,就是为了提高效率,充分 相信产品的制造商) (对于 hibernate 来说,就应该有一个变化:empleyee->Deptment 对象,现在 设计时就成了 employeedeptid) 看 mysql 帮助文档子查询章节的最后部分,例如,根据扫描的原理,下面的 子查询语句要比第二条关联查询的效率高: 1. select e.name,e.salary where e.managerid=(select id from employee where name='zxx'); 2. select e.name,e.salary,m.name,m.salary from employees e,employees m where e.managerid = m.id and m.name='zxx'; 表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等 将姓名和密码单独从用户表中独立出来。这可以是非常好的一对一的案例哟! sql 语句全部大写,特别是列名和表名都大写。特别是 sql 命令的缓存功能,更 加需要统一大小写,sql 语句发给 oracle 服务器语法检查和编译成为内部指 令  缓存和执行指令。根据缓存的特点,不要拼凑条件,而是用 ? 和 PreparedStatment 还有索引对查询性能的改进也是值得关注的。 备注:下面是关于性能的讨论举例 4 航班 3 个城市 m*n select * from flight,city where flight.startcityid=city.cityid and city.name='beijing'; m + n select * from flight where startcityid = (select cityid from city where cityname='beijing'); select flight.id,'beijing',flight.flightTime from flight where startcityid = (select cityid from city where cityname='beijing') 6.union 和 union all 有什么不同? 假设我们有一个表 Student,包括以下字段与数据: drop table student; create table student ( id int primary key, name nvarchar2(50) not null, 中关村软件园人才培训基地 - 9 - score number not null ); insert into student values(1,'Aaron',78); insert into student values(2,'Bill',76); insert into student values(3,'Cindy',89); insert into student values(4,'Damon',90); insert into student values(5,'Ella',73); insert into student values(6,'Frado',61); insert into student values(7,'Gill',99); insert into student values(8,'Hellen',56); insert into student values(9,'Ivan',93); insert into student values(10,'Jay',90); commit; Union 和 Union All 的区别。 select * from student where id < 4 union select * from student where id > 2 and id < 6 结果将是 1 Aaron 78 2 Bill 76 3 Cindy 89 4 Damon 90 5 Ella 73 如果换成 Union All 连接两个结果集,则返回结果是: 1 Aaron 78 2 Bill 76 3 Cindy 89 3 Cindy 89 4 Damon 90 5 Ella 73 可以看到,Union 和 Union All 的区别之一在于对重复结果的处理。 UNION 在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生 的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会 中关村软件园人才培训基地 - 10 - 产生重复的记录,最常见的是过程表与历史表 UNION。如: select * from gc_dfys union select * from ls_jg_dfys 这个 SQL 在运行时先取出两个表的结果,再用排序空间进行排序删除重复 的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。 而 UNIONALL 只是简单的将两个结果合并后就返回。这样,如果返回的两个 结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。 从效率上说,UNIONALL 要比 UNION 快很多,所以,如果可以确认合并的 两个结果集中不包含重复的数据的话,那么就使用 UNIONALL 7.分页语句 取出 sql 表中第 31 到 40 的记录(以自动增长 ID 为主键) sql server 方案 1: select top 10 * from t where id not in (select top 30 id from t order by id ) orde by id sql server 方案 2: select top 10 * from t where id in (select top 40 id from t order by id) order by id desc mysql 方案:select * from t order by id limit 30,10 oracle 方案:select t1.* from (select e.*,rownum rn from employees e where rownum < 40) t1 where rn > 31 8.用一条 SQL 语句 查询出每门课都大于 80 分的学生姓名 name kecheng fenshu 张三 语文 81 张三 数学 75 李四 语文 76 李四 数学 90 王五 语文 81 王五 数学 100 王五 英语 90 准备数据的 sql 代码: 中关村软件园人才培训基地 - 11 - create table score(id int primary key auto_increment,name varchar(20),subject varchar(20),score int); insert into score values (null,'张三','语文',81), (null,'张三','数学',75), (null,'李四','语文',76), (null,'李四','数学',90), (null,'王五','语文',81), (null,'王五','数学',100), (null,'王五 ','英语',90); 提示:当百思不得其解时,请理想思维,把小变成大做,把大变成小做, 答案: A: select distinct name from score where name not in (select distinct name from score where score<=80) B:select distince name t1 from score where 80< all (select score from score where name=t1); 9.所有部门之间的比赛组合 一个叫 department 的表,里面只有一个字段 name,一共有 4 条纪录,分别是 a,b,c,d,对应四个球对,现在四个球对进行比赛,用一条 sql 语句显示所有可能的 比赛组合. 答:select a.name, b.name from department a, department b where a.name < b.name 10.统计每年每月的信息 year month amount 1991 1 1.1 1991 2 1.2 1991 3 1.3 1991 4 1.4 1992 1 2.1 1992 2 2.2 1992 3 2.3 中关村软件园人才培训基地 - 12 - 1992 4 2.4 查成这样一个结果 year m1 m2 m3 m4 1991 1.1 1.2 1.3 1.4 1992 2.1 2.2 2.3 2.4 提示:这个与工资条非常类似,与学生的科目成绩也很相似。 准备 sql 语句: drop table if exists sales; create table sales(id int auto_increment primary key,year varchar(10), month varchar(10), amount float(2,1)); insert into sales values (null,'1991','1',1.1), (null,'1991','2',1.2), (null,'1991','3',1.3), (null,'1991','4',1.4), (null,'1992','1',2.1), (null,'1992','2',2.2), (null,'1992','3',2.3), (null,'1992','4',2.4); 答案一、 select sales.year , (select t.amount from sales t where t.month='1' and t.year= sales.year) '1', (select t.amount from sales t where t.month='1' and t.year= sales.year) '2', (select t.amount from sales t where t.month='1' and t.year= sales.year) '3', (select t.amount from sales t where t.month='1' and t.year= sales.year) as '4' from sales group by year; 11.显示文章标题,发帖人、最后回复时间 表:id,title,postuser,postdate,parentid 准备 sql 语句: drop table if exists articles; create table articles(id int auto_increment primary key,title varchar(50), postuser varchar(10), postdate datetime,parentid int references articles(id)); insert into articles values (null,'第一条','张三','1998-10-10 12:32:32',null), (null,'第二条','张三','1998-10-10 12:34:32',null), (null,'第一条回复 1','李四','1998-10-10 12:35:32',1), 中关村软件园人才培训基地 - 13 - (null,'第二条回复 1','李四','1998-10-10 12:36:32',2), (null,'第一条回复 2','王五','1998-10-10 12:37:32',1), (null,'第一条回复 3','李四','1998-10-10 12:38:32',1), (null,'第二条回复 2','李四','1998-10-10 12:39:32',2), (null,'第一条回复 4','王五','1998-10-10 12:39:40',1); 答案: select a.title,a.postuser, (select max(postdate) from articles where parentid=a.id) reply from articles a where a.parentid is null; 注释:子查询可以用在选择列中,也可用于 where 的比较条件中,还可以用于 from 从句中。 13.一个用户表中有一个积分字段,假如数据库中有 100 多万个用户, 若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法 解决? alter table drop column score; alter table add colunm score int; 可能会很快,但是需要试验,试验不能拿真实的环境来操刀,并且要注意, 这样的操作时无法回滚的,在我的印象中,只有 insert update delete 等 DML 语 句才能回滚, 对于 create table,drop table ,alter table 等 DDL 语句是不能回滚。 解决方案一,update user set score=0; 解决方案二,假设上面的代码要执行好长时间,超出我们的容忍范围,那我就 alter table user drop column score;alter table user add column score int。 下面代码实现每年的那个凌晨时刻进行清零。 Runnable runnable = new Runnable(){ public void run(){ clearDb(); schedule(this,new Date(new Date().getYear()+1,0,0)); } }; schedule(runnable, new Date(new Date().getYear()+1,0,1)); 中关村软件园人才培训基地 - 14 - 14. xxx 公司的 sql 面试 Table EMPLOYEES Structure: EMPLOYEE_IDNUMBER Primary Key, FIRST_NAME VARCHAR2(25), LAST_NAME VARCHAR2(25), Salary number(8,2), HiredDate DATE, Departmentid number(2) Table Departments Structure: Departmentid number(2) Primary Key, DepartmentName VARCHAR2(25). (2)基于上述 EMPLOYEES 表写出查询:写出雇用日期在今年的,或者工资在 [1000,2000]之间的,或者员工姓名(last_name)以’Obama’打头的所有员工, 列出这些员工的全部个人信息。(4 分) select * from employees where to_char(hire_date,’yyyy’) = to_char(sysdate,’yyyy’) or (salary between 1000 and 200) or list_name like ‘Obama*’ (3) 基于上述 EMPLOYEES 表写出查询:查出部门平均工资大于 1800 元的部 门的所有员工,列出这些员工的全部个人信息。(4 分) select t1.* from employees t1 left join ( select t1.* from( select avg(salary) a,department_id from employees group by department_id) t1 where a > 1800) t2 on t1.department_id = t2.department_id (4) 基于上述 EMPLOYEES 表写出查询:查出个人工资高于其所在部门平均工 资的员工,列出这些员工的全部个人信息及该员工工资高出部门平均工资百分 比。(5 分) select employee1.*,(employee1.salary-t.avgSalary)*100/employee1.salary from employee1, (select deptid,avg(salary) avgSalary from employee1 group by deptid) as t where employee1.deptid = t.deptid and employee1.salary>t.avgSalary; 中关村软件园人才培训基地 - 15 - 三、jdbc 15.注册 Jdbc 驱动程序的三种方式 1、DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); 2、System.setProperty("jdbc.drivers","oracle.jdbc.driver.OracleDriver"); 3、Class.forName("oracle.jdbc.driver.OracleDriver"); 16.用 JDBC 如何调用存储过程 代码如下: package com.huawei.interview.lym; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Types; public class JdbcTest { /** *@param args */ public static void main(String[] args) { //TODO Auto-generated method stub Connection cn = null; CallableStatement cstmt = null; try { //这里最好不要这么干,因为驱动名写死在程序中了 Class.forName("com.mysql.jdbc.Driver"); //实际项目中,这里应用DataSource数据,如果用框架, //这个数据源不需要我们编码创建,我们只需Datasource ds = context.lookup() //cn = ds.getConnection(); cn = DriverManager.getConnection("jdbc:mysql:///test","root","root"); 中关村软件园人才培训基地 - 16 - cstmt = cn.prepareCall("{call insert_Student(?,?,?)}"); cstmt.registerOutParameter(3,Types.INTEGER); cstmt.setString(1, "wangwu"); cstmt.setInt(2, 25); cstmt.execute(); //get第几个,不同的数据库不一样,建议不写 System.out.println(cstmt.getString(3)); } catch (Exception e) { //TODO Auto-generated catch block e.printStackTrace(); } finally { /*try{cstmt.close();}catch(Exception e){} try{cn.close();}catch(Exception e){}*/ try { if(cstmt != null) cstmt.close(); if(cn != null) cn.close(); } catch (SQLException e) { //TODO Auto-generated catch block e.printStackTrace(); } } } 17.JDBC 中的 PreparedStatement 相比 Statement 的好处 答:一个 sql 命令发给服务器去执行的步骤为:语法检查,语义分析,编译成内 部指令,缓存指令,执行指令等过程。 select * from student where id =3----缓存--xxxxx 二进制命令 select * from student where id =3----直接取-xxxxx 二进制命令 select * from student where id =4--- -会怎么干? 如果当初是 select * from student where id =?--- -又会怎么干? 上面说的是性能提高 可以防止 sql 注入。 中关村软件园人才培训基地 - 17 - 18.写一个用 jdbc 连接并访问 oracle 数据的程序代码 Connection cn = null; PreparedStatement pstmt =null; Resultset rs = null; try { Class.forname(“oracle.jdbc.driver.OracleDriver”); cn = DriverManager.getConnection(“jdbc:oracle:thin:@loaclhost:1521:”,username,p assword); pstmt = cn.prepareStatement(“select score.* from score sco left join student stu on sco.sid= stu.id where stu.name = ?”); pstmt.setString(1,studentName); Resultset rs = pstmt.executeQuery(); while(rs.next()) { system.out.println(rs.getInt(“subject”) + “” + rs.getFloat(“score”)); } }catch(Exception e){e.printStackTrace();} finally { if(rs != null) try{ rs.close() }catch(exception e){} if(pstmt != null) try{pstmt.close()}catch(exception e){} if(cn != null) try{ cn.close() }catch(exception e){} } 19.Class.forName 的作用?为什么要用? 答:按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字 节码已经被加载过,则返回代表该字节码的 Class 实例对象,否则,按类加载器 的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类,则抛出 ClassNotFoundException。加载完这个 Class 字节码后,接着就可以使用 Class 字节码的 newInstance 方法去创建该类的实例对象了。 有时候,我们程序中所有使用的具体类名在设计时(即开发时)无法确定, 只有程序运行时才能确定,这时候就需要使用 Class.forName 去动态加载该类, 这个类名通常是在配置文件中配置的,例如,spring 的 ioc 中每次依赖注入的具 中关村软件园人才培训基地 - 18 - 体类就是这样配置的,jdbc 的驱动类名通常也是通过配置文件来配置的,以便在 产品交付使用后不用修改源程序就可以更换驱动类名。 20.大数据量下的分页解决方法。 答:最好的办法是利用 sql 语句进行分页,这样每次查询出的结果集中就只包含 某页的数据内容。再 sql 语句无法实现分页的情况下,可以考虑对大的结果集通 过游标定位方式来获取某页的数据。 sql 语句分页,不同的数据库下的分页方案各不一样,下面是主流的三种数据库 的分页 sql: sql server: String sql = "select top " + pageSize + "* from students where id not in" + "(select top " + pageSize *(pageNumber-1) + " id from students order by id)" + "order by id"; mysql: String sql = "select * from students order by id limit " + pageSize*(pageNumber-1) + "," + pageSize; oracle: String sql = "select * from " + (select *,rownum rid from (select * from students order by postime desc) where rid<=" + pagesize*pagenumber + ") as t" + "where t>" + pageSize*(pageNumber-1); 21.用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). Connection cn = null; PreparedStatement pstmt =null; Resultset rs = null; try { Class.forname(driveClassName); cn = DriverManager.getConnection(url,username,password); pstmt = cn.prepareStatement(“select score.* from score sco left join student stu on sco.sid= stu.id where stu.name = ?”); pstmt.setString(1,studentName); 中关村软件园人才培训基地 - 19 - Resultset rs = pstmt.executeQuery(); while(rs.next()) { system.out.println(rs.getInt(“subject”) + “” + rs.getFloat(“score”)); } }catch(Exception e){e.printStackTrace();} finally { if(rs != null) try{ rs.close() }catch(exception e){} if(pstmt != null) try{pstmt.close()}catch(exception e){} if(cn != null) try{ cn.close() }catch(exception e){} } 22.这段代码有什么不足之处? try { Connection conn = ...; Statement stmt = ...; ResultSet rs = stmt.executeQuery("select * from table1"); while(rs.next()) { } } catch(Exception ex) { } 答:没有 finally 语句来关闭各个连接资源,另外,使用 finally 之后,要把变量 的定义放在 try 语句块的外面,以便在 try 语句块之外的 finally 块中仍可以访问 这些变量。 23.说出数据连接池的工作机制是什么? J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池 连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表 记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接 中关村软件园人才培训基地 - 20 - 的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记 为空闲,其他调用就可以使用这个连接。 实现方式,返回的 Connection 是原始 Connection 的代理,代理 Connection 的 close 方法不是真正关连接,而是把它代理的 Connection 对象还回到连接池 中。 24.为什么要用 ORM? 和 JDBC 有何不一样? orm 是一种思想,就是把 object 转变成数据库中的记录,或者把数据库中的 记录转变成 object,我们可以用 jdbc 来实现这种思想,其实,如果我们的项目 是严格按照 oop 方式编写的话,我们的 jdbc 程序不管是有意还是无意,就已经 在实现 orm 的工作了。 现在有许多 orm 工具,它们底层调用 jdbc 来实现了 orm 工作,我们直接使 用这些工具,就省去了直接使用 jdbc 的繁琐细节,提高了开发效率,现在用的 较多的 orm 工具是 hibernate。也听说一些其他 orm 工具,如 toplink,ojb 等。 三.Java web 部分 1.Tomcat 的优化经验 答:去掉对 web.xml 的监视,把 jsp 提前编辑成 Servlet。 有富余物理内存的情况,加大 tomcat 使用的 jvm 的内存 以上为默认配置,适当修改红色字体部分的值,几个参数意义分别为: maxThreads:Tomcat 使用线程来处理接收的每个请求。这个值表示 Tomcat 可创 建的最大的线程数。 acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处 理队列中的请求数,超过这个数的请求将不予处理。 connnectionTimeout:网络连接超时,单位:毫秒。设置为 0 表示永不超时,这 样设置有隐患的。通常可设置为 30000 毫秒。 minSpareThreads:Tomcat 初始化时创建的线程数。 maxSpareThreads:一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的 socket 线程 中关村软件园人才培训基地 - 21 - 对于 Connector 8443 也有相应的设置,如果同时会用到 http 与 https,应 合理分配这两个数据.如果只用到其中的一个,可以将另外一个尽量设置小一点. 此外,还可以给 Java 虚拟机设置使用的内存来提高性能,Tomcat 默认可以 使用的内存为 128MB,在较大型的应用项目中,这点内存是不够的,需要调大。 Windows 下,在文件{tomcat_home}/bin/catalina.bat,Unix 下,在文件 {tomcat_home}/bin/catalina.sh 的前面,增加如下设置: JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】' 需要把这个两个参数值调大。例如: JAVA_OPTS='-Xms256m -Xmx512m' 测试发现,当 tomcat 线程数增大,但没有超过最大线程数时,平均响应时 间会增大,但这不意味着 tomcat 在线程增多时响应速度变慢.在测试数据中, 我们发现,由于线程数增多,在请求时需要排队,导致一部分请求会一直排队, 随着线程数的增多,排队等待的最大时间也会越来越大,而这些大数据才是导致 平均响应时间变大的罪魁祸首.响应时间大于 3s 的请求占总请求的比例一直维 持在 3%-5%. 补充:在代码方便,代码中的 System.out 语句会严重影响代码执行的效率,就 将这些为必要的语句在调试完成之后全部删除以提高效率. 2.HTTP 请求的 GET 与 POST 方式的区别 答:Form 中的 get 和 post 方法,在数据传输过程中分别对应了 HTTP 协议中的 GET 和 POST 方法。二者主要区别如下: 1)Get 是用来从服务器上获得数据,而 Post 是用来向服务器上传递数据; 2)Get 将表单中数据按照 variable=value 的形式,添加到 action 所指向的 URL 后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post 是将表 单中的数据放在 form 的数据体中,按照变量和值相对应的方式,传递到 action 所指向 URL; 3)Get 是不安全的,因为在传输过程,数据被放在请求的 URL 中;Post 的所 有操作对用户来说都是不可见的; 4)Get 传输的数据量小,这主要是因为受 URL 长度限制;而 Post 可以传输大 量的数据,所以在上传文件只能使用 Post; 5)Get 限制 Form 表单的数据集必须为 ASCII 字符,而 Post 支持整个 ISO10646 字符集; 6)Get 是 Form 的默认方法。 中关村软件园人才培训基地 - 22 - 3.解释一下什么是 servlet; 答:servlet 可以被认为是服务器端的 applet。servlet 被 Web 服务器加载和执行, 就如同 applet 被浏览器加载和执行一样。servlet 从客户端(通过 Web 服务器)接 收请求,执行某种作业,然后返回结果。 使用 servlet 的基本流程如下: ·客户端(很可能是 Web 浏览器)通过 HTTP 提出请求。 ·Web 服务器接收该请求并将其发给 servlet。如果这个 servlet 尚未被加载, Web 服务器将把它加载到 Java 虚拟机并且执行它。 ·servlet 将接收该 HTTP 请求并执行某种处理。 ·servlet 将向 Web 服务器返回应答。 ·Web 服务器将从 servlet 收到的应答发送给客户端。 由于 servlet 是在服务器上执行,通常与 applet 相关的安全性的问题并不需 实现。servlet 使相当数量的不可能或者至少是很难由 applet 实现的功能的实现 成为可能。与现有系统通过 CORBA,RMI,socket 和本地(native)调用的通信 就是其中的一些例子。另外,一定要注意:Web 浏览器并不直接和 servlet 通信, servlet 是由 Web 服务器加载和执行的。这意味着如果你的 Web 服务器有防火 墙保护,那么你的 servlet 也将得到防火墙的保护。 servlet 有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及 服务结束。这个生存期由 javax.servlet.Servlet 接口的 init,service 和 destroy 方 法表达。 4.说一说 Servlet 的生命周期? 答:servlet 有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及 服务结束。这个生存期由 javax.servlet.Servlet 接口的 init,service 和 destroy 方 法表达。 Servlet 被服务器实例化后,容器运行其 init 方法,请求到达时运行其 service 方法,service 方法自动派遣运行与请求对应的 doXXX 方法(doGet,doPost) 等,当服务器决定将实例销毁的时候调用其 destroy 方法。 web 容器加载 servlet,生命周期开始。通过调用 servlet 的 init()方法进行 servlet 的初始化。通过调用 service()方法实现,根据请求的不同调用不同的 do***()方 法。结束服务,web 容器调用 servlet 的 destroy()方法。 5.Servlet 的基本架构 public class ServletName extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws 中关村软件园人才培训基地 - 23 - ServletException, IOException { } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } } 6.SERVLETAPI 中 forward() 与 redirect()的区别? 答:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后 的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链 接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高 效,在前者可以满足需要时,尽量使用 forward()方法,并且,这样也有助于隐 藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则 必须使用 sendRedirect()方法。 7.什么情况下调用 doGet()和 doPost()? Jsp 页面中的 FORM 标签里的 method 属性为 get 时调用 doGet(),为 post 时调 用 doPost()。 8.Request 对象的主要方法: setAttribute(String name,Object):设置名字为 name 的 request 的参数值 getAttribute(String name):返回由 name 指定的属性值 getAttributeNames():返回 request 对象所有属性的名字集合,结果是一个枚举 的实例 getCookies():返回客户端的所有 Cookie 对象,结果是一个 Cookie 数组 getCharacterEncoding():返回请求中的字符编码方式 getContentLength():返回请求的 Body 的长度 getHeader(String name):获得 HTTP 协议定义的文件头信息 getHeaders(String name):返回指定名字的 request Header 的所有值,结果是 一个枚举的实例 getHeaderNames():返回所以 request Header 的名字,结果是一个枚举的实例 getInputStream():返回请求的输入流,用于获得请求中的数据 getMethod():获得客户端向服务器端传送数据的方法 中关村软件园人才培训基地 - 24 - getParameter(String name):获得客户端传送给服务器端的有 name 指定的参 数值 getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是 一个枚举的实例 getParametervalues(String name):获得有 name 指定的参数的所有值 getProtocol():获取客户端向服务器端传送数据所依据的协议名称 getQueryString():获得查询字符串 getRequestURI():获取发出请求字符串的客户端地址 getRemoteAddr():获取客户端的 IP 地址 getRemoteHost():获取客户端的名字 getSession([Boolean create]):返回和请求相关 Session getServerName():获取服务器的名字 getServletPath():获取客户端所请求的脚本文件的路径 getServerPort():获取服务器的端口号 removeAttribute(String name):删除请求中的一个属性 9.forward 和 redirect 的区别 答:1.从地址栏显示来说 forward是服务器请求资源,服务器直接访问目标地址的 URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根 本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址. redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所 以地址栏显示的是新的URL. 2.从数据共享来说 forward:转发页面和转发到的页面可以共享request里面的数 据. redirect:不能共享数据. 3.从运用地方来说 forward:一般用于用户登陆的时候,根据角色转发到相应的模 块. redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等. 4.从效率来说 forward:高. redirect:低. 10.request.getAttribute()和 request.getParameter() 有何区别? 答:request.getAttribute():是 request 时设置的变量的值, 用request.setAttribute("name","您自己的值");来设置值, request.getParameter():提取发送过来的参数如:本网页 http://community.csdn.net/Expert/topic/4633/4633804.xml?temp=.3488123 request.getParameter("temp")==".3488123" HttpServletRequest 类有 setAttribute()方法,而没有 setParameter()方法 11. jsp 有哪些内置对象?作用分别是什么? 分别有什么方法? 答:request 用户端请求,此请求会包含来自 GET/POST 请求的参数 response 网页传回用户端的回应 中关村软件园人才培训基地 - 25 - pageContext 网页的属性是在这里管理 session 与请求有关的会话期 application servlet 正在执行的内容 out 用来传送回应的输出 config servlet 的构架部件 page JSP 网页本身 exception 针对错误网页,未捕捉的例外 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 可 以存贮用户的状态信息 applicaton 表示一个 javax.servle.ServletContext 对象。这有助于查找有关 servlet 引擎和 servlet 环境的信息 config 表示一个 javax.servlet.ServletConfig 对象。该对象用于存取 servlet 实例的初始化参数。 page 表示从该页面产生的一个 servlet 实例 对象的方法: Request:objectgetAttribute(Stringname) 返回指定属性的属性值 EnumerationgetAttributeNames() 返回所有可用属性名的枚举 StringgetCharacterEncoding() 返回字符编码方式 StringgetParameter(Stringname) 返回 name 指定参数的参数值 EnumerationgetParameterNames() 返回可用参数名的枚举 StringgetRealPath(Stringpath) 返回一虚拟路径的真实路径 Session:longgetCreationTime() 返回 SESSION 创建时间 voidinvalidate() 取消 SESSION,使 SESSION 不可用 voidremoveValue(Stringname) 删除 SESSION 中指定的属性 out:voidclear() 清除缓冲区的内容 voidclearBuffer() 清除缓冲区的当前内容 voidflush() 清空流 intgetBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区则为 0 intgetRemaining() 返回缓冲区还剩余多少可用 中关村软件园人才培训基地 - 26 - booleanisAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常 voidclose() 关闭输出流 12. jsp 有哪些动作?作用分别是什么? (这个问题似乎不重要,不明白为何有此题) 答:JSP 共有以下 6 种基本动作 jsp:include:在页面被请求的时候引入一个文件。 jsp:useBean:寻找或者实例化一个 JavaBean。 jsp:setProperty:设置 JavaBean 的属性。 jsp:getProperty:输出某个 JavaBean 的属性。 jsp:forward:把请求转到一个新的页面。 jsp:plugin:根据浏览器类型为 Java 插件生成 OBJECT 或 EMBED 标记 13.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:是否忽略 EL 表达式; <%@include file=”filename”%> <%@taglib prefix=”c”uri=”http://……”%> 14.JSP 中动态 INCLUDE 与静态 INCLUDE 的区别? 答:动态INCLUDE在使用的时候,会先解析所要包含的页面(你例子中的 included.jsp),解析后在和主页面放到一起显示; 静态INCLUDE在使用的时候, 不会解析所要包含的页面(你例子中的included.htm),也就是说,不管你的 included.htm中有什么,我的任务就是把你包含并显示,其他的一概不管 jsp:include是先编译一下included.jsp文件,然后再包含 先编译,后包含 @ include是先把文件包含就来,然后统一编译 先包含,后编译 动 态 INCLUDE 用 jsp:include 动 作 实 现 它总是会检查所含文件中的变化,适合用于包含动态页面,并且 可以带参数;静态 INCLUDE 用 include 伪码实现,它不会检查所含文件的变化, 适用于包含静态页面<%@ include file="included.htm"%> 中关村软件园人才培训基地 - 27 - 15.两种跳转方式分别是什么?有什么区别? (下面的回答严重错误,应该是想问 forward 和 sendRedirect 的区别,毕竟出 题的人不是专业搞文字艺术的人,可能表达能力并不见得很强,用词不一定精准, 加之其自身的技术面也可能存在一些问题,不一定真正将他的意思表达清楚了, 严格意思上来讲,一些题目可能根本就无人能答,所以,答题时要掌握主动,只 要把自己知道的表达清楚就够了,而不要去推敲原始题目的具体含义是什么,不 要一味想着是在答题) 答:有两种,分别为: 前者页面不会转向 include 所指的页面,只是显示该页的结果,主页面还是原来 的页面。执行完后还会回来,相当于函数调用。并且可以带参数.后者完全转向 新页面,不会再回来。相当于 go to 语句。 16.页面间对象传递的方法 request,session,application,cookie 等 17.JSP 和 Servlet 有哪些相同点和不同点,他们之间的联系是什么? JSP 是 Servlet 技术的扩展,本质上是 Servlet 的简易方式,更强调应用的外 表表达。JSP 编译后是"类 servlet"。Servlet 和 JSP 最主要的不同点在于,Servlet 的应用逻辑是在 Java 文件中,并且完全从表示层中的 HTML 里分离开来。而 JSP 的情况是 Java 和 HTML 可以组合成一个扩展名为.jsp 的文件。JSP 侧重于视图, Servlet 主要用于控制逻辑。 18.MVC 的各个部分都有那些技术来实现?如何实现? 答:MVC 是 Model-View-Controller 的简写。Model 代表的是应用的业务逻辑 (通过 JavaBean,EJB 组件实现),View 是应用的表示面(由 JSP 页面产生), Controller 是提供应用的处理过程控制(一般是一个 Servlet),通过这种设计模 型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交 互和重用。 19.我们在 web 应用开发过程中经常遇到输出某种编码的字符,如 iso8859-1 等,如何输出一个某种编码的字符串? Public String translate (String str) { 中关村软件园人才培训基地 - 28 - String tempStr = ""; try { tempStr = new String(str.getBytes("ISO-8859-1"), "GBK"); tempStr = tempStr.trim(); } catch (Exception e) { System.err.println(e.getMessage()); } return tempStr; } 四. 实际项目开发 1.在 eclipse 中调试时,怎样查看一个变量的值? 在要查看的变量前先设置断点,然后选中变量,右键选 debug as-->Java Application,打开 debug 透视图,这时在 Variables 窗口中可以看到变量当前的 值。 如果是局部变量,也可以在局部变量窗口中查看。 要知道一个方法被调用的方法调用链,可以在方法栈中查看。 2.你们公司使用的代码配置管理工具是什么? 除了说以前使用 cvs,现在新项目使用 svn 了,还简要说一下使用的过程, 如果有可能,还说说仓库的概念和如何使用锁之类的细节。 3.你们的项目总金额多少,多少人开发,总共花了多少个月? 像巴巴运动网这种规模的项目,可以说是 4、5 个人、开发了 4、5 个月,费 用则是 4、50 万。按每人每月两万收入去计算,就差不多了。
还剩28页未读

继续阅读

下载pdf到电脑,查找使用更方便

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

需要 5 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

jielysong

贡献于2014-09-10

下载需要 5 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf