Java 基础面试题
-
PreparedStatement接口与Statement接口相比,有哪些优势?
- PreparedStatement 接口继承并扩展了Statement 接口;
- 性能方面,PreparedStatement有预编译过程,一旦绑定SQL语句就可以执行多次,Statement执行多少次就要编译多少次SQL语句。
- PreparedStatement用来执行动态的SQL语句,即包含参数的SQL语句,而Statement用来执行静态的SQL语句,并返回执行结果。
- 代码可读性和可维护性、安全性方面,PreparedStatement使用占位符(?),可读性和可维护性更好。
- PreparedStatement使用预编译处理,传入的任何参数都不会和已经预编译的SQL语句进行拼接,使SQL语句的规范性更高,安全性更强。
- 继承关系方面,作为Statement的子类,PreparedStatement继承了Statement的所有功能,PreparedStatement可以做Statement能做的操作,但Statement不一定能做PreparedStatement的操作。比如PreparedStatement可以通过setxxx()或setObject()方法为SQL语句中的参数赋值。
-
JDBC,Hibernate分页怎样实现?
-
Hibernate的分页:
//思路后台 Query query = session.createQuery("from Student"); query.setFirstResult(firstResult);//设置每页开始的记录号 query.setMaxResults(resultNumber);//设置每页显示的记录数 Collection students = query.list();
// 分页显示所有的数据 public List pageCountryList(int pageNum, int pageSize) { // pageSize:每页显示多少条记录 // pageNem:显示第几页 Session sess = HibernateSessionFactory.getSession(); Criteria ctr = sess.createCriteria(TbCountriesName.class);//里面的参数就是数据表映射后对应的实体类(我映射后的实体类叫做TBCountriesName.class) int firstRow = (pageNum - 1) * pageSize;// 获取第一行 ctr.setFirstResult(firstRow); ctr.setMaxResults(pageSize);// 每页显示的行数 List list = ctr.list(); return list; }
获取全部数据:
public List getAllCountiesName() {//得到所有的数据 Session sess = HibernateSessionFactory.getSession(); List list = sess.createCriteria(TbCountriesName.class).list(); //HibernateSessionFactory.closeSession(); return list; }
//页面分页 TbCountriesNameBean bean = new TbCountriesNameBean();//实例化 List list = bean.getAllCountiesName(); int pagesSize = 3;//每页显示三条数据 String strPages = request.getParameter("pages");//接受提交的页码 if (strPages == null || strPages == "") { strPages = "1";//初始化传入的数据,获得第一页数据(当用户没有提交页码的时候,默认为第一页) } // pages:显示第几页 int pages = Integer.parseInt(strPages); int num = list.size() % pagesSize;//用总数除以定义的每页显示的数据 int q;//定义一个参数,用作页面的计算 if (num != 0) { q = list.size() / pagesSize + 1;//如果页数不能被总数整除,就加一 } else { q = list.size() / pagesSize; } List list1 = bean.pageCountryList(pages, pagesSize);
-
JDBC的分页:
-
根据不同的数据库采用不同的sql分页语句 例如: Oracle中的sql语句为:
--查询从记录号2到记录号10之间的所有记录 SELECT * FROM (SELECT a.*, rownum r FROM TB_STUDENT) WHERE r between 2 and 10
-
-
-
说出Servlet的生命周期
- Web容器加载Servlet并将其实例化后,Servlet生命周期开始。
- 容器运行其
init()
方法进行Servlet的初始化,请求到达时运行其service方法; - service方法自动派遣运行与请求对应的doXXX方法(
doGet(),doPost()
)等, - 当服务器决定将实例销毁的时候调用其
destroy()
方法.
-
forward(转发) 和redirect(重定向)的区别?
- forward(转发)客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
- redirect(重定向)就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取,并且从浏览器的地址栏中可以看到跳转后的链接地址。实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。
- 重定向与转发区别
- forward 转发就相当于:“A找B借钱,B说没有,B去找C借,借到借不到都会把消息传递给A”;
- redirect就相当于:“A找B借钱,B说没有,让A去找C借”。
- url
- 转发的地址必须是同一个应用内
- 重定向的地址没有限制
- request
- 转发可以共享request
- 重定向不可以
- 事件
- 转发是未完成
- 重定向是已完成
- 浏览器地址栏
- 转发不变
- 重定向是改变的
-
request.getParameter()和request.getAttribute()的区别?
- request.getParameter()获取的类型是String;
- request.getAttribute()获取的类型是Object
- request.getPrameter()获取的是POST/GET传递的参数值和URL中的参数;
- request.getAttribute()获取的是对象容器中的数据值/对象
- request.setAttribute()和request.getAttribute()可以发送、接收对象;
- request.getParamter()只能接收字符串,官方不开放request.setParamter()(也就是没有这个方法)setAttribute()和getAttribute()的传参原理:
- setAttribute()是应用服务器把这个对象放在该页面所对应的一块内存中去,当你的页面服务器重定向到另外一个页面时,
- 应用服务器会把这块内存拷贝到另一个页面所对应的那块内存中。这个就可以通过getAttribute()获取到相应的参数值或者对象。
-
jsp有哪些内置对象?作用分别是什么?
- JSP一共有9个内置对象:
request
:负责得到客户端请求的信息,对应类型:javax.servlet.http.HttpServletRequestresponse
:负责向客户端发出响应,对应类型:javax.servlet.http.HttpServletResponsesession
:负责保存同一客户端一次会话过程中的一些信息,对应类型:javax.servlet.http.httpsessionout
:负责管理对客户端的输出,对应类型:javax.serlvet.jsp.jspwriterapplication
:表示整个应用环境的信息,对应类型:javax.servlet.servletcontextconfig
:表示ServletConfig,对应类型:javax.servlet.servletconfigexception
:表示页面中发生的异常,可以通过它获得页面异常信息,对应类型:java.lang.exceptionpagecontext
:表示这个JSP页面上下文,对应类型:javax.servlet.jsp.pagecontextpage
:表示当前JSP页面本身。
- JSP一共有9个内置对象:
-
jsp的四种范围?
page
是代表与一个页面相关的对象和属性。一个页面由一个编译好的 Java servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示。这既包括 servlet 又包括被编译成 servlet 的 JSP 页面request
是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系)session
是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求application
是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。
-
页面间对象传递的方法。
- request、session、application、cookie等。
-
详细描述MVC。
- 基于java的web应用系统采用MVC设计模型,即用Model(模型)、View(视图)和Controller(控制)分离设计,这是目前web应用服务系统的主流设置方向。
- Model:处理业务逻辑的模块。
- View:负责页面显示,显示Model的处理结果给用户,主要实现数据到页面的转换过程。
- Controller:负责每个请求的分发,把Form数据传递给Model进行处理,处理完成后,把处理结果返回给相应的View显示给用户。
-
MVC各个部分都有哪些技术实现?如何实现?
- MVC是Model-View-Controller的简写。
- Model代表应用的业务逻辑(通过JavaBean、EJB组件实现),
- View是引用的表示面(由JSP产生),
- Controller是提供应用的处理过程机制
- (一般是一个Servelt),通过这种设计模型把应用逻辑、处理过程和显示逻辑分成不同的组件来实现。这些组件可以交互和重用。