Java库Java面经

Java Web面试题总结(servlet、jsp、jdbc)

2019-10-31  本文已影响0人  飞扬code
1. 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()方法。


2. Servlet 中forward()与redirect()的区别(转发和重定向)

1)从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.所以redirect等于客户端向服务器端发出两次request,同时也接受两次response。

2)从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.
redirect不仅可以重定向到当前应用程序的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源.
forward方法只能在同一个Web应用程序内的资源之间转发请求.forward 是服务器内部的一种操作.
redirect 是服务器通知客户端,让客户端重新发起请求。所以说 redirect 是一种间接的请求, 但是不能说"一个请求是属于forward还是redirect "

3)
forward:一般用于用户登陆的时候,根据角色转发到相应的模块。
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

4)从效率来说
forward:高.
redirect:低.


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

1)<%@include file="xxx.jsp"%>为jsp中的编译指令,其文件的包含是发生在jsp向servlet转换的时期,而<jsp:include page="xxx.jsp">是jsp中的动作指令,其文件的包含是发生在编译时期,也就是将java文件编译为class文件的时期。

2)使用静态包含只会产生一个class文件,而使用动态包含会产生多个class文件。

3)使用静态包含,包含页面和被包含页面的request对象为同一对象,因为静态包含只是将被包含的页面的内容复制到包含的页面中去;而动态包含包含页面和被包含页面不是同一个页面,被包含的页面的request对象可以取到的参数范围要相对大些,不仅可以取到传递到包含页面的参数,同样也能取得在包含页面向下传递的参数


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

JSP共有以下9个内置的对象:
1)request 用户端请求,此请求会包含来自GET/POST请求的参数
2)response 网页传回用户端的回应
3)pageContext 网页的属性是在这里管理
4)session 与请求有关的会话期
5)application servlet 正在执行的内容
6)out 用来传送回应的输出
7)config servlet的构架部件
8)page JSP网页本身
9)exception 针对错误网页,未捕捉的例外


5. 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上,其他人可以查到历史浏览记录,数据不太安全。
6))POST表示可能修改变服务器上的资源的请求,在服务器端,用Post方式提交的数据只能用Request.Form来获取。

注意:在服务器端,用Request.QueryString来获取Get方式提交来的数据;Post请求则作为http消息的实际内容发送给web服务器,数据放置在HTML Header内提交,Post没有限制提交的数据。Post比Get安全,当数据是中文或者不敏感的数据,则用get,因为使用get,参数会显示在地址,对于敏感数据和不是中文字符的数据,则用post。


6. 什么是cookie?Session和cookie有什么区别?

Cookie是会话技术,将用户的信息保存到浏览器的对象.

区别:
1)cookie数据存放在客户的浏览器上,session数据放在服务器上
2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
4)单个cookie在客户端的大小和个数都有限制,不同浏览器可能有具体差异


image.png

总之,在进行页面cookie操作的时候,应该尽量保证cookie个数小于20个,总大小 小于4KB

注意:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中。


7. jsp和servlet的区别、共同点、各自应用的范围?

JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。
Servlet和JSP最主要的不同点在于:Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。
JSP侧重于视图,Servlet主要用于控制逻辑。


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

当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过反射的方式实例化。(有时候也是在第一次请求时实例化)
在servlet注册时加上<load-on-startup>1</load-on-startup>如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。


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

1)加载驱动
2)通过DriverManager对象获取连接对象Connection
3)通过连接对象获取会话
4)通过会话进行数据的增删改查,封装对象
5)关闭资源


10. preparedStatement和Statement的区别

1)效率:预编译会话比普通会话对象,数据库系统不会对相同的sql语句不会再次编译
2)安全性:可以有效的避免sql注入攻击,sql注入攻击就是从客户端输入一些非法的特殊字符,而使服务器端在构造sql语句的时候仍然能够正确构造,从而收集程序和服务器的信息和数据。比如:

“select * from t_user where userName = ‘” + userName + “ ’ and password =’” + password + “’”

如果用户名和密码输入的是’1’ or ‘1’=’1’ ; 则生产的sql语句是:

“select * from t_user where userName = ‘1’ or ‘1’ =’1’  and password =’1’  or ‘1’=’1’ 

这个语句中的where 部分没有起到对数据筛选的作用。


11. 事务的概念,在JDBC编程中处理事务的步骤。

1)事务是作为单个逻辑工作单元执行的一系列操作。
2)一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务事务处理步骤:
3)conn.setAutoComit(false);设置提交方式为手工提交
4)conn.commit()提交事务
5)出现异常,回滚 conn.rollback();


12. JDBC的脏读是什么?哪种数据库隔离级别能防止脏读?

当我们使用事务时,有可能会出现这样的情况,有一行数据刚更新,与此同时另一个查询读到了这个刚更新的值。这样就导致了脏读,因为更新的数据还没有进行持久化,更新这行数据的业务可能会进行回滚,这样这个数据就是无效的。数据库的 TRANSACTIONREADCOMMITTED ,TRANSACTIONREPEATABLEREAD 和 TRANSACTION_SERIALIZABLE 隔离级别可以防止脏读。


13. 什么是幻读,哪种隔离级别可以防止幻读?

幻读是指一个事务多次执行一条查询返回的却是不同的值。假设一个事务正根据某个条件进行数据查询,然后另一个事务插入了一行满足这个查询条件的数据。之后这个事务再次执行了这条查询,返回的结果集中会包含刚插入的那条新数据。这行新数据被称为幻行,而这种现象就叫做幻读。
只有 TRANSACTION_SERIALIZABLE 隔离级别才能防止产生幻读。


14. JDBC的 DriverManager是用来做什么的?

JDBC的DriverManager是一个工厂类,我们通过它来创建数据库连接。当JDBC的Driver类被加载进来时,它会自己注册到DriverManager类里面然后我们会把数据库配置信息传成DriverManager.getConnection()方法,DriverManager会使用注册到它里面的驱动来获取数据库连接,并返回给调用的程序。


15. 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方法。


16. 解释一下什么是Servlet?

Servlet是使用Java Servlet应用程序接口(API)及相关类和方法的Java程序,所有的Servlet都必须要实现的核心接口是javax.servlet.servlet。每一个servlet都必须要直接或者间接实现这个接口,或者继承javax.servlet.GenericServlet或javax.servlet.HTTPServlet。Servlet主要用于处理客户端传来的HTTP请求,并返回一个响应。


17. JSP常用的指令?

page:针对当前页面的指令。
include:包含另一个页面
taglib:定义和访问自定义标签


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

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


19. 过滤器和拦截器的区别

1)拦截器是基于java的反射机制的,而过滤器是基于函数回调
2)过滤器依赖于servlet容器,而拦截器不依赖于servlet容器
3)拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
4)拦截器可以访问action上下文、值栈里的对象,而过滤器不能
5)在action的生命周期中,拦截器可以多次被调用,而过滤器只在容器初始化时调用一次

拦截器 :是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

过滤器:是在Javaweb中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符.


20. 保存 session id 有几种方法 ?

1)保存 session id 的方式可以采用 cookie ,这样在交互过程中浏览器可以自动的按照规则把 这个标识发送给服务器。
2)由于 cookie 可以被人为的禁止,必须有其它的机制以便在 cookie 被禁止时仍然能够把 session id 传递回服务器,经常采用的一种技术叫做 URL 重写,就是把 session id 附加在 URL 路径的后面,附加的方式也有两种,一种是作为 URL 路径的附加信息,另一种是作为查询 字符串附加在 URL 后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能 请求的路径后面都包含这个 session id 。


21. session 何时被删除 ?

1)程序调用 HttpSession.invalidate()
2)距离上一次收到客户端发送的 session id 时间间隔超过了 session 的最大有效时间
3)服务器进程被停止
注意关闭浏览器只会使存储在客户端浏览器内存中的 session cookie 失效,不会使服务器端 的 session 对象失效 .


22. 状态码

