JSP技术-01-语法及运行原理

一.JSP简介

JSP全名为Java Server Pages(Java服务器页面),本质上是一个简化的Servlet,它是由Sun公司建立的一种动态网页技术标准。JSP技术是在传统的网页HTML文件中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(.jsp)。
JSP实现了HTML语法中的Java扩展(以 <%, %>形式)。JSP与Servlet一样,是在服务器端执行的。通常返回给客户端一个HTML文本。

JSP技术的特点:

1.跨平台:

JSP文件在执行时,首先由JSP引擎(即服务器,如Tomcat)解析生成.java文件,然后再由JVM执行。所以,JSP文件是由JVM间接执行的,而JVM是跨平台的,因此JSP文件就也可以跨平台执行。

2.业务与页面显示代码分离:

负责页面显示的Java代码直接写在JSP文件中,业务代码则写在Servlet中,实现了不同功能的代码分离

3.预编译:

用户访问第一次JSP页面,服务器对JSP页面代码进行一次编译,编译后的文件(.class)文件会在用户下次访问时继续使用,节约CPU资源

二.JSP运行原理:

JSP的工作模式是请求/响应模式,客户端首先发出HTTP请求,JSP程序收到请求后进行处理并返回结果

1.JSP文件的执行过程图:

JSP技术-01-语法及运行原理_第1张图片

2.JSP文件的执行步骤:

1.客户端发出请求,访问JSP文件
2.JSP容器将JSP文件转换为一个Java源文件(Java Servlet源程序)
3.Java源文件被编译执行生成相应字节码文件(.class),Servlet容器执行该字节码文件

3.JSP文件经编译生成的Java文件和字节码文件的位置:

JSP技术-01-语法及运行原理_第2张图片

index.jsp文件内容:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>跳转到主页title>
head>
<body>
<jsp:forward page="/page_common_index.action">jsp:forward>
body>
html>

经Tomcat转换生成的index_jsp.java文件内容:

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
//继承了HttpJspBase类(HttpServlet类的一个子类),所以index_jsp是一个Servlet
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map.lang.String,java.lang.Long> _jspx_dependants;

  private volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  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 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("\n");
      out.write("\n");
      out.write("\n");
      out.write("跳转到主页\n");
      out.write("\n");
      out.write("\n");
      if (true) {
        _jspx_page_context.forward("/page_common_index.action");
        return;
      }
      out.write("\n");
      out.write("\n");
      out.write("");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && 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);
    }
  }
}

三.JSP脚本:

1.JSP Scriptlets

<% java代码 %>

一段代码段,内部写java的变量,方法,语句用来实现一些复杂操作,JSP Scriptlets中声明的变量是JSP页面的局部变量,调用JSP Scriptlets时,会为局部变量分配内存空间,调用结束后,释放局部变量占有的内存空间。

2.JSP表达式(expression)

<%= java变量或表达式 >

用于将程序数据输出到客户端,标签内部的内容实际上是被System.out.println( )输出语句直接输出。如:jsp文件中的<%= a+b >标签在被Tomcat转换后在Java文件中的形式是System.out.println( a+b )

3.JSP声明语句

<%! 声明变量(java代码) %>

被声明的Java代码将被编译到JSPServelt的_jspService( )方法之外,即在JSP声明语句中定义的都是成员方法,成员变量,静态方法,静态变量,静态代码块等。在JSP声明语句中声明的方法和变量在整个JSP页面内有效。可以被多次访问。

四.JSP注释:

不同的注释可见范围是不同(即JSP文件执行过程中经过多步编译,每次编译后生成的文件中显示的注释是不同的)

注释类别 注释形式 可见范围
HTML注释 < ! - -注释内容 - - > JSP源码,封装成Servlet的Java文件中,页面显示的HTML源码
Java注释 //单行注释 /多行注释/ JSP源码,封装成Servlet的Java文件中
JSP注释 <%– 注释内容 –%> JSP源码

五.JSP指令

JSP的指令是指导JSP翻译和运行的命令,JSP包括三大指令:

1.page指令

属性最多的一个指令,根据不同的属性,设置整个页面的特性,例如,页面的编码方式,JSP页面采用的语言
格式:

<%@  page  属性名1="属性值1"  属性名2="属性值2" ...%>

常用属性如下:

属性 属性对应的功能
language 指明解释该JSP文件时应采用的语言,默认为Java。JSP脚本中还可以嵌入的多种语言
pageEncoding JSP文件的编码格式
contentType 客户端浏览器根据该属性判断文档类型,HTML文档格式为 text/html,纯文本格式为text/plain
session 指明该JSP内是否内置Session对象,如果有,则应设置值为true。默认值是true
import 设置导入那些jar包,page指令中唯一可以声明多次的指令属性。
errorPage 指定一个错误页面,如果JSP抛出为捕捉的异常,则转到该指令指向的页面(错误处理页面,isErrorPage属性为true)
isErrorPage 指定该页面是否为错误处理页面,如果为true,则该JSP内置有一个Exception类的对象,可以直接使用,默认值为false

2.include指令

页面包含(静态包含)指令,可以将一个jsp页面包含到另一个jsp页面中
格式:<%@ include file=”被包含的文件地址”%>
注:使用JSP的动作元素< jsp:include >可以进行动态包含,静态包含是在生成java文件前将两个JSP文件合为一个JSP文件,而动态包含则是在最终编译成二进制文件后,将两个二进制文件的内容显示在了一个页面中

3.taglib指令

在jsp页面中引入标签库(JSTL标签库、struts2标签库)
格式:<%@ taglib uri=”标签库地址” prefix=”前缀”%>

你可能感兴趣的:(JavaWeb知识总结,jsp)