一、什么是JSP?

  JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。
  JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。

二、JSP原理

2.1、Web服务器是如何调用并执行一个jsp页面的?

  浏览器向服务器发请求,不管访问的是什么资源,其实都是在访问Servlet,所以当访问一个jsp页面时,其实也是在访问一个Servlet,服务器在执行jsp的时候,首先把jsp翻译成一个Servlet,所以我们访问jsp时,其实不是在访问jsp,而是在访问jsp翻译过后的那个Servlet,例如下面的代码:

index.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <%
3 String path = request.getContextPath();
4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
5 %>
6
7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
8 <html>
9 <head>
10 <base href="<%=basePath%>">
11
12 <title>First Jsp</title>
13
14 </head>
15
16 <body>
17 <%
18 out.print("Hello Jsp");
19 %>
20 </body>
21 </html>

  当我们通过浏览器访问index.jsp时,服务器首先将index.jsp翻译成一个index_jsp.class,在Tomcat服务器的work\Catalina\localhost\项目名\org\apache\jsp目录下可以看到index_jsp.class的源代码文件index_jsp.java,index_jsp.java的代码如下:

 1 package org.apache.jsp;
2
3 import javax.servlet.*;
4 import javax.servlet.http.*;
5 import javax.servlet.jsp.*;
6 import java.util.*;
7
8 public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
9 implements org.apache.jasper.runtime.JspSourceDependent {
10
11 private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
12
13 private static java.util.List _jspx_dependants;
14
15 private javax.el.ExpressionFactory _el_expressionfactory;
16 private org.apache.AnnotationProcessor _jsp_annotationprocessor;
17
18 public Object getDependants() {
19 return _jspx_dependants;
20 }
21
22 public void _jspInit() {
23 _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
24 _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
25 }
26
27 public void _jspDestroy() {
28 }
29
30 public void _jspService(HttpServletRequest request, HttpServletResponse response)
31 throws java.io.IOException, ServletException {
32
33 PageContext pageContext = null;
34 HttpSession session = null;
35 ServletContext application = null;
36 ServletConfig config = null;
37 JspWriter out = null;
38 Object page = this;
39 JspWriter _jspx_out = null;
40 PageContext _jspx_page_context = null;
41
42
43 try {
44 response.setContentType("text/html;charset=UTF-8");
45 pageContext = _jspxFactory.getPageContext(this, request, response,
46 null, true, 8192, true);
47 _jspx_page_context = pageContext;
48 application = pageContext.getServletContext();
49 config = pageContext.getServletConfig();
50 session = pageContext.getSession();
51 out = pageContext.getOut();
52 _jspx_out = out;
53
54 out.write('\r');
55 out.write('\n');
56
57 String path = request.getContextPath();
58 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
59
60 out.write("\r\n");
61 out.write("\r\n");
62 out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
63 out.write("<html>\r\n");
64 out.write(" <head>\r\n");
65 out.write(" <base href=\"");
66 out.print(basePath);
67 out.write("\">\r\n");
68 out.write(" \r\n");
69 out.write(" <title>First Jsp</title>\r\n");
70 out.write("\t\r\n");
71 out.write(" </head>\r\n");
72 out.write(" \r\n");
73 out.write(" <body>\r\n");
74 out.write(" ");
75
76 out.print("Hello Jsp");
77
78 out.write("\r\n");
79 out.write(" </body>\r\n");
80 out.write("</html>\r\n");
81 } catch (Throwable t) {
82 if (!(t instanceof SkipPageException)){
83 out = _jspx_out;
84 if (out != null && out.getBufferSize() != 0)
85 try { out.clearBuffer(); } catch (java.io.IOException e) {}
86 if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
87 }
88 } finally {
89 _jspxFactory.releasePageContext(_jspx_page_context);
90 }
91 }
92 }

  我们可以看到,index_jsp这个类是继承 org.apache.jasper.runtime.HttpJspBase这个类的,通过查看Tomcat服务器的源代码,可以知道在apache-tomcat-6.0.20-src\java\org\apache\jasper\runtime目录下存HttpJspBase这个类的源代码文件,如下图所示:

  aaarticlea/png;base64,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" alt="" />

我们可以看看HttpJsBase这个类的源代码,如下所示:

 1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 package org.apache.jasper.runtime;
