jsp面试易错知识点

1.JAVA SERVLET API中forward() 与redirect()的区别?

前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。

2.两种跳转方式分别是什么?有什么区别?

 

 :有两种,分别为:

<jsp:include page="included.jsp" flush="true">

<jsp:forward page= "nextpage.jsp"/>

前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面。执行完后还会回来,相当于函数调用。并且可以带参数.后者完全转向新页面,不会再回来。相当于go to 语句。

3.JSP中动态INCLUDE与静态INCLUDE的区别?

答:动态INCLUDE用jsp:include动作实现

<jsp:include page="included.jsp" flush="true" />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数

静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面

<%@ include file="included.htm" %>

4.jsp有哪些动作?作用分别是什么?

答:JSP共有以下6种基本动作

jsp:include:在页面被请求的时候引入一个文件。

jsp:useBean:寻找或者实例化一个JavaBean。

jsp:setProperty:设置JavaBean的属性。

jsp:getProperty:输出某个JavaBean的属性。

jsp:forward:把请求转到一个新的页面。

jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记

5.、jsp有哪些内置对象?作用分别是什么?

答:JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应):

 request 用户端请求,此请求会包含来自GET/POST请求的参数

response 网页传回用户端的回应

pageContext 网页的属性是在这里管理

session 与请求有关的会话期

application servlet 正在执行的内容

out 用来传送回应的输出

config servlet的构架部件

page JSP网页本身

exception 针对错误网页,未捕捉的例外

 

 

6.Servlet的基本架构

public class ServletName extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response) throws

ServletException, IOException {

}

public void doGet(HttpServletRequest request, HttpServletResponse response) throws

ServletException, IOException {

}

 

 

 

7.、简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。

 

 区别主要答两点:a.条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而且可以操作数值型
b.逻辑操作不会产生短路

 

8. 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 ,student “ +

              “where score.stuId = student.id and student.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){}

}

 

 

9.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
  Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
    equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容

和类型相配的话,返回真值。

 

 

 10.请说出你所知道的线程同步的方法。

wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异

常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的

线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

11.最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比

较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。
Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到

一个值。
12.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有两种,分别是synchronized,wait与notify

13.线程的基本概念、线程的基本状态以及状态之间的关系
线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。
Java中的线程有四种状态分别是:运行、就绪、挂起、结束。 

14.、什么情况下调用doGet()和doPost()?
Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。

15.servlet的生命周期
web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用
service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方
法。

16.说出ArrayList,Vector, LinkedList的存储性能和特性
  ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们

都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,

Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实

现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入

速度较快。
 17.Collection 和 Collections的区别

    Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

18.&和&&的区别。
    &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。

19.sleep() 和 wait() 有什么区别? 
   sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

20.statement 和preparestatement的区别

 


 

 


 

 

   PrepareStatement与Statement的主要区别:
1:创建时的区别:
   Statement stm=con.createStatement();
   PreparedStatement pstm=con.prepareStatement(sql);
执行的时候:
    stm.execute(sql);
    pstm.execute(); 
2: pstm一旦绑定了SQL,此pstm就不能执行其他的Sql,即只能执行一条SQL命令。
  stm可以执行多条SQL命令。
3: 对于执行同构的sql(只有值不同,其他结构都相同),用pstm的执行效率比较的高,对于异构的SQL语句,Statement的执行效率要高。
4:当需要外部变量的时候,pstm的执行效率更高.

下面是一个statement的列子 :

Java代码 复制代码  收藏代码
  1. package com.JDBC.proc;   
  2.   
  3. import java.sql.*;   
  4.   
  5. public class StatementTest {   
  6.        
  7.     public static void main(String args[]){   
  8.            
  9.         Connection conn=null;   
  10.         Statement stm=null;   
  11.         ResultSet rs=null;   
  12.            
  13.         try {   
  14.             conn=DBTool.getConnection();   
  15.             String sql="select EmpNo,EName from emp " +   
  16.                     "where empNo=7499";   
  17.             stm=conn.createStatement();   
  18.             rs=stm.executeQuery(sql);   
  19.             while(rs.next()){   
  20.                 System.out.println(rs.getInt(1)+"---"+rs.getString(2));   
  21.             }   
  22.         } catch (SQLException e) {   
  23.             e.printStackTrace();   
  24.         } catch (Exception e) {   
  25.   
  26.             e.printStackTrace();   
  27.         }finally{   
  28.             DBTool.release(rs, stm, conn);   
  29.             }   
  30.            
  31.     }   
  32.        
  33.   
  34. }  
package com.JDBC.proc;

import java.sql.*;

public class StatementTest {
	
