感觉应付面试足够了
一、基本概念
1.1 WEB开发的相关知识
- WEB用于表示Internet主机上供外界访问的资源。
Intrenet上供外界访问Web资源分为
-
静态web资源:web页面中供人们浏览的数据始终不变
-
动态web资源:web页面中供人们浏览的数据由程序产生,不同时间点访问web页面看到的内容各不相同
-
静态web资源开发技术:Html
-
常用动态web资源开发技术:JSP/Servlet、ASP、PHP
-
在Java中,动态web资源开发技术统称为Javaweb
1.2 WEB应用程序
WEB应用程序值供浏览器访问的程序,通常也简称为web应用。
一个web应用由多个静态web资源和动态web资源组成,
Web应用开发好后,想供外界访问的话,需要把web应用所在的目录交给web服务器管理,这个过程称为虚似目录的映射
动态web
静态web
静态WEB的缺点:
- 1.web页面中内容无法动态更新,所有的用户每时每刻看见的内容和最终的效果都是一样。
-
- 为了让静态WEB的显示更加好看,可以加入JavaScript完成页面上的显示特效,但这些特效都是在客户端上借助于浏览器展现给用户的,所以在服务器本身并未发生变化。
-
- 实现静态WEB客户端动态效果的手段:
-
-
- JavaScript
-
-
-
- VBScript
-
-
-
-
- 实际开发中JavaScript使用最多
-
-
- 2.静态WEB无法连接数据库,无法实现和用户的交互
WEB服务器
1.Web服务器是指驻留于因特网上某种类型计算机的程序,是可以向发出请求的浏览器提供文档的程序。当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件反馈到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)
2.HTTP协议
什么是HTTP协议
超文本传输协议的简称,TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器中的某个web资源,需要遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通讯的格式。
HTTP的特点,
- HTTP是面向事务的,客户服务器传输协议
- HTTP(1.0)是无状态的
- HTTP是无连接的
HTTP协议传送的信息很多情况下都是明文传输
HTTP请求包括的内容
- 客户端连接上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求
- 一个完整的HTTP请求包括如下内容:一个请求行、若干消息头、以及实体内容
3.Servlet
3.1Servlet总结
在Java web程序中,Servlet主要负责接受用户请求HttpServletRequest,在doGet(),doPost()中做响应的处理,并将回应HttpServletResponse反馈给用户。Servlet可以设置初始化参数,供Servlet内部使用。一个Servlet类只会有一个实例,在他初始化的时候调用init()方法,销毁时调用destory()方法。Servlet需要早web.xml中配置(MyEclipse中创建Servlet会自动配置),一个Servlet可以设置多个URL访问。Servlet不是线程安全的,谨慎使用变量。
3.2 阐述Servlet和CGI的区别?
CGI的不足之处:
- 需要为每个请求启动一个操作CGI程序的系统进程。如果请求频繁,会带来很大的开销。
- 每个请求都需要加载和运行一个CGI程序,带来很大开销
- 需要重复编写处理网络协议的的代码和编码,工作繁琐耗时
Servlet的优点:
1,只需要启动一个操作系统进程以及加载一个JVM,大大降低了系统的开销
2,如果多个请求需要做同样处理的时候,这时候只需要加载一个类,这也大大降低了开销
3,所有动态加载的类可以实现对网络协议以及请求解码的共享,大大降低了工作量。
4,Servlet能直接和Web服务器交互,而普通的CGI程序不能。Servlet还能在各个程序之间共享数据,使数据库连接池之类的功能很容易实现。
- Servlet只需要启动一个操作系统进程加载一个JVM,大大降低了系统的开销
- 如果多个请求需要做同样的处理只需加载一个类,大大减少开销。
- 所有动态加载的类可以实现对网络协议的请求解码的共享,大大减少了工作量
- Servlet能直接和Web服务器交互,普通的CGI程序不能。Servlet还可以在各个程序之间实现数据共享,使数据库连接池很容易实现。
补充:Sun Microsystems公司在1996年发布Servlet技术就是为了和CGI进行竞争,Servlet是一个特殊的Java程序,一个基于Java的Web应用通常包含一个或多个Servlet类。Servlet不能够自行创建并执行,它是在Servlet容器中运行的,容器将用户的请求传递给Servlet程序,并将Servlet的响应回传给用户。通常一个Servlet会关联一个或多个JSP页面。以前CGI经常因为性能开销上的问题被诟病,然而Fast CGI早就已经解决了CGI效率上的问题,所以面试的时候大可不必信口开河的诟病CGI,事实上有很多你熟悉的网站都使用了CGI技术。
3.3 Servlet接口中有哪些方法及Servlet生命周期探秘
Servlet接口定义了5个方法,其中前三个方法与Servlet生命周期相关:
- void init(ServletConfig config) throws ServletException
- void service(ServletRequest req, ServletResponse resp) throws ServletException java.io.IOException
- void destory()
4.java.lang.String getServletInfo()
- ServletConfig getServletConfig()
3.4 生命周期:
Web容器加载Servlet并将其实例化,Servlet生命周期开始,容器运行其init()方法进行Servlet的初始化,请求到达时调用Servlet的service()方法,service()方法会根据需要,调用与请求对应的doGet()或doPost()方法;当服务器关闭或项目卸载时服务器会调用destory()方法将Servlet实例销毁。init() 和destory()方法只会执行一次,service方法在客户端发出请求时,Servlet都会执行。Servlet中一些需要初始化和销毁的资源可以放在init()和destory()方法中,这样就不需要每次处理客户端的请求都要初始化与销毁资源。
3.5. get和post请求的区别
- get请求用来从服务器中获得资源,而post用来向服务器提交数据;
- get将表单中数据按照name=value的形式,添加到action所指向的URL后面,并且两者使用"?""连接,而各个变量之间使用“&”连接;post是将表单中的数据放在HTTP协议的请求头或消息头中,传递到action所指的URL中。
- get传输的数据要受到URL长度限制(1024字节即256个字符,每个web浏览器规定不一样);而post则没有此种限制,上传文件通常使用post方式
- 使用get,参数会显示在地址栏上,如果这些数据不是敏感数据,可以使用get;对于敏感数据还是要使用post提交
- get使用MIME类型application/x-www-form-urlencoded的URL编码(也叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是"%20
补充:GET方式提交表单的典型应用是搜索引擎。GET方式就是被设计为查询用的。
还有另外一种回答。推荐大家看一下:
GET的语义是请求获取指定的资源。GET方法是安全、幂等、可缓存的(除非有 Cache-ControlHeader的约束),GET方法的报文主体没有任何语义。POST的语义是根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST不安全,不幂等,(大部分实现)不可缓存。为了针对其不可缓存性,有一系列的方法来进行优化,以后有机会再研究(FLAG已经立起)。还是举一个通俗栗子吧,在微博这个场景里,GET的语义会被用在「看看我的Timeline上最新的20条微博」这样的场景,而POST的语义会被用在「发微博、评论、点赞」这样的场景中。
作者:杨光 链接:https://www.zhihu.com/question/28586791/answer/145424285 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
什么情况下调用doGet()和doPost()
Form标签里的method的属性为get时调用doGet(),为post时调用doPost()。
3.6 转发(Forward)和重定向(Redirect)的区别
转发是服务器行为,重定向是客户端行为。 转发(Forword)通过RequestDispacher对象forward(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)方法实现的。RequestDispacher可以通过HttpServletRequest的getRequestDispacher()方法获得。 下面的代码就是跳转到login_success.jsp页面
request.getRequestDispatcher("login_success.jsp").forward(request, response);
重定向(Redirect) 是利用服务器返回的状态吗来实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器通过 HttpServletRequestResponse 的 setStatus(int status) 方法设置状态码。如果服务器返回 301 或者 302,则浏览器会到新的网址重新请求该资源。
- 从地址栏显示来说
forward 是服务器请求资源, 服务器直接访问目标地址的 URL, 把那个 URL 的响应内容读取过来, 然后把这些内容再发给浏览器. 浏览器根本不知道服务器发送的内容从哪里来的, 所以它的地址栏还是原来的地址. redirect 是服务端根据逻辑, 发送一个状态码, 告诉浏览器重新去请求那个地址. 所以地址栏显示的是新的 URL.
- 从数据共享来说
forward: 转发页面和转发到的页面可以共享 request 里面的数据. redirect: 不能共享数据.
- 从运用地方来说
forward: 一般用于用户登陆的时候, 根据角色转发到相应的模块. redirect: 一般用于用户注销登陆时返回主页面和跳转到其它的网站等
- 从效率来说
forward: 高. redirect: 低.
3.7 自动刷新 (REFRESH)
自动刷新不仅可以实现一段时间之后自动跳转到另一个页面,还可以实现一段时间之后自动刷新本页面。Servlet 中通过 HttpServletResponse 对象设置 Header 属性实现自动刷新例如:
Response.setHeader("Refresh","5;URL=http://localhost:8080/servlet/example.htm");
其中 5 为时间,单位为秒。URL指定就是要跳转的页面(如果设置自己的路径,就会实现每过一秒自动刷新本页面一次)
3.8 SERVLET 与线程安全
Servlet不是线程安全的,多线程并发的读写会导致数据不同步的问题。解决方案是尽量不要定义name属性,而是要把name变量分别定义在doGet()和doPost()方法内。虽然synchronized(name){}语句块可以解决问题,但是会造成线程的等待,不是很科学。
注意: 多线程并发的读写Servlet类属性会导致数据不同步。但如果只并发地读取属性而不写入,则不会存在数据不同步问题。因此Servlet中的只读属性可以设置为final类型。
3.9 JSP和Servlet是什么关系
Servlet是一个特殊的Java程序,运行于服务器的JVM中,依靠服务器的支持向浏览器提供显示内容。JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个类似Servlet的Java程序,可简化页面内容的生成。Servlet和JSP的不同点在于,Servlet的应用逻辑在Java文件中,并且完全从表示层中的HTML分离出来。而JSP和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet更侧重于业务逻辑,在MVC架构模式中,JS适合充当视图(view),而Servlet适合充当控制器(controller)。
4.JSP
4.1 JSP的工作原理
JSP 是一种 Servlet,但是与 HttpServlet 的工作方式不太一样。HttpServlet 是先由源代码编译为 class 文件后部署到服务器下,为先编译后部署。而 JSP 则是先部署后编译。JSP 会在客户端第一次请求 JSP 文件时被编译为 HttpJspPage 类(接口 Servlet 的一个子类)。该类会被服务器临时存放在服务器工作目录里面。下面通过实例给大家介绍。
JSP是一种Servlet,但与HttpServlet的工作方式不太一样。HttpServlet是有源代码编译为class文件后部署到服务器下,先编译后部署。而JSP则是先部署后编译。JSP会在客户端第一次请求JSP文件时被编译为HttpJspPage类(Servlet接口的一个子类)。该类会被服务器临时存放在服务器的工作目录中.
例如:工程 JspLoginDemo 下有一个名为 login.jsp 的 Jsp 文件,把工程第一次部署到服务器上后访问这个 Jsp 文件,我们发现这个目录下多了下图这两个东东。 .class 文件便是 JSP 对应的 Servlet。编译完毕后再运行 class 文件来响应客户端请求。以后客户端访问 login.jsp 的时候,Tomcat 将不再重新编译 JSP 文件,而是直接调用 class 文件来响应客户端请求。
由于 JSP 只会在客户端第一次请求的时候被编译 ,因此第一次请求 JSP 时会感觉比较慢,之后就会感觉快很多。如果把服务器保存的 class 文件删除,服务器也会重新编译 JSP。
开发 Web 程序时经常需要修改 JSP。Tomcat 能够自动检测到 JSP 程序的改动。如果检测到 JSP 源代码发生了改动。Tomcat 会在下次客户端请求 JSP 时重新编译 JSP,而不需要重启 Tomcat。这种自动检测功能是默认开启的,检测改动会消耗少量的时间,在部署 Web 应用的时候可以在 web.xml 中将它关掉。
由于JSP只会在客户端第一次请求时被编译,因此第一次请求JSP时感觉会比较慢,之后会快很多。如果服务器把保存的class文件删除,服务器也会重新编译JSP。开发web程序时经常需要修改JSP。Tomcat能够自动检测到JSP源码发生了改动,若检测到JSP发生源码改动,Tomcat会在下次客户端请求时重新编译JSP,而不需要重启Tomcat。这种自动检测功能默认是开启的,检测改动会消耗一些时间,在部署应用时可以在在web.xml(修改 /opt/apache-tomcat_1/conf/web.xml ,将下面标记的param-value改成false,重启Tomcat。)中将他关掉。
4.2 JSP 有哪些内置对象、作用分别是什么
JSP 有 9 个内置对象:
- request:封装客户端的请求,其中包含来自 GET 或 POST 请求的参数;
- response:封装服务器对客户端的响应;
- pageContext:通过该对象可以获取其他对象;
- session:封装用户会话的对象;
- application:封装服务器运行环境的对象;
- out:输出服务器响应的输出流对象;
- config:Web 应用的配置对象;
- page:JSP 页面本身(相当于 Java 程序中的 this);
- exception:封装页面抛出异常的对象。
4.3 讲解 JSP 中的四种作用域
JSP 中的四种作用域包括 page、request、session 和 application,具体来说:
-
page: 代表与一个页面相关的对象和属性。
-
request: 代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件;需要在页面显示的临时数据可以置于此作用域。
-
session: 代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的 session 中。
-
application: 代表与整个 Web 应用程序相关的对象和属性,它实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。
4.4 如何实现 JSP 或 SERVLET 的单线程模式
对于JSP页面,可以通过page指令进行设置。<%@page isThreadSafe = "false"%>
对于Servlet,可以让自定义的Servlet实现SingleThreadModel标识接口。
说明:如果将 JSP 或 Servlet 设置成单线程工作模式,会导致每个请求创建一个 Servlet 实例,这种实践将导致严重的性能问题(服务器的内存压力很大,还会导致频繁的垃圾回收),所以通常情况下并不会这么做
5.实现会话跟踪的技术有哪些
- 使用Cookie
向客户端发送 Cookie
Cookie c =new Cookie("name","value"); //创建Cookie
c.setMaxAge(60*60*24); //设置最大时效,此处设置的最大时效为一天
response.addCookie(c); //把Cookie放入到HTTP响应中
从客户端读取 Cookie
String name ="name";
Cookie[]cookies =request.getCookies();
if(cookies !=null){
for(int i= 0;i<cookies.length;i++){
Cookie cookie =cookies[i];
if(name.equals(cookis.getName()))
//something is here.
//you can get the value
cookie.getValue();
}
}
优点:
数据可以持久保存,不需要服务器资源,简单,基于文本的 Key-Value;
缺点:
大小受到限制,用户可以禁用 Cookie 功能,由于保存在本地,有一定的安全风险。
-
- URL重写:
在 URL 中添加用户会话的信息作为请求的参数,或者将唯一的会话 ID 添加到 URL 结尾以标识一个会话。
优点: 在 Cookie 被禁用的时候依然可以使用
缺点: 必须对网站的 URL 进行编码,所有页面必须动态生成,不能用预先记录下来的 URL 进行访问。
-
-
-
- 隐藏的表单域
-
-
<input type="hidden" name ="session" value="..."/>
优点: Cookie 被禁时可以使用
缺点: 所有页面必须是表单提交之后的结果。
- HttpSession
在所有会话跟踪技术中,HttpSession 对象是最强大也是功能最多的。当一个用户第一次访问某个网站时会自动创建 HttpSession,每个用户可以访问他自己的 HttpSession。可以通过 HttpServletRequest 对象的 getSession 方 法获得 HttpSession,通过 HttpSession 的 setAttribute 方法可以将一个值放在 HttpSession 中,通过调用 HttpSession 对象的 getAttribute 方法,同时传入属性名就可以获取保存在 HttpSession 中的对象。与上面三种方式不同的 是,HttpSession 放在服务器的内存中,因此不要将过大的对象放在里面,即使目前的 Servlet 容器可以在内存将满时将 HttpSession 中的对象移到其他存储设备中,但是这样势必影响性能。添加到 HttpSession 中的值可以是任意 Java 对象,这个对象最好实现了 Serializable 接口,这样 Servlet 容器在必要的时候可以将其序列化到文件中,否则在序列化时就会出现异常。
5.2 COOKIE 和 SESSION 的的区别
由于 HTTP 协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是 Session. 典型的场景比如购物车,当你点击下单按钮时,由于 HTTP 协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的 Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个 Session 是保存在服务端的,有一个唯一标识。在服务端保存 Session 的方法很多,内存、数据库、文件都有。集群的时候也要考虑 Session 的转移,在大型的网站,一般会有专门的 Session 服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如 Memcached 之类的来放 Session。 思考一下服务端如何识别特定的客户?这个时候 Cookie 就登场了。每次 HTTP 请求的时候,客户端都会发送相应的 Cookie 信息到服务端。实际上大多数的应用都是用 Cookie 来实现 Session 跟踪的,第一次创建 Session 的时候,服务端会在 HTTP 协议中告诉客户端,需要在 Cookie 里面记录一个 Session ID,以后每次请求把这个会话 ID 发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做 URL 重写的技术来进行会话跟踪,即每次 HTTP 交互,URL 后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。 Cookie 其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到 Cookie 里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是 Cookie 名称的由来,给用户的一点甜头。所以,总结一下:Session 是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;Cookie 是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现 Session 的一种方式。