Servlet与JSP
问题及答案来源自《Java程序员面试笔试宝典》第五章 Java Web 5.1 Servlet与JSP
1、页面请求的工作流程是怎么样的?
web应用程序由客户端和服务端两部分组成,客户端是用户的浏览器,服务端是远程的服务器
工作流程如下:
- 用户通过浏览器输入链接地址请求所需要的资源
- 浏览器接收用户的请求,并把该请求组装成指定的格式发送给服务端(HTTP协议)
- 服务器接收到客户端发来的请求,并查找用户所需要的资源
- 服务器查找到用户请求的资源,并把该资源返回给客户端
- 服务器通过把响应消息组装成特定消息格式后返回给客户端(HTTP协议)
- 浏览器对接收到的HTML进行解析,并把响应结果展现给用户
2、HTTP中GET和POST有什么区别?
GET和POST作用:
GET是最简单的一种请求方法,其主要功能是从服务器端获取用户所需资源,这些资源可以是HTML、图片、文档等
内容中的任意一种,但是GET不会影响到资源自身的状态,例如删除、修改或新增对GET来说都是不允许的
POST提供了比GET更强大的功能,它除了能够从服务器端获取资源外,同时还可以向服务器端上传数据
GET主要用来从服务器上获取数据,也可以向服务器传送数据,但一般不建议采用GET方法来向服务器上传数据
两者的区别:
- GET把参数包含在URL中,POST通过request body传递参数
-
GET在浏览器回退时是无害的,而POST会再次提交请求
-
GET请求会被浏览器主动cache,而POST不会,除非手动设置
-
GET请求只能进行url编码,而POST支持多种编码方式
-
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留
-
GET请求在URL中传送的参数是有长度限制的,而POST没有
-
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息
GET和POST的本质:
GET和POST是什么?HTTP协议中的两种发送请求的方法。
HTTP是什么?HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。
HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。
GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
GET和POST的区别的本质原因:GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器
的限制,导致他们在应用过程中体现出一些不同
3、什么是Servlet?
Servlet介绍:
Servlet是采用Java语言编写的服务器端程序,它运行于web服务器中的Servlet容器中,其主要功能是提供
请求/响应的web服务模式,可以生成动态的web内容
Servlet基本结构:
1 public class MyServlet{ 2 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 3 4 } 5 6 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 7 PrinterWriter out = response.getWriter(); 8 out.println("hello Servlet!"); 9 } 10 11 }
Servlet执行过程:
从上面的Servlet程序结构中可以看出在Servlet中没有main方法,连所谓的入口都没有,那么它到底是如何执行的呢?
其实它是在容器的控制下执行的,最常被使用的容器有tomcat。当web服务器获取到一个对Servlet的请求时,该服务器
将会把这个请求交给对于的容器来处理,容器通过调用Servlet的方法(doGet方法或者doPost方法)来响应客户端请求
Servlet处理客户端请求的具体步骤:
- 用户点击一个链接来向Servlet发送请求
- web服务器接收到请求后把请求交给相应的容器处理,容器创建两个对象(HttpServletRequest、HttpServletResponse)
- 容器根据URL找到对应的Servlet,针对请求创建一个单独的线程(将上面两个对象传入新线程中)
- 容器调用Servlet的service方法来完成对客户请求的响应,service方法会调用doGet方法或doPost方法
- 容器把响应消息组装成HTTP格式返回给客户端,此时线程运行结束
4、doPost()方法与doGet()方法怎么选择?
当HTTP请求中的Method为get时,调用doGet方法,为post时,调用doPost方法
5、什么是Servlet的生命周期?
Servlet生命周期的状态和方法:
由于Servlet运行在容器中,没有main方法,因此整个生命周期都是由容器来控制
Servlet的生命周期只有两个状态:未创建状态与初始化状态,这两种状态的转换主要是由以下三种方法控制:
- init():在创建或打开任何与Servlet相关的资源以及执行初始化工作
- service():真正处理请求的方法,将HTTP的请求(get、post)分发到doGet()、doPost()等方法
- destroy():释放任何在init方法中打开的Servlet相关资源
Servlet生命周期的详细过程:
加载:容器通过类加载器使用Servlet类对应的文件来加载Servlet
创建:通过调用Servlet的构造函数创建一个Servlet类实例
初始化:通过调用Servlet的init方法完成初始化工作(init方法只会被调用一次)
处理客户请求:Servlet创建之后就可以为客户端提供服务了,每当有新请求进来时,容器都会创建一个新线程来
处理该请求,接着调用Servlet的service方法完成对客户端的请求的分发(根据method值)
卸载:容器在卸载Servlet之前需要调用destory方法,让Servlet自己释放占用的系统资源,一旦destory方法被调用
容器就不再向这个Servlet发送任何请求消息(destory方法只会被调用一次)
6、JSP有哪些优点?
什么是JSP?
JSP可用一种简单易懂的等式表示为:HTML+Java=JSP。
JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。
网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。
JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。
JSP的优点:
JSP的引入在一定程度上解决了Servlet存在的缺点,其实实现理念是让每个Servlet只负责对应的业务逻辑的处理,让JSP来
负责用户的HTML显示,因此实现了业务逻辑与视图实现的分离,从而极大提高了系统的可拓展性
7、JSP与Servlet有何异同?
JSP与Servlet的相同点:
JSP可以看作一个特殊的Servlet,它只不过是对Servlet的一个扩充,只要是JSP可以完成的工作,使用Servlet都是可以完成的,
例如生成动态页面。由于JSP页面最终要被转换成Servlet来运行,因此处理请求的实际上是编译后的Servlet
JSP与Servlet的不同点:
- Servlet的实现方式是在Java代码中嵌入HTML,适合做流程控制、业务处理;
- JSP的实现方式是在HTML中嵌入Java代码,适合用于展示页面
- 例如在Struts框架中,Servlet位于MVC设计模式的控制层,而JSP位于视图层
8、如何使用JSP与Servlet实现MVC模型?
什么是MVC模型:
MVC是一个架构模式,它分离了表现与交互。它被分为三个核心部件:模型、视图、控制器。下面是每一个部件的分工:
- 视图是用户看到并与之交互的界面。 => 可以用JSP实现
- 模型表示业务数据,并提供数据给视图。 => 可以用JavaBean或者EJB实现
- 控制器接受用户的输入并调用模型和视图去完成用户的需求。 => 可以用Servlet实现
9、Servlet中forward和redirect有什么区别?
forward:服务器内部的重定向,服务器直接访问目标地址的URL把响应读取过来然后返回,客户端并不知道发生了重定向
redirect:客户端的重定向,是完全的跳转,客户端浏览器会获取到跳转后的地址然后重新发送请求,浏览器会显示跳转后
的网址,redirect比forward多了一次网络请求,故其效率要低一些
10、JSP的内置对象有哪些?
在JSP中,内置对象是指在不声明不创建的情况下就可以被使用的一些成员变量,一共有9个,如下:
- request(请求对象):客户端请求信息,是HttpServletRequest类的实例
- response(响应对象):服务器对客户端的响应信息,是HttpServletResponse类的实例
- pageContext(页面上下文对象):提供了对JSP页面的所有对象及命名空间的访问,是pageContext类的实例
- session(会话对象):表示客户端和服务器的一次会话,是HttpSession类的实例
- application(应用程序对象):代表JSP所属的web应用本身,application对象可存放全局变量,是ServletContext类的实例
- out(输出对象):用于在客户端浏览器输出信息,是JspWriter类的实例
- config(配置对象):取得服务器的配置信息,Servlet初始化时容器把配置信息通过config对象传递给这个Servlet
- page(页面对象):表示当前JSP页面。类似Java中的this指针,是java.lang.Object类的实例
- exception(例外对象) :表示异常,是java.lang.Throwable类的实例
11、request对象主要有哪些方法?
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。
它是HttpServletRequest类的实例。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。
request对象的常用方法如下:
- String getParameter(String name) 返回name指定参数的参数值
- String[] getParameterValues(String name) 返回包含参数name的所有值的数组
- void setAttribute(String,Object) 存储此请求中的属性
- Object getAttribute(String name) 返回指定属性的属性值
- String getContentType() 得到请求体的MIME类型
- String getProtocol() 返回请求用的协议类型及版本号
- String getServerName() 返回接受请求的服务器主机名
- int getServerPort() 返回服务器接受此请求所用的端口号
- String getCharacterEncoding() 返回字符编码方式
- void setCharacterEncoding() 设置请求的字符编码方式
- int getContentLength() 返回请求体的长度(以字节数)
- String getRemoteAddr() 返回发送此请求的客户端IP地址
- String getRealPath(String path) 返回一虚拟路径的真实路径
- String request.getContextPath() 返回上下文路径
12、JSP有哪些动作?
JSP共有以下6种基本动作,作用如下:
(1)jsp:include:在页面被请求的时候引入一个文件。
includ两种方法的实现 :
有两种实现方法,动态,静态。
动态:用于包含动态页面,并且可以随时检查页面的变化,采用jsp:include动作可以实现,例如:
<jsp:includepage="***.jsp" flush="true"/>
静态,适合于包含静态页面,不检查页面的变化,采用include伪码实现
<%@include file="***.html"%>
(2)jsp:useBean:寻找或者实例化一个JavaBean。
(3)jsp:setProperty:设置JavaBean的属性。
(4)jsp:getProperty:输出某个JavaBean的属性。
(5)jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记。
(6)jsp:forward:把请求转到一个新的页面。
13、JSP中include指令和include动作有什么区别?
include指令和include动作:
- <%@ include file=” ”%>:为指令元素
- <jsp:include page=” ” flush=”true”/>:为 动作元素
先说指令元素:
include指令元素读入指定页面的内容。并把这些内容和原来的页面融合到一起。
然后经过两个阶段:
1.将jsp翻译成 servlet
2.servlet 翻译成 .class文件
这样的话,在被引入文件中请不要加入 contentype 的属性 ,因为jsp页面中不能指定多个contentType
再说动作元素:
它并没有把所要添加的jsp的代码加入到被添加的jsp中
只是在运行时引入了要添加的jsp页面执行后所产生的应答,这意味着我们可以指定任何能够产生应答的Web资源,
(例如一个servlet或一个jsp页面),只要这些资源所产生的类型和jsp页面产生的编码类型相同(编码类型不同,则会出现乱码)
JSP容器将通过一个内部的函数调用来执行指定的资源,因此,这些被引入的资源可以帮助处理原来的请求,所以这些资源
可以访问请求作用域内的所有对象.以及所有原来的请求参数.
如果修改了要添加的jsp页面,那么可以立刻使用该页面的最新版本,这是因为对待被引入的页面的方式与对待由浏览器
直接调用的jsp页面的方式完全相同。即容器检测页面的变化,并自动进入翻译阶段,以得到页面的最新版本。
include指令和include动作的不同:
执行时间上:
- <%@ include file=” .jsp”%> 是在编译阶段执行
- <jsp:include page=” .jsp” flush=”true” /> 在请求处理阶段执行.
引入内容的不同:
- <%@ include file=” .jsp”%>引入静态文本(html,jsp),在JSP页面被转化成servlet之前和它融和到一起.
- <jsp:include page=” .jsp” flush=”true” />引入执行页面或servlet所生成的应答文本(动态页面)
16、什么是Ajax?
AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术
AJAX = Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求
AJAX 是一种用于创建快速动态网页的技术,通过在后台与服务器进行少量数据交换,使网页实现异步更新。
这意味着可以在不重载整个页面的情况下,对网页的某些部分进行更新。
而传统的网页(不使用 AJAX)如果需要更新内容,必须重载整个页面。
AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。
Ajax详细内容:https://www.cnblogs.com/wyb666/p/9387488.html
17、cookie和session有什么区别?
cookie:
Cookie是在HTTP下,服务器或脚本可以维护客户信息得一种方式,它是web服务器保存在本地浏览器上的文件,可以保存
有关用户的信息
session:
Session是指用来在客户端和服务器端之间保持状态的解决方案和存储结构
cookie和session的区别:
- cookie数据保存在客户端;session数据保存在服务器端
- cookie安全性不够;session比较安全
- cookie性能更高一些,session保存在服务器上,当访问量增多时会降低服务器的性能
- 单个cookie大小不超过4kb,很多浏览器限制一个站点最多保存20个cookie,而session无此限制
一般情况下,将用户登陆信息等重要信息存放至session,而其他需要保留的信息存放至cookie中