	public static void main(String args[]){
		
		Connection conn=null;
		Statement stm=null;
		ResultSet rs=null;
		
		try {
			conn=DBTool.getConnection();
			String sql="select EmpNo,EName from emp " +
					"where empNo=7499";
			stm=conn.createStatement();
			rs=stm.executeQuery(sql);
			while(rs.next()){
				System.out.println(rs.getInt(1)+"---"+rs.getString(2));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {

			e.printStackTrace();
		}finally{
			DBTool.release(rs, stm, conn);
			}
		
	}
	

}



他的主要作用阐述Statement的用法。

下面是关于prepareStatement的列子:

Java代码 复制代码  收藏代码
  1. package com.JDBC.proc;   
  2.   
  3. import java.sql.*;   
  4. public class PrepareStatement {   
  5.        
  6.     public static void main(String[] args){   
  7.            
  8.         Connection conn=null;   
  9.         PreparedStatement psmt=null;   
  10.         ResultSet rs=null;   
  11.            
  12.         try {   
  13.             conn=DBTool.getConnection();   
  14.             String sql="select EmpNo,Ename " +   
  15.                     "from emp " +   
  16.                     "where EmpNo=?";   
  17.             psmt=conn.prepareStatement(sql);   
  18.             psmt.setInt(17499);   
  19.                
  20.             rs=psmt.executeQuery();   
  21.             while(rs.next()){   
  22.                 System.out.println(rs.getInt(1)+"---"+rs.getString(2));   
  23.                    
  24.             }   
  25.         } catch (SQLException e) {   
  26.             // TODO Auto-generated catch block   
  27.             e.printStackTrace();   
  28.         } catch (Exception e) {   
  29.             e.printStackTrace();   
  30.         }finally{   
  31.             DBTool.release(rs, psmt, conn);   
  32.         }   
  33.            
  34.     }   
  35.   
  36. }  

 Statement和PreparedStatement之间的区别

转自: http://blog.sina.com.cn/u/3e9d2b3501000a52
1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程
2. 使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得,    preparedstatement支持批处理
4.
Code Fragment 1:

String updateString = "UPDATE COFFEES SET SALES = 75 " + "WHERE COF_NAME LIKE ′Colombian′";
stmt.executeUpdate(updateString);

Code Fragment 2:

PreparedStatement updateSales = con.prepareStatement("UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? ");
updateSales.setInt(1, 75);
updateSales.setString(2, "Colombian");
updateSales.executeUpdate();

片断2和片断1的区别在于,后者使用了 PreparedStatement对象,而前者是普通的 Statement对象。 PreparedStatement对象不仅包含了SQL语句,而且大多数情况下这个语句已经被预编译过,因而当其执行时,只需DBMS运行SQL语句,而不必先编译。当你需要执行 Statement对象多次的时候, PreparedStatement对象将会大大降低运行时间,当然也加快了访问数据库的速度。
这种转换也给你带来很大的便利,不必重复SQL语句的句法,而只需更改其中变量的值,便可重新执行SQL语句。选择 PreparedStatement对象与否,在于相同句法的SQL语句是否执行了多次,而且两次之间的差别仅仅是变量的不同。如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出它预编译的优越性。
5.执行许多SQL语句的JDBC程序产生大量的Statement和PreparedStatement对象。通常认为PreparedStatement对象比Statement对象更有效,特别是如果带有不同参数的同一SQL语句被多次执行的时候。PreparedStatement对象允许数据库预编译SQL语句,这样在随后的运行中可以节省时间并增加代码的可读性。

然而,在Oracle环境中,开发人员实际上有更大的灵活性。当使用Statement或PreparedStatement对象时,Oracle数据库会缓存SQL语句以便以后使用。在一些情况下,由于驱动器自身需要额外的处理和在Java应用程序和Oracle服务器间增加的网络活动,执行PreparedStatement对象实际上会花更长的时间。

然而,除了缓冲的问题之外,至少还有一个更好的原因使我们在企业应用程序中更喜欢使用PreparedStatement对象,那就是安全性。传递给PreparedStatement对象的参数可以被强制进行类型转换,使开发人员可以确保在插入或查询数据时与底层的数据库格式匹配。

当处理公共Web站点上的用户传来的数据的时候,安全性的问题就变得极为重要。传递给PreparedStatement的字符串参数会自动被驱动器忽略。最简单的情况下,这就意味着当你的程序试着将字符串“D'Angelo”插入到VARCHAR2中时,该语句将不会识别第一个“,”,从而导致悲惨的失败。几乎很少有必要创建你自己的字符串忽略代码。

在Web环境中,有恶意的用户会利用那些设计不完善的、不能正确处理字符串的应用程序。特别是在公共Web站点上,在没有首先通过PreparedStatement对象处理的情况下,所有的用户输入都不应该传递给SQL语句。此外,在用户有机会修改SQL语句的地方,如HTML的隐藏区域或一个查询字符串上,SQL语句都不应该被显示出来。
在执行SQL命令时,我们有二种选择:可以使用PreparedStatement对象,也可以使用Statement对象。无论多少次地使用同一个SQL命令,PreparedStatement都只对它解析和编译一次。当使用Statement对象时,每次执行一个SQL命令时,都会对它进行解析和编译。   

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值