8.jsp静态包含和动态包含的区别

  1. 格式不同,静态包含:<%@ include file=‘文件’%>,而动态包含:<jsp:include page=“文件”/>
  2. 包含时间不同,静态包含是先将几个文件合并,然后再被编译,缺点就是如果含有相同标签,会出错。动态包含是页面被请求时编译,将结果放在一个页面。
  3. 生成的文件不同,静态包含会生成一个包含页面名字的servlet和class文件;而动态包含会各自生成对应的servlet和class文件
  4. 传递参数不同,动态包含能够传递参数,而静态包含不能。

9.MVC的各个部分都有哪些技术来实现?如何实现?

MVC是Model-View-Controller的简写。“Model” 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),“View” 是应用的表示面(由JSP页面产生),“Controller”是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模式把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

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

JSP有9个内置对象:

request:封装客户端的请求,其中包含来自GET或POST请求的参数:

response:封装服务器对客户端的响应。

pageContext:通过该对象可以获取其他对象

session:封装用户会话的对象

application : 封装服务器运行环境的对象

out:输出服务器响应的输出流对象

config: Web应用的配置对象

page:JSP页面本身(相当于Java程序中的this)

exception: 封装页面抛出异常的对象

11.Http请求的get和post方法的区别

1、Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求

2、Get是获取信息,而不是修改信息,类似数据库查询功能一样,数据不会被修改

3、Get请求的参数会跟在url后进行传递,请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连,%XX中的XX为该符号以16进制表示的ASCII,如果数据是英文字母、数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密。

4、Get传输的数据有大小限制,因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了,不同浏览器对URL的长度的限制是不同的。

5、GET请求的数据会被浏览器缓存起来,用户名和密码将铭文出现在URL上,其他人可以查到历史浏览记录,数据不太安全。

在服务器端,用 Request.QueryString 来获取Get方式提交来的数据

Post请求则作为http消息的实际内容发送给web服务器,数据放置在HTML Header内提交,Post没有限制提交的数据

12.tomcat容器是如何创建servlet类实例?用到了什么原理?

当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过反射的方式实例化。

在servlet注册时加上1如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。

13.JDBC访问数据库的基本步骤是什么?

第一步:Class.forName("") 加载数据库连接驱动

第二步:DriverManager.getConnection() 获取数据库连接对象

第三步:根据SQL获取sql会话对象,有2种方式 Statement、PreparedStatement

第四步:执行SQL,执行SQL前如果有参数值就设置参数值setXXX()

第五步:处理结果集

第六步:关闭结果集、关闭会话、关闭连接。

14、为什么要使用PreparedStatement?

PreparedStatement 接口继承Statement, PreparedStatement 实例包含已编译的SQL语句,所以其执行速度要快于Statement对象。

作为Statement的子类,PreparementStatement 继承了Statement 的所有功能。三种方法execute、executeQuery和executeUpdate已被更改以使之不再需要参数。

在JDBC应用中,多数情况下使用PreparedStatement,原因如下:代码的可读性和可维护性。Statement需要不断地拼接,而PreparedStatement不会 PreparedStatement尽最大可能提高性能。DB有缓存机制,相同的预编译语句再次被调用不会再次需要编译。

最重要的一点是极大地提高了安全性。Statement容易被SQL注入,而PreparedStatement传入的内容不会和sql语句发生任何匹配关系。

15、数据库连接池的原理。为什么需要使用连接池?

1、数据库连接是一件费时的操作,连接池可以使多个操作共享一个连接。

2、数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量、使用情况,为系统开发,测试及性能调整提供依据。

3、使用连接池是为了提高对数据库连接资源的管理。

16、execute,executeQuery,executeUpdate的区别是什么?

1、Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false.我们可以通过他的getResultSet方法来获取ResultSet,或者通过getUpdateCount()方法来获取更新的记录条数。

2、Statement的executeQuery(String query)接口用来执行select查询,并且返回ResultSet。即使查询不到记录返回的ResultSet也不会为null。我们通常使用executeQuery来执行查询语句,这样的话如果传进来的是insert或者update语句的话,它会抛出错误信息为“executeQuery method can not be used for update” 的java.util.SQLException

3、Statement 的 executeUpdate(String query) 方法用来执行Insert 或者update/delete(DML)语句,或者什么也不返回,对于DDL语句,返回值是Int类型,如果DML语句的话,它就是更新的条数,如果是DDL的话,就返回0;

只有当你不确定是什么语句的时候才应该使用execute()方法,否则应该使用executeQuery或者executeUpdate

17、JDBC的ResultSet是什么?

在查询数据库后会返回一个ResultSet,它就像是查询结果集的一张数据表。
ResultSet对象维护了一个游标,指向当前的数据行。开始的时候这个游标指向的是第一行。如果调用了ResultSet的next()方法的游标会下移一行,如果没有更多的数据了,next()方法会返回false,可以再for循环中用它来遍历数据集。

默认的ResultSet的Statement对象要关闭或者重新执行或是获取下一个ResultSet的时候,ResultSet对象也会自动关闭。

可以通过ResultSet的getter方法,传入列名或者从1开始的序号获取列数据。