Java工程师面试Web篇(二)

    |     2017年2月15日   |   Java面试题   |     0 条评论   |    2123

Java Web 面试常把 JSP / Servlet / Session / 过滤器 / 监听器 串成一条线:浏览器请求怎么落到页面、九大内置对象各自管什么、转发和重定向差在哪。下面按这条线把图和要点摊开,JavaScript 总复习可另看 这篇总结。

这组笔记对应面试「Web 篇」:先看全景图,再逐块对照。

20140731144525904006

一、JSP 页面生命周期

用户访问 index.jsp 时,Tomcat 的 JSP 引擎先判断是不是第一次碰到这份资源。

  • 第一次:JSP 转成 Servlet(本质是 Java 类)→ 编译成字节码 → 调 jspInit → 再进 jspService 处理请求。
  • 不是第一次:直接走已生成的字节码,同样进入 jspService。
  • jspService 专门处理本次请求;页面销毁时才轮到 jspDestroy。

二、JSP 九大内置对象

对象 类型 要点
out JspWriter 向客户端写内容最常用的出口
request HttpServletRequest 封装一次请求;请求结束前一直有效(请求域)
response HttpServletResponse 本次页面响应;页面作用域,这次访问有效
session HttpSession 第一次访问自动创建;用来认出是不是同一个人
application ServletContext 全局共享;服务器启动到关闭

request 常用方法

request.setCharacterEncoding("UTF-8");//设置编码,解决中文乱码问题。
request.setAttribute("","");//前者为需要设置的属性,后者为需要的值。

request.getAttribute();
request.getRequestDispatcher("index.jsp").forward(request, response);//请求转发到index.jsp页面,该请求对象是一直有效的。

response 常用方法

response.setContentType("text/html","charset="utf-8");//设置响应的MIMI类型。
response.sendRedirect("index.jsp");//请求重定向,如果存在多次重定向,那么对象数据是不会保存下来的,即为null。

转发 vs 重定向: 重定向是客户端行为,response.sendRedirect() 等于两次请求,上次 request 不保留,地址栏会变;转发是服务器行为,request.getRequestDispatcher().forward() 仍是一次请求,对象还在,地址栏不变。

什么是会话: 从打开浏览器连上服务器,到关掉浏览器结束,算一次会话。用户在多个页面间跳,服务端必须知道是不是同一个人,所以才有 session。

application 上的同一属性,不同用户、前后连接都能碰到;任何地方改它,都会影响到别人。

三、指令、动作与 Session 生命周期

三个编译指令:page、include、taglib。七个动作:jsp:forward、jsp:param、jsp:include、jsp:plugin、jsp:useBean、jsp:setProperty、jsp:getProperty。

include 指令 和 include 动作 的差别:

Session 的「活动」边界

  • 同一次会话里,超链接打开的新页仍属这次会话。
  • 当前会话页没全关时,再开窗口访问同一项目,还是同一次会话。
  • 所有页都关了再访问 JSP/Servlet,会建新会话;旧 SessionId 可能还躺在服务端,只是再也没客户端带着它来校验。

四、过滤器与 Servlet 生命周期

Web 容器启动时过滤器就已经加载;实例化只发生一次,容器里这份过滤器实例复用。

  • 先看 Servlet 实例在不在,在就直接响应。
  • 初始化:创建实例后调 init。
  • 响应:调 service(),再按提交方式走 doGet / doPost。
  • 终止:服务器关闭时调 destroy。

五、Web 监听器

监听器是 Servlet 规范里的特殊类,能听客户端请求和服务端操作,对象包括 ServletContext、HttpSession、ServletRequest。

三类域对象监听器

HttpSession 事件:

ServletContext 事件:

ServletRequest 事件:

三类分别实现图里 1..N 个接口,接口方法就是用途入口。

绑定到 Session 域的对象状态:

用户一多,把 session 全堆在内存里开销很大。钝化就是把暂时不用的 session 序列化到文件,要用时再反序列化回来。

六、Model1 与 Model2

Model1 是较早的分层:JSP + JavaBean。写起来快,可维护性和扩展性都一般。

  1. JSP 向 Servlet 提交请求。
  2. 控制层实例化或调用模型层。
  3. 模型层访问数据库。
  4. 结果回到控制层。
  5. 控制层按结果挑不同 JSP 给用户看。

一句话总结:Web 面试把请求链路讲清楚:JSP 先编译再 service,九大对象分清作用域,转发一次请求、重定向两次,过滤器随容器起、Servlet 按 init/service/destroy 走,监听器盯三个域,Model2 用 Servlet 把视图和模型拆开。

转载请注明来源:Java工程师面试Web篇(二)
本文链接地址:https://ai.zhousir.top/?p=1922
回复 取消