JAVA面试-Servlet和jsp基础篇

1.  servlet生命周期(执行流程)
初始化:Web容器加载servlet,调用init()方法
处理请求:当请求到达时,运行其service()方法。service()自动派遣运行与请求相对应的doXXX(doGet或者doPost)方法。
销毁:服务结束,web容器会调用servlet的distroy()方法销毁servlet。
2、get提交和post提交有何区别
(1)get一般用于从服务器上获取数据,post一般用于向服务器传送数据
(2)请求的时候参数的位置有区别,get的参数是拼接在url后面,用户在浏览器地址栏可以看到。post是放在http包的包体中。
(3)能提交的数据有区别,get方式能提交的数据只能是文本,且大小不超过1024个字节,而post不仅可以提交文本还有二进制文件。
(4)servlet在处理请求的时候分别对应使用doGet和doPost方式进行处理请求
3、Servlet和JavaScript的区别,它们分别是什么作用
1)一个是服务端,一个是客户端
2)Servlet是独立于平台和协议的服务器端的Java应用程序,可以动态生成Web页面,并采用响应--请求的模式提供Web服务
JavaScript是一种解释性语言,用于向html页面提供交互行为,通常被直接嵌入在html页面中
3)Servlet是Java语言编写的web应用,Js是基于html上的一种解释语言
4、Jsp的执行原理(访问jsp页面)
客户端发出请求(request),Jsp引擎将jsp页面翻译成Servlet的java源文件,在Tomcat(Servlet容器)中将源文件编译成class文件,并加载到内存中执行,把结果返回(response)给客户端。
5.jsp内置对象,作用是什么
 request:封装客户端的请求,其中包含来自GET或POST请求的参数; 
- response:封装服务器对客户端的响应; 
- pageContext:通过该对象可以获取其他对象; 
- session:封装用户会话的对象; 
- application:封装服务器运行环境的对象; 
- out:输出服务器响应的输出流对象; 
- config:Web应用的配置对象; 
- page:JSP页面本身(相当于Java程序中的this); 
- exception:封装页面抛出异常的对象。
 
 
 
6.讲解JSP中的4种会话跟踪技术作用域 
答:JSP中的四种作用域包括page、request、session和application,具体来说: 
1. page域: 仅在当前页可用(保存在当前的PageContext中),通过pageContext对象访问
2. request域:仅用于当前客户端的请求(保存在ServletRequest对象中),它在同一个请求范围内有效.通过request对象访问
3. session域::仅在当前的HttpSession的生命周期内,当前浏览器窗口的整个生存期都有效.关闭浏览器时,这个对象会跟着消失,在整个对话期间都有效.,通过session对象访问
4. application域:在整个应用范围内都有效,只有当服务器重启时,这个对象才会消失.通过application对象访问
7. JSP中动态INCLUDE和静态INCLUDE有什么区别
include指令用于把另一个页面包含到当前页面中,在什么时候包含的?再转换成servlet的时候包含进去的。
1)动态INCLUDE用jsp:include动作实现 它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数.
2)静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面<%@ include file="included.htm" %>
8.jsp的重定向(redirect)和转发(Forward)的流程有什么区别
1)重定向是客户端行为,转发是服务器端行为
2)重定向时服务器产生两次请求,转发产生一次请求,重定向时可以转发到项目以外的任何网址,转发只能在当前项目里转发
3)重定向会导致request对象信息丢失。转发则不会
4)转发的url不会变,request.getRequestDispatch().forward()
重定向的url会改变,response.getRedirect().sendRedirect();
9.常用的JSTL标签
JSTL的核心标签库,包括等,主要用于构造循环和分支结构以控制显示逻辑。
10.cookie和session的区别
1,session 在服务器端(有效时长30分钟),cookie (有效时长浏览器会话期间)在客户端(浏览器)
2,session 默认被存在在服务器的一个文件里(不是内存)
3,session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(1.url地址重写,2. url 中传递session_id)
4,session 可以放在 文件、数据库、或内存中都可以。
5,用户验证这种场合一般会用 session
因此,维持一个会话的核心就是客户端的唯一标识,即session id
 
 
11.session的实现原理
服务器会为每一个访问服务器的用户创建一个session对象,并且把session对象的id保存在本地cookie上,只要用户再次访问服务器时,带着session的id,服务器就会匹配用户在服务器上的session,根据session中的数据,还原用户上次的浏览状态或提供其他人性化服务。
12. 浏览器禁用cookie后如何实现session
1)URL地址重写
URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程。举个例子来说,如果通过浏览器进来的URL是“UserProfile.aspx?ID=1”那么它可以被重写成“UserProfile/1.aspx”,这样的URL,这样的网址可以更好的被网站所阅读。
2)通过URL地址重写实现session的id传输
URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。
HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。
13.为什么使用cookie和session
HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话
14.cookie工作原理
客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客 户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
15.servlet是线程安全的吗?
不是,当Tomcat接收到Client的HTTP请求时,Tomcat从线程池中取出一个线程,之后找到该请求对应的Servlet对象并进行初始化,之后调用service()方法。要注意的是每一个Servlet对象再Tomcat容器中只有一个实例对象,即是单例模式。如果多个HTTP请求请求的是同一个Servlet,那么着两个HTTP请求对应的线程将并发调用Servlet的service()方法,如果Servlet1中定义了实例变量或静态变量,那么可能会发生线程安全问题(因为所有的线程都可能使用这些变量)
16.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 {
}

