JSP的原理

作者:无名 - 其它综合 -

 jsp其实就是servlet,在运行时,jsp将由jsp编译器进行转换,将jsp转换为java代码,由jsp所创建的类都实现了servlet接口,所以jsp就是servlet,它也有声明声明方法,其实请求该jsp页面实际上也是在调用该jsp转换过了的servlet的service方法,我们到tomcat目录下查看对应的servlet代码

lt;%@ page contenttype="text/html;charset=utf-8" language="java" %gt;
lt;htmlgt;
  lt;headgt;
    lt;titlegt;第一个web程序lt;/titlegt;
  lt;/headgt;
  lt;bodygt;
    hello,world!
  lt;/bodygt;
lt;/htmlgt;

  该jsp的名字是index.jsp,我们看到它对应的servlet的名字是index_jsp.java,由tomcat生成的源码如下:

/*
 * generated by the jasper component of apache tomcat
 * version: apache tomcat/8.0.52
 * generated at: 2018-10-09 11:42:02 utc
 * note: the last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class index_jsp extends org.apache.jasper.runtime.httpjspbase
    implements org.apache.jasper.runtime.jspsourcedependent,
                 org.apache.jasper.runtime.jspsourceimports {

  private static final javax.servlet.jsp.jspfactory _jspxfactory =
          javax.servlet.jsp.jspfactory.getdefaultfactory();

  private static java.util.maplt;java.lang.string,java.lang.longgt; _jspx_dependants;

  private static final java.util.setlt;java.lang.stringgt; _jspx_imports_packages;

  private static final java.util.setlt;java.lang.stringgt; _jspx_imports_classes;

  static {
    _jspx_imports_packages = new java.util.hashsetlt;gt;();
    _jspx_imports_packages.add("javax.servlet");
    _jspx_imports_packages.add("javax.servlet.http");
    _jspx_imports_packages.add("javax.servlet.jsp");
    _jspx_imports_classes = null;
  }

  private volatile javax.el.expressionfactory _el_expressionfactory;
  private volatile org.apache.tomcat.instancemanager _jsp_instancemanager;

  public java.util.maplt;java.lang.string,java.lang.longgt; getdependants() {
    return _jspx_dependants;
  }

  public java.util.setlt;java.lang.stringgt; getpackageimports() {
    return _jspx_imports_packages;
  }

  public java.util.setlt;java.lang.stringgt; getclassimports() {
    return _jspx_imports_classes;
  }

  public javax.el.expressionfactory _jsp_getexpressionfactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxfactory.getjspapplicationcontext(getservletconfig().getservletcontext()).getexpressionfactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.instancemanager _jsp_getinstancemanager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.instancemanagerfactory.getinstancemanager(getservletconfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspinit() {
  }

  public void _jspdestroy() {
  }

  public void _jspservice(final javax.servlet.http.httpservletrequest request, final javax.servlet.http.httpservletresponse response)
        throws java.io.ioexception, javax.servlet.servletexception {

final java.lang.string _jspx_method = request.getmethod();
if (!"get".equals(_jspx_method) amp;amp; !"post".equals(_jspx_method) amp;amp; !"head".equals(_jspx_method) amp;amp; !javax.servlet.dispatchertype.error.equals(request.getdispatchertype())) {
response.senderror(httpservletresponse.sc_method_not_allowed, "jsps only permit get post or head");
return;
}

    final javax.servlet.jsp.pagecontext pagecontext;
    javax.servlet.http.httpsession session = null;
    final javax.servlet.servletcontext application;
    final javax.servlet.servletconfig config;
    javax.servlet.jsp.jspwriter out = null;
    final java.lang.object page = this;
    javax.servlet.jsp.jspwriter _jspx_out = null;
    javax.servlet.jsp.pagecontext _jspx_page_context = null;


    try {
      response.setcontenttype("text/html;charset=utf-8");
      pagecontext = _jspxfactory.getpagecontext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pagecontext;
      application = pagecontext.getservletcontext();
      config = pagecontext.getservletconfig();
      session = pagecontext.getsession();
      out = pagecontext.getout();
      _jspx_out = out;

      out.write("\n");
      out.write("\n");
      out.write("lt;htmlgt;\n");
      out.write("  lt;headgt;\n");
      out.write("    lt;titlegt;第一个web程序lt;/titlegt;\n");
      out.write("  lt;/headgt;\n");
      out.write("  lt;bodygt;\n");
      out.write("    hello,world!\n");
      out.write("  lt;/bodygt;\n");
      out.write("lt;/htmlgt;\n");
    } catch (java.lang.throwable t) {
      if (!(t instanceof javax.servlet.jsp.skippageexception)){
        out = _jspx_out;
        if (out != null amp;amp; out.getbuffersize() != 0)
          try {
            if (response.iscommitted()) {
              out.flush();
            } else {
              out.clearbuffer();
            }
          } catch (java.io.ioexception e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlepageexception(t);
        else throw new servletexception(t);
      }
    } finally {
      _jspxfactory.releasepagecontext(_jspx_page_context);
    }
  }
}

  这个类继承了org.apache.jasper.runtime.httpjspbase,而该抽象类继承了httpservlet,而且类中还有一个_jspservice方法,参数的类型是httprequest和httpresponse,可以猜测在httpjspbase类中,将在声明周期方法service中调用这个_jspservice方法,再来看方法的具体实现,方法首先获取了请求方式,如果请求方式不是get或者post或者head,那么客户端将收到一个错误状态码,"jsps only permit get post or head",可见jsp只允许get、post和head的请求方式,我们一开始在jsp页面中写的html文本,都使用了jspwriter的write方法发送到客户端了,我们使用ide中在jsp页面的html文本部分打一个断点,然后浏览器请求该jsp,我们发现断点被命中了,并且调试器的栈堆将显示代码停留在_jspservice方法中,这也证明了jsp其实就是servlet,

jsp的原理

原文地址:https://www.cnblogs.com/yusiming/p/9762513.html

本文内容由IT人知识库(原文链接:http://www.itpeo.net/9999/4547912.html)本站为各位整理





标签 原理

2018年第一行代码

var jrt = { age: 28, characteristics: ‘‘ }; if (jrt ...

高级查询,分组查询

分组查询定义:利用内置的分组函数来查询 所谓分组,就是看待数据的“角度”不同。 也就是把某类值相同的看做一组。语法:se ...

mysqlsql知识总结

sql知识总结: 检索不同的行: select distinct vend_id from products; dist ...

4.java并发编程艺术-java并发编程基础

java从诞生开始就明智的选择了内置对多线程的支持,这使得java语言相比同一时期的其他语言具有明显的优势。线程作为 ...

核心交易链路架构设计与演进

前言    随着双11进入千亿时代,电商平台正在向“全球化,娱乐互动化,无线化,全渠道”发展。    为实现全民互动 ...

数据可视化TableauEchartsIllustrator

学最有用的 第一章 : 导论 1-1 数据可视化应用及学习技巧 数据可视化作用: 1.信息记录(使用图形化的数据记录信 ...

EquivalentPrefixes

题目链接 题意:给你两个数组a,b,大小为n,让你寻找一个数p (1lt;= p lt;= n) ,使之在 1~p 任意 ...

了解测试系统的架构

系统可以分为c/s架构的系统与b/s架构的系统,c/s架构的系统又可以分为两种,第一种是基本不用与服务器连接的,比 ...

记录一次redis事故

公司在搞一次活动时,服务器一个应用服务出现异常,结果导致前端不断请求最终导致请求量过大,资源耗尽。 追踪原因: 1、调出 ...

毕业设计----maven使用ueditor编辑器

一、使用maven命令导入jar包1、 下载ueditorb压缩包,并解压 2、 在ueditor/jsp/lib ...

BOI2013TracksinthesnowFlood-fill

题目 boi 2013rostock, germanyapril 8 – may 12, 2013 b i day 2e ...

APP案例分析——嘀嗒番茄钟

第一部分 调研, 评测 个人第一次上手体验 一直在用时间管理的软件,但是下载了卸载,来来去去也用了很多个。这 ...

jQuery的节点添加、删除、替换等操作

//几种添加节点的方法//$("p").append("lt;bgt;你好吗?lt;/bgt;");//向p元素中追加《 ...

浅谈requirejs

最近在项目中用到require js,不是很熟悉,所以上网找了一些资料,结合代码学习了一下。其实,require j ...

bzoj3209花神的数论题

description 背景 众所周知,花神多年来凭借无边的神力狂虐各大 oj、oi、cf、tc 当然也包括 ch ...

【2017noip赛前】学习记录·我爱学习

今天莫名颓起了noip游记。 看了一下去年的复赛试题,啊,我果然是只蒟蒻! 1、(2017-10-30) 要学一下 l ...

Rust每日千行之旅<0>:源代码组织,Cargo入门

rust 源代码组织,使用配套的 cargo 工具,其功能强大,程序员可摆脱 c/c++ 中需要自行维护 make、cm ...

利用DBMS_FILE_TRANSFER迁移数据库从AIX至Linux

环境描述源端目标端操作系统aix 6100-03-10-1119rhel6.5 x64集群oracle rac+asmo ...

201723272018-2019-1《程序设计与数据结构》第四周学习总结

20172327 2018-2019-1 《程序设计与数据结构》第四周学习总结 教材学习内容总结 第六章 列表 列表集合 ...

JavaScript操作服务器控件之Gridview控件

1.javascript脚本如下: lt;script language="javascript" type="text ...