Servlet和Jsp知识点总结
1. 什么是servlet?
答:简单来讲,servlet是开发动态网页的一种技术。
【详细版】HTML只能用来保存静态内容,而通常情况下,静态页面很难满足实际应用的需要,鉴于此,动态页面被引入。所谓动态页面,指的是能够根据不同时间,不同用户而显示不同内容的页面,例如常见的论坛、留言板、电子商务网站等都是通过动态页面来实现的。那么如何才能生成动态页面呢?其中一种是采用公共网关接口CGI(Common Gateway Interface)。CGI是一种用Perl脚本语言编写的程序,可以用来生成动态页面,而另一种方式则是采用Servlet技术。
什么是Servlet呢?Servlet是采用Java语言编写的服务器端程序,它运行于Web服务器中的Servlet容器中,其主要功能是提供请求/响应的Web服务模式,可以生成动态的Web内容,而这正是HTML所不具备的功能。
Servlet处理客户端请求有哪些步骤?
答:
1)用户通过单击一个链接来向Servlet发起请求。
2)Web服务器接收到该请求后,会把该请求交给相应的容器来处理,当容器发现这是对Servlet发起的请求后,容器此时会创建两个对象:HttpServletResponse和HttpServletRequest。
3)容器可以根据请求消息中的URL消息找到对应的Servlet,然后针对该请求创建一个单独的线程,同时把第2)步中创建的两个对象以参数的形式传递到新创建的线程中。
4)容器调用Servlet的service()方法来完成对用户请求的响应,service()方法会调用doPost()或doGet()方法来完成具体的响应任务,同时把生成的动态页面返回给容器。
5)容器把响应消息组装成HTTP格式返回给客户端。此时,这个线程运行结束,同时删除第2)步创建的两个对象。
Servlet处理请求的方式为()
A. 以进程的方式 B.以程序的方式 C.以线程的方式 D.以响应的方式
答案:C。
Servlet与CGI有什么区别?
答:相较于CGI,Servlet处于服务器进程之中,它通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会被销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率不如Servlet。
doPost()方法和doGet()方法怎么选择?
答:从Web容器处理HTTP请求的流程中可以看出,最终的请求都会交给Servlet来处理,而Servlet是通过调用service()方法来处理请求的,service()方法会根据不同的请求类型分别调用doPost()方法(用于处理POST请求)或doGet()方法(用于处理GET请求)来处理用户请求,实现对客户的响应。如果请求时GET,就调用doGet()方法;如果请求时POST,就调用doPost()方法。
简述servlet的声明周期?
答:创建、初始化、运行、死亡。
创建。通过调用Servlet的构造函数来创建一个Servlet实例。
初始化。通过调用Servlet的init()方法来完成初始化工作,这个方法是在Servlet已被创建但向客户端提供服务之前调用的,需要注意的是,init()方法只会被调用一次。
运行。Servlet一旦被创建后,它就可以为客户端提供服务了。每当有新的客户请求到来时,容器都会创建一个新的线程来处理该请求,接着会调用Servlet的service()方法来完成客户端的请求,当然,service()方法会根据请求的method属性值的不同决定是调用doGet()方法还是调用doPost()方法来完成具体的响应。
死亡。容器在销毁Servlet之前需要调用destroy()方法,让Servlet自己释放其占用的系统资源,一旦destroy方法被调用,容器就不会再向这个Servlet发送任何请求消息了。如果容器需要这个Servlet,那么就必须重新创建并初始化一个实例。需要注意的是,destory()方法只会被调用一次。
在Servlet的生命周期中,容器只调用一次的方法是(C、D)
A.service B.getServletConfig C.init D.destroy
JSP有哪些优点?
答:JSP由Sun公司倡导、许多企业参与建立起来的一种动态技术标准,从本质上来讲,就是嵌入了Java代码的HTML文件(但需要注意的是,JSP页面最好少写Java代码)。在引入JSP之前,在Web应用程序中,所有业务逻辑和HTML的响应都是在Servlet中实现的,但在使用这种方式时,存在一个比较大的缺陷:必须把给用户响应的视图组装成一个很长的HTML格式的字符串写入println()方法中。所以,使用这种方式编程,在编写一段很长的HTML字符串时非常容易出错,而且代码的可读性也非常差,同时由于业务逻辑与视图没有分离,系统的可扩展性、可维护性都较差。
JSP的引入在一定程度上解决了Servlet存在的确定。其实现理念是让每个Servlet只负责其对应的业务逻辑的处理,让JSP来负责用户的HTML显示,因此实现了业务逻辑与视图实现的分离,从而极大地提高了系统的可扩展性。
JSP与Servlet有何异同?
答:JSP与Servlet的相同点为:JSP与Servlet的相同点为:JSP可以看作一个特殊的Servlet,它只不过是对Servlet的扩展,只要是JSP可以完成的工作,使用Servlet都可以完成,例如生成动态页面。由于JSP页面最终要被转换成Servlet来运行,因此处理请求实际上是编译后的Servlet。
JSP与Servlet的不同点为:
(1)Servlet的实现方式是在Java中嵌入HTML代码,编写和修改HTML非常不方便,所以它比较适合做流程控制、业务处理;而JSP的实现方式为在HTML中嵌入Java代码,比较适合页面的显示。
(2)Servlet中没有内置对象,JSP中的内置对象都是必须通过HttpServletRequest对象、HttpServletResponse对象以及HttpServlet对象得到。
按照MVC设计模式,JSP用于实现(B)
A.Model B.View C.Controller D.容器
Servlet中forward和redirect有什么区别?
答:转发:
a)地址栏不会改变
b)转发只能转发到当前web应用内的资源
c)在转发过程中,可以把数据保存到request域对象中
重定向:
a)地址栏会改变,变成重定向到的地址。
b)重定向可以跳转到当前web应用,或其他web应用,甚至是外部域名网站。
c)在重定向的过程中,不能把数据保存到request中。
JSP的内置对象有哪些?
答:9个内置对象。request(请求对象)、response(响应对象)、pageContext(页面上下对象)、session(会话对象)、application(应用程序对象)、out(输出对象)、config(配置对象)、page(页面对象)与exception(异常对象)。
request对象主要有哪些方法?
答:request.getMethod() 用来获取HTTP的请求方式,如get或post
request.getParameter(String name) 根据参数名来获取参数值(只能获取一个值的参数)
request.getRequestURI() 用来获取发出请求字符串的客户端地址
request.getCookies() 用来返回客户端的所有Cookie对象,其结果是一个Cookie数组
request.setCharacterEncoding("utf-8") 设置参数查询的编码,该方法只能对请求实体内容的数据编码起作用。POST提交的数据在实体内容中,所以该方法对POST方法有效!GET方法的参数放在URI后面,所以对GET方式无效!!!
response对象主要有哪些方法?
答:response.setStatus() 设置状态码
response.setHeader("name","value") 设置响应头
response.sendRedirect("/day09/adv.html") 请求重定向
response.addCookie(cookie) 把cookie发送给浏览器端
HttpServletRequest对象的()方法能够获取一个表单参数的值。
A.getQuaryString B.getPathInfo() C.getParameter() D.getAttribute()
答案:C。
Jsp的四个域对象是什么?
答:pageContext(page域):只能在当前jsp页面中使用(当前页面)
request(request域):只能在同一个请求中使用(转发)
session(session域):只能在同一个会话(session对象)中使用(私有的)
application(context域):只能在同一个web应用中使用。(全局的)
如果只希望在多个页面间共享数据,可以使用()作用域。
A.request、session B.application、session
C.request、application D.pageContext、request
答案:A
cookie和session有什么区别?
答:两者区别:
Cookie:数据存储在客户端,减少了服务器端的压力;安全性不好;存储数据不能超过4k;只能存非中文字符串,不能存对象。
Session:数据存储在服务器端,增加了服务器端的压力;安全性好;存储数据无大小限制;可以存中文字符串和对象。