17.session 分布式处理
保证session一致性的架构设计常见方法:
1.session同步法:多台web-server相互同步数据
2.客户端存储法:一个用户只存储自己的数据,可以将session存储到浏览器cookie中
3.反向代理hash一致性:保证一个用户的请求落在一台web-server上
3.1.四层hash:反向代理层使用用户ip来做hash,以保证同一个ip的请求落在同一个web-server上
3.2. 七层hash都可以:使用http协议中的某些业务属性来做hash,例如sid,city_id,user_id等,能够更加灵活的实施hash策略,以保证同一个浏览器用户的请求落在同一个web-server上
4.后端统一集中处理:将session存储在web-server后端的存储层,数据库或者缓存(db,redis、cache等)
 
不同JSP页面之间的传递
在HTTP协议中一共有4种方法来完成这件事情:
1)URL后追加参数传值;
缺点:
1)传输的数据只能是字符串,对数据类型和大小都有一定的限制;
2)传输数据的值会在浏览器地址栏里面被看到,安全性等级低。
2)表单传值;
3)Cookie方法;
在第一个页面中,将要共享的变量值保存在客户端Cookie 文件内,在客户端访问第二个页面时,由于浏览器自动将 Cookie读入之后,传给服务器端,因此只需要第二个页面中,由服务器端页面读取这个 Cookie 值即可。
4)Session方法;
通过session.setAttribute("num",str);将str存到session中,通过session.getAttribute("num");从session中获取num
 
Tomcat性能优化:可以分为内存,线程,IO.
一:Tomcat内存优化,启动时告诉JVM我要一块大内存(调优内存是最直接的方式)
catalina.bat     JAVA_OPTS='-Xms256m -Xmx512m'
-Xms JVM初始化堆的大小
-Xmx JVM堆的最大值 实际参数大小根据服务器配置或者项目具体设置.
 
二:Tomcat 线程优化 在server.xml中 如:
connectionTimeout="20000"  />
maxThreads="X" 表示最多同时处理X个连接
minSpareThreads="X"初始化X个连接
maxSpareThreads="X"表示如果最多可以有X个线程,一旦超过X个,则会关闭不在需要的线程
acceptCount="X" 当同时连接的人数达到maxThreads时,还可以排队,队列大小为X.超过X就不处理
三:Tomcat IO优化
在server.xml中
    connectionTimeout="20000"
    URIEncoding="UTF-8"
    useBodyEncodingForURI="true"
    enableLookups="false"
    redirectPort="8443" />
四:APR的使用(Tomcat上配置)
APR是从操作系统级别来解决异步的IO问题,大幅度的提高性能,APR(Apache Portable Runtime)是一个高可移植库

你可能感兴趣的:(JAVA面试)