一、Servlet
(1)Servlet基础
Servlet是运行在Web服务器或应用服务器,它担当Web 浏览器或其他Http 客户程序发出的请求,数据库或应用程序之间的中间层。
Servlet 的任务是: 首先读取客户端发送的数据、隐式HTTP数据(Cookie等), 然后进行处理,期间可能访问数据库,调用其他服务等, 最后响应数据,包括处理结果文档(HTML/XML、二进制等),发送隐式HTTP数据(设置返回文档类型、cookie缓存参数等)。
Servlet一般扩展HttpServlet,根据数据发送的方式(GET、POST)调用相应的service方法处理。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletTemplate extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
(2)Servlet生命周期
服务器只创建每个servlet的单一实例,每个用户的请求都会引发新的线程-将请求交付给doGet或doPost进行处理
Servlet生命周期的三个核心方法分别是 init() , service() 和 destroy():
① 首先,web容器通过调用init()方法来初始化Servlet实例,这个方法在Servlet实例的生命周期里只调用一次。
② 接着,web容器调用Servlet的service()方法来处理每一个请求,根据收到的HTTP请求的类型,调用doGet或doPost方法
③ 最后,web容器调用destroy()方法来终结Servlet,在Servlet的生命周期里只能调用一次。
(3)Servlet的特点
Servlet是Java技术对CGI编程的回答,Servlet程序在服务器端运行,动态地生成Web页面,与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有以下特点:
① 高效:传统的CGI中对每个请求都要启动一个新的进程,如果有N个并发的对同一CGI程序的请求,则该CGI程序的代码在内存中重复装载了N次;而对于Servlet,处理请求的是N个线程,只需要一份Servlet类代码
② 方便:Servlet提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。
③ 可移植性好:Servlet用Java编写,Servlet API具有完善的标准。因此,为I-Planet Enterprise Server写的Servlet无需任何实质上的改动即可移植到Apache、Microsoft IIS或者WebStar。几乎所有的主流服务器都直接或通过插件支持Servlet。
(4)Servlet工作原理
https://www.ibm.com/developerworks/cn/java/j-lo-servlet/
二、Jsp
我们可以将Servlet看作含有HTML的Java代码;将JSP看作含有Java代码的HTML。JSP(JavaService Page)页面最终要转换成servlet,并进行编译,请求期间执行的其实是编译后的servlet,所以编写Jsp实际上不过是另一种编写Servlet的方式。
Jsp页面要转换成Servlet,servlet编译后载入到服务器中,初始化并执行,每一步的执行时间如下:
• Jsp页面仅在修改后第一次访问时,才会转换成Servlet并编译
• 载入到内存中、初始化和执行遵循Servlet的一般规则
**注:**Jsp页面生成的Servlet使用_jspService方法,不是doGet和doPost方法,初始化用jspInit方法,不是init方法
(1)Jsp内置对象、动作
在Servlet编写doGet方法时
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
HttpSession session = request.getSession();
PrintWriter out = response.getWriter();
...
}
Servlet API已经告诉了doGet的参数类型,JSP将 doGet 改为 _jspService,谁告诉你应该使用什么样的变量呢?没有人,你可以按照自己的意愿任意选取
JSP自动生产的Servlet中的 _jspService自动定义了 9 个局部变量,也成为”隐含对象”分别为:
① Request 与请求相关联的 HttpServletRequest,获取请求的参数、类型(GET、POST)、HTTP包头(cookie等),作用域 Request
② Response 与发往客户端的响应相关的 HttpServletResponse,作用域 Page
③ Session HttpSession对象,作用域 Session
④ Application 和 getServletContext 返回的类型相同,都为ServetContext,作用域Application
⑤ Config ServletConfig对象,作用域 Page
⑥ PageContext 通过它可以访问页面的许多属性,getRequest、getResponse、getSession、getOut等,页面上下文对象,作用域 Page
⑦ Page this的同义词,页面对象,作用域Page
⑧ Out 将输出发送到客户程序的Writer,不是PrintWriter,是JspWriter,作用域Page
⑨ Exception 只有在page指令中具有属性isErrorPage=”true”时才有效,作用域 Page
${ EL Expression} JSP EL表达式
Jsp动作、语法
① <!- - Blah - -> HTML注释,发送给客户,但不被浏览器显示
② <%- - Blah - -%> JSP注释,开发人员注释,不发送到客户程序
③ <%= Java Value %> JSP表达式,每次请求页面都计算并发送到客户程序
④ <% Java Statement %> JSP Scriptlet,每次请求页面时执行的一个或多个语句
⑤ <%! Method/Field Definition %> JSP声明,成为类定义的一部分字段或方法
Jsp动作:http://blog.csdn.net/java958199586/article/details/6914278
⑥ jsp:include:将其他HTML页面或JSP页面中的内容合并到当前页面,或将其中的文件插入到当前页面
⑦ jsp:forward:重定向,从一个JSP文件向另一个文件传递一个包含用户请求的request对象,把请求转到一个新的页面
Jsp指令
① include指令:<%@ include … %>
② taglib指令:<%@ taglib … %>
③ Page指令: <%@ page … %>
**注:**include指令和jsp:include的区别:
inlcude指令读入指定页面的内容并把这些内容和原来的页面融合到一起。这个过程发生在JSP转化成Servlet的阶段,最终所合成的JSP文件被Servlet容器转化成Servlet。如果一个JSP页面使用include指令包含了另一个JSP页面,最终也只产生一个Servlet的Java源文件和一个class文件。相当于兵合一处,将打一方。
< jsp:include>动作包含其他JSP页面,本质是调用了被包含文件所转化的Servlet对象的jspService()方法。即所被包含的JSP文件也对应有生成的Servlet源文件和class文件。如果一个JSP页面使用include动作包含了另一个JSP页面,会产生两个Servlet源文件和两个class文件
http://www.tuicool.com/articles/F7rYNvv
Java高级软件工程师面试考纲 :http://mp.weixin.qq.com/s?__biz=MjM5Mzk3MzA4MA==&mid=402204298&idx=2&sn=22fad36d023a798d6c0010c4fcecd73b&scene=0#wechat_redirect