jsp,servlet生命周期
来源:互联网 发布:origin绘图软件win10 编辑:程序博客网 时间:2024/05/28 11:48
JSP生命周期就是从创建到销毁的整个过程,类似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成servlet
编译阶段:
JSP 引擎从磁盘中载入 JSP 文件,然后将它们转化为 Servlet
servlet容器编译servlet,生成servlet执行类
初始化阶段:
加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法
public void jspInit(){ // 初始化代码}
执行阶段:
调用与JSP对应的servlet实例的服务方法
void _jspService(HttpServletRequest request, HttpServletResponse response){ // 服务端处理代码}
_jspService()方法在每个request中被调用一次并且负责产生与之相对应的response,并且它还负责产生所有7个HTTP方法的回应,比如GET、POST、DELETE等等。
销毁阶段:
调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例
public void jspDestroy(){ // 清理代码}
当jsp文件第一次被处理时,他会被转化成一个servlet。jsp引擎首先把jsp文件转化成一个java源文件,如果在转化过程中发生错误的话,会立刻中止,同时向服务器端和客户端发送错误信息报告;如果转化成功了,就会产生一个class类。然后再创建一个 Servlet对象,首先执行jspInit()方法进行初始化操作,由于整个执行过程jspInit()方法只执行一次,所以可以在这个方法中进行一些必要的操作比如连接数据库,初始化部分参数等等,接着执行_jspService()方法,对客户端的请求进行处理,对每一个请求会创建一个线程,如果同时有多个请求需要处理的话就会创建多个线程,由于servlet长期贮存与内存中,所以执行速度快,但是由于初始化需要编译,所以第一次执行还是比较慢的,如果由于某种原因导致jsp网页关闭或者销毁的话会执行jspDestroy()方法。
jspInit()和jspDestroy()必须写在<%! %>里,注意这里有 ! 符号。
<%!public void jspInit(){super.jspInit();System.out.println("jsp 初始化了");}%>
注意以上这种写法,如果eclipse工具中,Validation配置中,JSP Syntax Validator 项 build 时执行的选项被勾选,则在 build 时验证JSP语法会报错,提示super.jspInit()没有这个方法。因为JSP页面继承自HttpServlet类,而HttpServlet中确实没有jspInit()方法,jspInit()方法存在于接口JspPage中。工具认为这样是错误的,而super.jspInit()这样的写法在实际运行环境中是不会出错的。在build时验证JSP语法还存在另一个问题,如果一个jsp文件include了另一个jsp页面,被include的jsp页面中直接使用主jsp页面中的局部变量时,会提示局部变量未定义,而这在运行时是可以的。同时为了减少 build 的时间,一般 build 时的验证都可设为关闭。
JSP主要关注于HTML(或者XML)与Java代码的结合,以及加入其中的JSP标记。如果一个支持JSP的服务器遇到一个JSP页面,它首先查看该页面是否被编译成为一个servlet。由此可见,JSP被编译成servlet,即被转变为纯Java,然后被装载入服务器执行
我们自定义的servlet需要实现doGet和doPost方法,因为servlet容器会编译并调用service方法
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getMethod(); if (method.equals(METHOD_GET)) { long lastModified = getLastModified(req); if (lastModified == -1) { // servlet doesn't support if-modified-since, no reason // to go through further expensive logic doGet(req, resp); } else { long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE); if (ifModifiedSince < lastModified) { // If the servlet mod time is later, call doGet() // Round down to the nearest second for a proper compare // A ifModifiedSince of -1 will always be less maybeSetLastModified(resp, lastModified); doGet(req, resp); } else { resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED); } } } else if (method.equals(METHOD_HEAD)) { long lastModified = getLastModified(req); maybeSetLastModified(resp, lastModified); doHead(req, resp); } else if (method.equals(METHOD_POST)) { doPost(req, resp); } else if (method.equals(METHOD_PUT)) { doPut(req, resp); } else if (method.equals(METHOD_DELETE)) { doDelete(req, resp); } else if (method.equals(METHOD_OPTIONS)) { doOptions(req,resp); } else if (method.equals(METHOD_TRACE)) { doTrace(req,resp); } else { // // Note that this means NO servlet supports whatever // method was requested, anywhere on this server. // String errMsg = lStrings.getString("http.method_not_implemented"); Object[] errArgs = new Object[1]; errArgs[0] = method; errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg); } }
- JSP生命周期 ,Servlet生命周期
- JSP/Servlet: JSP 生命周期
- JavaWeb,Servlet,Jsp生命周期
- JavaWeb,Servlet,Jsp生命周期
- JSP/Servlet的生命周期
- JSP/Servlet的生命周期
- JSP/Servlet的生命周期
- Servlet生命周期和JSP
- JSP/Servlet的生命周期
- jsp,servlet生命周期
- Servlet和JSP的生命周期
- Servlet和JSP的生命周期
- javaEE servlet与jsp生命周期
- servlet和Jsp生命周期解读
- JSP学习 --- servlet的生命周期
- servlet与jsp的生命周期
- Servlet 和Jsp的生命周期
- servlet、session、jsp的生命周期
- oracle分页思想
- optimize table 优化表
- C
- 怎样让浮动的子DIV自动撑大外边的父级DIV
- poj分类
- jsp,servlet生命周期
- java获得文件夹目录
- 51NOD 1095 Anigram单词
- luogu2672推销员-贪心-(noip2015普及t4)
- 用人五步法
- Centos系统对历史操作记录添加ip追踪设置
- phpstorm取消自动保存,修改快捷键并标识修改的文件为星星标记
- 数据在内存中存储的方式:大端模式与小端模式
- Python爬虫入门 | 3 爬虫必备Python知识