1XX:指示信息-表示请求已经接收,继续处理
2XX:成功-表示请求已经被成功接收,理解
3XX:重定向-要完成必须进行进一步操作
4XX:客户端错误-请求无法实现或请求语句错误
5XX:服务端错误-服务器未能实现合法请求

200:OK-客户端请求成功
301:资源(网页等)被永久转移到其它URL
302:临时移动,(重定向)
400:客户端请求有语法错误,不能被服务器所理解
401:请求未经授权
403:接收到请求但是拒绝服务
404:请求资源不存在
500:服务器发生了不可预期的错误
503:服务器当前不能处理客户端请求,一段时间之后可能恢复正常


23. 谈谈对于Ajax的理解

Ajax的优点:
1)最大的一点是页面无刷新,给用户的体验非常好。
2)使用异步方式与服务器通信,不需要打断用户操作,具有更加迅速的响应能力。
3)ajax的原则是“按需取数据”,最大程度的减少冗余请求,减少服务器的负荷。

Ajax的缺点:
1)破坏浏览器后退按钮的正常行为。在动态更新页面后,用户无法回到前一个页面的状态.
2)使用JavaScript作Ajax的引擎,JavaScript的兼容性和Debug本身就让人头大。

Ajax的应用场景:
1)文本输入提示(自动完成)的场景(注册)
2)对数据进行联动过滤的场景(三级联动)


24. 简述JavaWeb的四大域对象

PageContext,ServletRequest,HttpSession,ServletContext;

1)PageContext域:作用范围是整个JSP页面,是四大作用域中最小的一个;生命周期是当对JSP的请求时开始,当响应结束时销毁。
2)ServletRequest域:作用范围是整个请求链(请求转发也存在);生命周期是在service方法调用前由服务器创建,传入service方法。整个请求结束,request生命结束。
3)HttpSession域:作用范围是一次会话。生命周期是在第一次调用request.getSession()方法时,服务器会检查是否已经有对应的session,如果没有就在内存中创建一个session并返回。当一段时间内session没有被使用(默认为30分钟),则服务器会销毁该session。如果服务器非正常关闭(强行关闭),没有到期的session也会跟着销毁。如果调用session提供的invalidate() ,可以立即销毁session。

注意:服务器正常关闭,再启动,Session对象会进行钝化和活化操作。同时如果服务器钝化的时间在session 默认销毁时间之内,则活化后session还是存在的。否则Session不存在。 如果JavaBean 数据在session钝化时,没有实现Serializable 则当Session活化时,会消失。

4)ServletContext域:作用范围是整个Web应用。当Web应用被加载进容器时创建代表整个web应用的ServletContext对象,当服务器关闭或Web应用被移除时,ServletContext对象跟着销毁。

作用域从小到大为:PageContext(jsp页面),ServletRequest(一次请求),HttpSession(一次会话),ServletContext(整个web应用)。


25. JSP页面基本结构

1)脚本元素
32指令元素
3)动作元素
4)内置对象:Out 、request、response、session、application、pageContext


26. 作用域的使用原则

能使用小的,就不使用大的
1)pageContext: 页面级作用域
只在同一个页面中有效
2)request: 请求级作用域
将数据存储在请求对象,在产生响应,请求对象销毁,其作用域也销毁
用户在发起下一次请求前,上一次请求的数据已经销毁了
3)session: 会话级作用域
将数据存储在服务器上(session中),给客户端下发凭证
每个客户端都有自己独立的session存储空间
在客户端不关闭浏览器,服务器不超时,客户端可以随时从session中获得数据
4)application:应用级作用域
将数据存储在服务器上(application中),并给数据起一个key
所有客户端共享同一个application存储空间
只要服务器不关闭,应用级作用域中的数据一直存在


27. session中数据失效的情况

(1)客户端关闭了浏览器,凭证消失,不能取得服务器内存的数据
(2)服务器重启或关闭,服务器内存的内存清空,凭证无效
(3)服务器设置了超时时间,当会话超过了超时时间,服务器内存被清理,凭证无效
(4)通过程序代码清除了session中的数据

上一篇下一篇

猜你喜欢

热点阅读