19
20 import java.io.IOException;
21
22 import javax.servlet.ServletConfig;
23 import javax.servlet.ServletException;
24 import javax.servlet.http.HttpServlet;
25 import javax.servlet.http.HttpServletRequest;
26 import javax.servlet.http.HttpServletResponse;
27 import javax.servlet.jsp.HttpJspPage;
28 import javax.servlet.jsp.JspFactory;
29
30 import org.apache.jasper.compiler.Localizer;
31
32 /**
33 * This is the super class of all JSP-generated servlets.
34 *
35 * @author Anil K. Vijendran
36 */
37 public abstract class HttpJspBase
38 extends HttpServlet
39 implements HttpJspPage
40
41
42 {
43
44 protected HttpJspBase() {
45 }
46
47 public final void init(ServletConfig config)
48 throws ServletException
49 {
50 super.init(config);
51 jspInit();
52 _jspInit();
53 }
54
55 public String getServletInfo() {
56 return Localizer.getMessage("jsp.engine.info");
57 }
58
59 public final void destroy() {
60 jspDestroy();
61 _jspDestroy();
62 }
63
64 /**
65 * Entry point into service.
66 */
67 public final void service(HttpServletRequest request, HttpServletResponse response)
68 throws ServletException, IOException
69 {
70 _jspService(request, response);
71 }
72
73 public void jspInit() {
74 }
75
76 public void _jspInit() {
77 }
78
79 public void jspDestroy() {
80 }
81
82 protected void _jspDestroy() {
83 }
84
85 public abstract void _jspService(HttpServletRequest request,
86 HttpServletResponse response)
87 throws ServletException, IOException;
88 }

  HttpJspBase类是继承HttpServlet的,所以HttpJspBase类是一个Servlet,而index_jsp又是继承HttpJspBase类的,所以index_jsp类也是一个Servlet,所以当浏览器访问服务器上的index.jsp页面时,其实就是在访问index_jsp这个Servlet,index_jsp这个Servlet使用_jspService这个方法处理请求。

2.2、Jsp页面中的html排版标签是如何被发送到客户端的?

浏览器接收到的这些数据

 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2 <html>
3 <head>
4 <base href="http://localhost:8080/JavaWeb_Jsp_Study_20140603/">
5
6 <title>First Jsp</title>
7
8 </head>
9
10 <body>
11 Hello Jsp
12 </body>
13 </html>

都是在_jspService方法中使用如下的代码输出给浏览器的:

 1 out.write('\r');
2 out.write('\n');
3
4 String path = request.getContextPath();
5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
6
7 out.write("\r\n");
8 out.write("\r\n");
9 out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
10 out.write("<html>\r\n");
11 out.write(" <head>\r\n");
12 out.write(" <base href=\"");
13 out.print(basePath);
14 out.write("\">\r\n");
15 out.write(" \r\n");
16 out.write(" <title>First Jsp</title>\r\n");
17 out.write("\t\r\n");
18 out.write(" </head>\r\n");
19 out.write(" \r\n");
20 out.write(" <body>\r\n");
21 out.write(" ");
22
23 out.print("Hello Jsp");
24
25 out.write("\r\n");
26 out.write(" </body>\r\n");
27 out.write("</html>\r\n");

  在jsp中编写的java代码和html代码都会被翻译到_jspService方法中去,在jsp中编写的java代码会原封不动地翻译成java代码,如<%out.print("Hello Jsp");%>直接翻译成out.print("Hello Jsp");,而HTML代码则会翻译成使用out.write("<html标签>\r\n");的形式输出到浏览器。在jsp页面中编写的html排版标签都是以out.write("<html标签>\r\n");的形式输出到浏览器,浏览器拿到html代码后才能够解析执行html代码。

2.3、Jsp页面中的java代码服务器是如何执行的?

  在jsp中编写的java代码会被翻译到_jspService方法中去,当执行_jspService方法处理请求时,就会执行在jsp编写的java代码了,所以Jsp页面中的java代码服务器是通过调用_jspService方法处理请求时执行的。

2.4、Web服务器在调用jsp时,会给jsp提供一些什么java对象?

  查看_jspService方法可以看到,Web服务器在调用jsp时,会给Jsp提供如下的8个java对象

1 PageContext pageContext;
2 HttpSession session;
3 ServletContext application;
4 ServletConfig config;
5 JspWriter out;
6 Object page = this;
7 HttpServletRequest request,
8 HttpServletResponse response

  其中page对象,request和response已经完成了实例化,而其它5个没有实例化的对象通过下面的方式实例化

1 pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true);
2 application = pageContext.getServletContext();
3 config = pageContext.getServletConfig();
4 session = pageContext.getSession();
5 out = pageContext.getOut();

这8个java对象在Jsp页面中是可以直接使用的,如下所示:

 1 <%
2 session.setAttribute("name", "session对象");//使用session对象,设置session对象的属性
3 out.print(session.getAttribute("name")+"<br/>");//获取session对象的属性
4 pageContext.setAttribute("name", "pageContext对象");//使用pageContext对象,设置pageContext对象的属性
5 out.print(pageContext.getAttribute("name")+"<br/>");//获取pageContext对象的属性
6 application.setAttribute("name", "application对象");//使用application对象,设置application对象的属性
7 out.print(application.getAttribute("name")+"<br/>");//获取application对象的属性
8 out.print("Hello Jsp"+"<br/>");//使用out对象
9 out.print("服务器调用index.jsp页面时翻译成的类的名字是:"+page.getClass()+"<br/>");//使用page对象
10 out.print("处理请求的Servlet的名字是:"+config.getServletName()+"<br/>");//使用config对象
11 out.print(response.getContentType()+"<br/>");//使用response对象
12 out.print(request.getContextPath()+"<br/>");//使用request对象
13 %>

