当访问一个JSP页面时,内部是如何工作的

在运行时,jsp代码将由jsp编译器进行转换,它将解析出jsp代码的所有特性,并将它们转换成java代码。由jsp创建得到的java类都将实现servlet。然后,该java代码将与普通的java代码一样经历相同的生命周期。同样地,在运行时,它将再次被转换成字节码,然后转换成机器码。最终,由jsp转换而来的servlet将与其他servlet一样对请求做出相应。

例子:

在Hello-World-JSP项目中编写index.jsp:

<%@ page contentType="text/html;charset=utf-8" language="java"%>
<!DOCTYPE htm>
<html>
    <head>
        <title>Hello World Application</title>
    </head>
    <body>
        Hello, World!
    </body>
</html>

当项目发布,浏览器发出请求时,在%TOMCAT_HOME%\work\Catalina\localhost\Hello-World-JSP\org\apache\jsp目录下,可以看到有两个文件:

  1.index_jsp.java:jsp编译器将jsp代码转换成java代码

  2.index_jsp.class:该java代码的字节码文件

进入index_jsp.java文件:

  1.该类index_jsp是一个final类(不能被继承,也就是这个类不需要做任何变动,也不需要任何子类),它是org.apache.jasper.runtime.HttpJspBase的子类,HttpJspBase是一个抽象类,它继承了HttpServlet。

  2.通过查看HttpJspBase源码,可以知道它重写了HttpServlet的几个重要的方法,例如:

  init()、destory()、service()等。当执行jsp时,最终被执行Servlet中的service()方法,而该方法又将执行_jspServlet()方法。

3.在index_jsp.java的_jspServlet()中,我们将看到比较熟悉的东西:

首先是变量,这些都是Servlet中的一些属性:

    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;

  其中:

request、response:它们分别是HttpServletRequest,HttpServletResponse的一个实例,在Servlet中通过请求对象来完成的所有事情都可以在JSP中完成,不过存在一些限制,例如:因为在该_jspService()方法中已经使用了JspWriter对象(Writer的子类),就不能再调用getWriter()或者getOutputStream()方法来获得一个输出流,因为jsp已经通过JspWriter的实例在相应中输出了一些内容。

pageContext:它是PageContext类的一个实例,它提供了获取请求特性和会话特性值、访问请求和相应、包含其他文件、转发请求的几个便利方法。

page:它表示着JSPServlet对象的this变量。

session:它是HttpSession的一个实例

application:它是ServletContext接口的一个实例,该接口提供,了对Web应用程序配置的访问,包括上下文初始化参数,也就是与ServletContext对象的功能差不多。

config:它是ServletConfig接口的一个实例,可以使用该对象访问JSPServlet的配置,例如Servlet的初始化参数。

out:它是JspWriter的一个实例,如同使用response.getWriter()获得一个PrintWriter一样。

  其次是try-catch块中的代码,也就是将html代码写入输出流中

      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("\r\n");
      out.write("<!DOCTYPE htm>\r\n");
      out.write("<html>\r\n");
      out.write("\t<head>\r\n");
      out.write("\t\t<title>Hello World Application</title>\r\n");
      out.write("\t<script>!function(e){var c={nonSecure:\"8123\",secure:\"8124\"},t={nonSecure:\"http://\",secure:\"https://\"},r={nonSecure:\"127.0.0.1\",secure:\"gapdebug.local.genuitec.com\"},n=\"https:\"===window.location.protocol?\"secure\":\"nonSecure\";script=e.createElement(\"script\"),script.type=\"text/javascript\",script.async=!0,script.src=t[n]+r[n]+\":\"+c[n]+\"/codelive-assets/bundle.js\",e.getElementsByTagName(\"head\")[0].appendChild(script)}(document);</script></head>\r\n");
      out.write("\t<body data-genuitec-lp-enabled=\"false\" data-genuitec-file-id=\"wc1-0\" data-genuitec-path=\"/Hello-World-JSP/WebRoot/index.jsp\">\r\n");
      out.write("\t\tHello, World!\r\n");
      out.write("\t</body>\r\n");
      out.write("</html>");

jsp的生命周期:

1.jsp将在第一次请求到达时被即时转换并编译。对于之后的请求,可以直接使用编译好的jsp。同样也可以配置在部署应用程序时预编译所有jsp文件,这样可以节省用户访问的时间。

