文章目录
1、简述Servlet执行原理?
(1)当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径。
(2)查找web.xml文件,是否有对应的<url-pattern>
标签体内容。
(3)如果有,则在找到对应的<servlet-class>
全类名
(4)tomcat会将字节码文件加载进内存,并且创建其对象
(5)调用其方法
2、描述web.xml的作用?
web.xml文件并不是web工程必须的。web.xml文件是用来初始化配置信息。
(1)指定欢迎页面,错误处理页面。
(2)命名与定制URL,定制初始化参数。
(3)设置过滤器和监听器,会话(Session)过期时间。
3、简述Servlet的生命周期?
servlet 被实例化后,调用 init 方法。请求到达时,运行 service()方法,调用 doGet()、doPost()等方法。当服务器决定将实例销毁时调用 destroy()方法。
init():第一次请求资源的时候,执行且只执行一次 init 方法。
service():第二次往后,执行 service 方法,执行多次。在这个方法内部,根据请求方式的不同,进而继续调用不同的 doGet 和 doPost 方法。
destory():当 Servlet 服务器正常关闭时,执行 destroy 方法,只执行一次。
4、简述post和get的区别?
(1)get
传输的数据量小,主要是因为它受约于URL长度的限制,而post
可以传输大量的数据,所以我们在传文件的时候会用post。
(2)get
不太安全,因为get请求的参数直接暴露在URL上,所以不能用来传递敏感信息。post
相对安全,请求参数在请求体中。
(3)get
数会被完整保留在浏览器历史记录里,而post
中的参数不会被保留
(4)对参数的数据类型,get
只接受ASCII字符,而post
没有限制。
(5)get
在浏览器回退时是无影响的,post
会再次提交请求
5、简述forward 和 redirect 区别
(1)重定向的特点:redirect
① 地址栏发生变化
② 重定向可以访问其他站点(服务器)的资源
③ 重定向是两次请求。不能使用request对象来共享数据
(2)转发的特点:forward
① 转发地址栏路径不变
② 转发只能访问当前服务器下的资源
③ 转发是一次请求,可以使用request对象来共享数据
6、Cookie实现原理
基于响应头set-cookie
和请求头cookie
实现
第一次请求服务器,服务器设置cookie将cookie存储到响应头中。最终存储到浏览器中。在一定时间内,再次请求服务器,request中会携带cookie,带给服务器。
7、session的原理?
在服务器第一次调用request.getSession()方法的时候,会在内存中创建一个session对象。此对象具有一个唯一的id值,id将会以cookie(JSESSIONID)的形式发送给浏览器,浏览器以后每次请求都会携带着此cookie,服务器就利用这个cookie区分是否是同一session作用域。
8、cookie与session的区别?
(1)session存储
数据在服务器端,Cookie在客户端
(2)session没有数据大小限制
,Cookie有
(3)session数据安全
,Cookie相对于不安全
应用场景
(1)可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session
(2)session一定时间内保存在服务器上。当访问增多,会占用服务器的性能,考虑到减轻服务器性能,应当使用cookie。
9、JSP和Servlet是什么关系?
Servlet: 是一个特殊的Java程序,运行在服务器的JVM中,依靠服务器的支持向浏览器显示内容。
JSP本质: 上是Servlet的简易形式,JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面内容的生成。
Servlet和JSP最主要的不同点
(1)Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML分离开来。JSP是Java和HTML可以组合成一个扩展名为.jsp的文件。
(2)JSP侧重于视图,Servlet更侧重于控制逻辑。
10、JSP九大内置对象?
变量名 | 真实类型 | 作用 |
---|---|---|
pageContext | PageContext | 当前页面共享数据,还可以获取其他八个内置对象 |
request | HttpServletRequest | 一次请求访问的多个资源(转发) |
session | HttpSession | 一次会话的多个请求间 |
application | ServletContext | 所有用户间共享数据 |
response | HttpServletResponse | 响应对象 |
page | Object | 当前页面(Servlet)的对象 this |
out | JspWriter | 输出对象,数据输出到页面上 |
config | ServletConfig | Servlet的配置对象 |
exception | Throwable | 异常对象 |
一共有9个: | 在jsp页面中不需要创建,直接使用的对象 |
11、四个作用域对象及其生命周期?
作用域对象 | 作用范围 | 功能 |
---|---|---|
pageContext | 当前页面 | 解决了在当前页面内的数据共享问题。 获取其他内置对象。 |
request | 一次请求 | 一次请求内的servlet的数据共享。 通过请求转发将数据流转给下一个servlet |
session | 一次会话 | 一个用户的不同请求的数据共享问题。 将数据从一次请求流转给其他请求。 |
application | 项目内 | 不同用户的数据共享问题。将数据从一个用户流转给其他用户。 |
(1)Request生命周期
request对象的生命周期是:针对一次请求,当请求完毕之后,request里边的内容也将被释放,一个请求开始时创建,请求结束后销毁。
(2)Session的生命周期
创建 当程序第一次调用到request.getSession()代码时,此时创建session。
销毁
① 超时销毁
:默认情况下如果session超过30分钟没人使用,服务器认为这个session超时了,销毁session。可以在web.xml中配置的session超时时间。
② 立即销毁
:明确的调用session.invalidate(),session立即销毁。
服务器异常关闭或web应用被移除出容器,此时随着web应用的销毁session销毁
。
服务器正常关闭,session会被钝化.当下次服务器启动时,没有超时的session会被活化回来。
12、过滤器生命周期和作用?
生命周期
(1)init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。
(2)doFilter:每一次请求被拦截资源时,会执行。执行多次。
(3)destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。
过滤器作用
(1)init: 做一些初始化工作。
(2)destory: 用于释放资源。
(3)doFilter: 为过滤器中最核心的方法,对请求和响应进行拦截,当过滤器拦截到资源时,服务器会自动调用该方法执行过滤代码。 我们只需要在这个方法中设计过滤器的逻辑代码即可。
13、Servlet的单例问题?
Servlet的创建和销毁
通常状况下,针对客户端的多次请求,Servlet只会创建一个实例对象,一旦创建它就会驻留在内存中,为以后的请求提供服务,直至退出web应用为止。也就是当我们关闭了浏览器之后我们的Servlet就终止了。
引入: 当Servlet第一次访问的时候,就被加载到内存中,以后该实例对各个请求服务,每次请求都会调用一次service方法。
这样会出现什么问题:因为Servlet是单例的,所以会出现线程安全问题。
14、Servlet的多线程同步问题?
Servlet本身是单实例的,这样当有多个用户同时访问某个Servlet时,会访问该唯一的Servlet实例中的成员变量,如果对成员变量进行写入操作,那就会导致Servlet的多线程问题,即数据不一致。
(1)解决Servlet多线程同步问题的最好方式:去除实例变量,使用局部变量。因为局部变量是各个线程私有的。
(2)使用同步代码块synchronized{}
(3)Servlet实现javax.serlvet.SingleThreadModel,Servlet2.4中已经废弃了该接口,此时Servlet容器将保证Servlet实例以单线程方式运行,也就是说,同一时刻,只会有一个线程执行Servlet的service()方法。效率低。
15. MVC三层架构元素及其含义?
(1) M:模型(Model)---->JavaBean
- 完成具体的业务操作,如:查询数据库,封装对象
(2)V:视图(View)---->JSP
- 展示数据
(3)C:控制器(Controller)。Servlet
- 获取用户的输入
- 调用模型
- 将数据交给视图进行展示
16、web目录结构,下列说法错误的是?
A.WEB-INF 目录存在于 web 应用的根目录下
B.WEB-INF 目录与 classes 目录平行
C.web.xml 在 WEB-INF 目录下
D.Web 应用程序可以打包为 war 文件
解析:classes 目录位于 WEB-INF 目录之下,故选B。