运行结果如下:

  

2.5、Jsp最佳实践

  Jsp最佳实践就是jsp技术在开发中该怎么去用。

  不管是JSP还是Servlet,虽然都可以用于开发动态web资源。但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。其原因为,程序的数据通常要美化后再输出:让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。

2.6、Tomcat服务器的执行流程

  

第一次执行:

  1. 客户端通过电脑连接服务器,因为是请求是动态的,所以所有的请求交给WEB容器来处理
  2. 在容器中找到需要执行的*.jsp文件
  3. 之后*.jsp文件通过转换变为*.java文件
  4. *.java文件经过编译后,形成*.class文件
  5. 最终服务器要执行形成的*.class文件

第二次执行:

  1. 因为已经存在了*.class文件,所以不在需要转换和编译的过程

修改后执行:

1.源文件已经被修改过了,所以需要重新转换,重新编译。

javaweb学习总结(十四)——JSP原理(转)的更多相关文章

  1. javaweb学习总结(十四)——JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  2. java web学习总结(十四) -------------------JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  3. javaweb(十四)——JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  4. JavaWeb---总结(十四)JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  5. JavaWeb学习 (二十四)————Filter(过滤器)常见应用

    一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import ja ...

  6. javaweb学习总结(十八)——JSP属性范围

    所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...

  7. javaweb学习总结(十五)——JSP基础语法

    任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. 一.JSP模版元素 JSP页面中的HTML内容称之 ...

  8. javaweb学习总结(十八)——JSP属性范围(转)

    所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...

  9. javaweb学习总结(十五)——JSP基础语法(转)

    任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. 一.JSP模版元素 JSP页面中的HTML内容称之 ...

随机推荐

  1. Visual Studio Professional 2015 简体中文专业版 序列号

    Visual Studio Professional 2015 简体中文专业版 专业版激活密钥:HMGNV-WCYXV-X7G9W-YCX63-B98R2 Visual Studio Enterpri ...

  2. const,static,extern,#define

    一.const // 简单定义变量,可以修改变量的值 ; a = ; // const的用法 // 用法一: ; ; // 不允许修改,因为 const 修饰 b/c,指定 b/c 为常量!! // ...

  3. 如何在 JavaScript 中更好地使用数组

    使用 Array.includes 替代 Array.indexOf “如果需要在数组中查找某个元素,请使用 Array.indexOf.” 我记得在我学习 JavaScript 的课程中有类似的这么 ...

  4. 【线性基】bzoj2322: [BeiJing2011]梦想封印

    线性基的思维题+图常见套路 Description 渐渐地,Magic Land上的人们对那座岛屿上的各种现象有了深入的了解. 为了分析一种奇特的称为梦想封印(Fantasy Seal)的特技,需要引 ...

  5. 【Python学习之七】递归——汉诺塔问题的算法理解

    汉诺塔问题 汉诺塔的移动可以用递归函数非常简单地实现.请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A.B.C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的 ...

  6. LeetCode之Weekly Contest 102

    第一题:905. 按奇偶校验排序数组 问题: 给定一个非负整数数组 A,返回一个由 A 的所有偶数元素组成的数组,后面跟 A 的所有奇数元素. 你可以返回满足此条件的任何数组作为答案. 示例: 输入: ...

  7. 浅探webpack优化

    由于前端的快速发展,相关工具的发展速度也是相当迅猛,各大框架例如vue,react都有自己优秀的脚手架工具来帮助我们快速启动一个新项目,也正式因为这个原因,我们对于脚手架中最关键的一环webpack相 ...

  8. 多线程辅助类之CountDownLatch(三)

    CountDownLatch信号灯是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.它可以实现多线程的同步互斥功能,和wait和notify方法实现功能类似,具体 ...

  9. 面向对象之元类(metaclass)

    一.前言: 要搞懂元类必须要搞清楚下面几件事: 类创建的时候,内部过程是什么样的,也就是我们定义类class 类名()的过程底层都干了些啥 类的调用即类的实例化过程的了解与分析 我们已经知道元类存在的 ...

  10. Struts2和Spring MVC 区别 今天面试被问到了

    虽然说没有系统的学习过Spring MVC框架, 但是工作这么长时间, 基本上在WEB层使用的都是Spring MVC, 自己觉得Struts2也是一个不错的WEB层框架, 这两种框架至今自己还未有比 ...