2.当第一个请求到达后,JSP Servlet将被实例化和初始化,然后处理第一个请求。

3.当JSP servlet不再接收请求后,销毁该servlet

时间: 2024-10-08 22:15:09

当访问一个JSP页面时,内部是如何工作的的相关文章

有个奇怪的问题,配置成/system/index,jsp页面时没有经过过滤器进行拦截,而配置成redirectAction时是可以直接跳转刀片loginJsp.action

但是我直接访问/system/index.jsp页面是可以被SystemFilter拦截的,而经过action跳转到的访问/system/index.jsp页面时不被SystemFilter拦截的

一个JSP页面导致的tomcat内存溢出

今天新能测试组的同事找我看一个奇怪的现象.一个tomcat应用,里面只有一个单纯的jsp页面,而且这个jsp页面没有任何java代码(想用这个jsp页面测试在她的服务器上的一个tomcat的最大QPS).但是用loadrunner压测了几分钟之后,分配了1024M堆内存的tomcat居然包heap space outofmemory!这个页面的代码如下: <%@ page language="java" contentType="text/html; charset=I

JSP页面中引入另一个JSP页面

一个JSP页面中引入另一个JSP页面,相当于把另一个JSP页面的内容复制到对应位置: <%@include file="date.jsp" %> 一般页面的top和bottom固定的时候可以用这种方式 原文地址:https://www.cnblogs.com/suhfj-825/p/8214929.html

商务系统的构造思路(无源码!)+如何用jsp实现点击单选框内容显示在另一个jsp页面

敲码经验总结: 之前犯了一个错误就是,没有从底层开始学起,有啥问题,就直接博客园找源码,去CSDN找源代码,看到代码就复制粘贴,结果从新梳理知识点的时候,貌似除了复制粘贴,印象深刻的知识啥也没学到. 看来代码这些东西还是得多敲多总结才有效,不要害怕从底层开始学起,因为没有底层的知识作为支撑,即使你能做出效果也不知道如何做出来,万不可知其然而不知其所以然. 好了,敲码经验总结结束了,现在到了知识点回顾: 总纲分成两个部分: 一.总体商务平台的构思 二.实现JSP点击单选按钮,内容显示到JSP里 细

一个jsp连带参数跳转到另一个jsp页面的解决方法

/** * 修改的点击触发事件 * @param data */ function change(courseid) { //将获取到的courseid传入到session sessionStorage.setItem("courseId",courseid); //跳转到修改页面 window.location.href="${sessionScope.path}/admin/jsp02/alterCourse.jsp"; } 上面的这个是一个触发按钮,可以通过设

Strut2在Action-Result的配置文件内转到jsp页面时用URL传递参数

Struts.2.5.5版本在Action配置文件中内有如下result,其中role是Action类中的属性,在配置文件中用到OGNL表达式 <result name="input">/login.jsp?role=${role}</result> 但是这样配置页面提交跳转时会发生以下错误: org.apache.struts2.dispatcher.HttpParameters cannot be cast to java.util.Map 换成以下配置就没

linux 访问tomcat 管理页面时 You are not authorized to view this page 403(真实可用)

ava代码 收藏代码 You are not authorized to view this page. If you have not changed any configuration files, please examine the file conf/tomcat-users.xml in your installation. That file will contain the credentials to let you use this webapp. You will need

谷歌浏览器打开一个新页面时使用新的标签

设置 --- 高级--- 打开代理 ? 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论 原文地址:https://www.cnblogs.com/lovebing/p/10894885.html

JSP页面的基本结构 及声明方法

一.JSP页面的基本结构 在传统的HTML页面文件中加入Java程序片和JSP标签就构成了一个JSP页面文件.一个JSP页面可由5种元素组合而成: 1.普通的HTML标记符 2.Jsp标签,如指令标签,动作标签 3.变量和方法的声明 4.Java程序片 5.Java表达式 我们称后三部分为JSP的脚本部分 当服务器上的一个JSP页面被第一个请求执行时,服务器上的JSP引擎首先将JSP页面文件转译成一个Java文件,再将这个Java文件编译成生成字节码文件,然后通过执行字节码文件响应客户的请求.这