摘要:这一部分讲解基于Java的Web开发相关面试题,即便在Java走向没落的当下,基于Java的Web开发因为拥有非常成熟的解决方案,仍然被广泛应用。不管你的Web开发中是否使用框架,JSP和Servlet都是一个必备的基础,在面试的时候被问到的概率还是很高的。
116、说出Servlet的生命周期,并说出Servlet和CGI的区别?
答:Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init()方法进行Servlet的初始化;请求到达时调用Servlet的service方法,service方法会调用与请求对应的doGet或doPost等方法;当服务器关闭会项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的destroy方法。Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI 对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet。
【补充1】SUN公司在1996年发布Servlet技术就是为了和CGI进行竞争,Servlet是一个特殊的Java程序,一个基于Java的Web应用通常包含一个或多个Servlet类。 Servlet不能够自行创建并执行,它是在Servlet容器中运行的,容器将用户的请求传递给Servlet程序,此外将Servlet的响应回传给用户。通常一个Servlet会关联一个或多个JSP页面。以前CGI经常因为性能开销上的问题被诟病,然而Fast CGI早就已经解决了CGI效率上的问题,所以面试的时候大可不必诟病CGI,腾讯的网站就使用了CGI技术,相信你也没感觉它哪里不好。
【补充2】Servlet接口定义了5个方法,其中前三个方法与Servlet生命周期相关:
1. void init(ServletConfig config) throws ServletException
2. void service(ServletRequest req, ServletResponse resp) throws ServletException,
java.io.IOException 3. void destory()
4. java.lang.String getServletInfo() 5. ServletConfig getServletConfig()
117、转发(forward)和重定向(redirect)的区别?
答:forward是容器中控制权的转向,是服务器请求资源,服务器直接访问目标地址的URL,把那个URL 的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。redirect就是服务器端根据逻辑,发送一个状态码,告诉浏览器重新
去请求那个地址,因此从浏览器的地址栏中可以看到跳转后的链接地址。前者更加高效,在前者可以满足需要时,尽量使用转发(通过RequestDispatcher对象的forward方法,RequestDispatcher对象可以通过ServletRequest对象的getRequestDispatcher方法获得),并且,这样也有助于隐藏实际的链接;在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用重定向(通过HttpServletResponse对象调用其sendRedirect方法)。
118、JSP有哪些内置对象?作用分别是什么? 答:JSP有9个内置对象:
1. request:封装客户端的请求,其中包含来自GET或POST请求的参数; 2. response:封装服务器对客户端的响应; 3. pageContext:通过该对象可以获取其他对象; 4. session:封装用户会话的对象;
5. application:封装服务器运行环境的对象; 6. out:输出服务器响应的输出流对象; 7. config:Web应用的配置对象;
8. page:JSP页面本身(相当于Java程序中的this); 9. exception:封装页面抛出异常的对象。
【补充】如果用Servlet来生成网页中的动态内容无疑是非常繁琐的工作,另一方面,所有的文本和HTML标签都是硬编码,即使做出微小的修改,都需要进行重新编译。JSP解决了Servlet的这些问题,它是Servlet很好的补充,可以专门用作呈现给用户的视图(View),而Servlet作为控制器(Controller)专门负责处理用户请求并转发或重定向到某个页面。基于Java的Web开发很多都同时使用了Servlet和JSP。JSP页面其实是一个Servlet,能够运行Servlet的服务器(Servlet容器)通常也是JSP容器,可以提供JSP页面的运行环境,Tomcat就是一个Servlet/JSP容器。第一次请求一个JSP页面时,Servlet/JSP容器首先将JSP页面转换成一个JSP页面的实现类,这是一个实现了JspPage接口或其子接口HttpJspPage的Java类。JspPage接口是Servlet的子接口,因此每个JSP页面都是一个Servlet。转换成功后,容器会编译Servlet类,之后容器加载和实例化Java字节码,并执行它通常对Servlet所做的生命周期操作。对同一个JSP页面的后续请求,容器会查看这个JSP页面是否被修改过,如果修改过就会重新转换并重新编译并执行。如果没有则执行内存中已经存在的Servlet实例。我们可以看一段JSP代码对应的Java程序就知道一切了,而且9个内置对象的神秘面纱也会被揭开。 JSP页面:
[html] view plain copy
1. <%@ page pageEncoding=\%> 2. <%
3. String path = request.getContextPath();
4. String basePath = request.getScheme()+\
verPort()+path+\ 5. %> 6.
7. 8. 9.
10.
18.
20.
对应的Java代码:
[java] view plain copy
1. /*
2. * Generated by the Jasper component of Apache Tomcat 3. * Version: Apache Tomcat/7.0.52
4. * Generated at: 2014-10-13 13:28:38 UTC
5. * Note: The last modified time of this file was set to 6. * the last modified time of the source file after 7. * generation to assist with modification tracking. 8. */
9. package org.apache.jsp; 10.
11. import javax.servlet.*; 12. import javax.servlet.http.*; 13. import javax.servlet.jsp.*; 14.
15. public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase 16. implements org.apache.jasper.runtime.JspSourceDependent { 17.
18. private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp
.JspFactory
19. .getDefaultFactory(); 20.
21. private static java.util.Map
23. private javax.el.ExpressionFactory _el_expressionfactory; 24. private org.apache.tomcat.InstanceManager _jsp_instancemanager; 25.
26. public java.util.Map
30. public void _jspInit() {
31. _el_expressionfactory = _jspxFactory.getJspApplicationContext(
32. getServletConfig().getServletContext()).getExpressionFactory(); 33. _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory 34. .getInstanceManager(getServletConfig()); 35. } 36.
37. public void _jspDestroy() { 38. } 39.
40. public void _jspService(
41. final javax.servlet.http.HttpServletRequest request, 42. final javax.servlet.http.HttpServletResponse response) 43. throws java.io.IOException, javax.servlet.ServletException { 44. // 9个内置对象就是在这里定义的
45. final javax.servlet.jsp.PageContext pageContext; 46. javax.servlet.http.HttpSession session = null; 47. final javax.servlet.ServletContext application; 48. final javax.servlet.ServletConfig config; 49. javax.servlet.jsp.JspWriter out = null; 50. final java.lang.Object page = this;
51. javax.servlet.jsp.JspWriter _jspx_out = null;
52. javax.servlet.jsp.PageContext _jspx_page_context = null; 53.
54. try {
55. response.setContentType(\);
56. pageContext = _jspxFactory.getPageContext(this, request, response, 57. null, true, 8192, true); 58. _jspx_page_context = pageContext;
59. application = pageContext.getServletContext(); 60. config = pageContext.getServletConfig(); 61. session = pageContext.getSession(); 62. out = pageContext.getOut();
相关推荐: