优秀的编程知识分享平台

网站首页 > 技术文章 正文

《JSP》第05节:JSP基础语法之JSP声明(定义变量、方法)

nanyue 2024-07-29 01:22:39 技术文章 10 ℃

前面几个小节,已经把JSP程序的创建以及运行原理都介绍完了,这一小节开始介绍具体的JSP语法。JSP本质上是Servlet,Servlet是采用Java语言编写的,所以JSP语法也是要满足Java语法。

JSP是经过JSP引擎渲染成Servlet程序,那么渲染过程中,就需要知道渲染的规则,这些规则也就是我们需要学习的JSP基础语法,这一小节学习JSP声明的语法。

1.1、JSP声明基础语法

JSP声明,是指:在JSP文件中,使用JSP的声明语法,定义Java成员变量、定义Java方法。也就是说,JSP声明是在编译之后的JSP程序源代码的类里面,嵌入定义的Java变量、嵌入定义的Java方法。语法规则如下所示:

<%!
   在这里定义变量、定义方法
%>

注意:必须先定义JSP声明,后续才能使用定义的JSP声明

案例代码如下所示:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSP基础语法之JSP声明</title>
</head>
<body>
    <h3>JSP基础语法之JSP声明</h3>
    <%!
        // 在这里定义Java变量
        int i = 0;
        
        // 在这里定义Java方法
        public void demoMethod() {
            System.out.println("JSP基础语法之JSP声明");
        }
    %>

    <%
        // 使用定义的变量
        System.out.println("JSP基础语法之JSP声明的变量i=" + i);
        
        // 使用定义的方法
        demoMethod();
    %>
</body>
</html>

启动工程,浏览器访问http://localhost:8080/servlet/demo.jsp,IDEA控制台可以看到如下日志:

1.2、JSP声明的本质

JSP声明,你可以理解成:就是在JSP编译之后的Servlet程序中,在该类里面定义Java变量、定义Java方法、定义代码块。JSP声明中的代码,最终会被嵌入到JSP编译生成的Servlet类里面。查看上面JSP文件编译之后的源代码:

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/8.5.98
 * Generated at: 2024-02-24 11:31:26 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 com.gitcode.servlet;

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

public final class demo_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {


        // 在这里定义Java变量
        int i = 0;

        // 在这里定义Java方法
        public void demoMethod() {
            System.out.println("JSP基础语法之JSP声明");
        }
    
  private static final JspFactory _jspxFactory =
          JspFactory.getDefaultFactory();

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

  private static final java.util.Set<String> _jspx_imports_packages;

  private static final java.util.Set<String> _jspx_imports_classes;

  static {
    _jspx_imports_packages = new java.util.HashSet<>();
    _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.Map<String, Long> getDependants() {
    return _jspx_dependants;
  }

  public java.util.Set<String> getPackageImports() {
    return _jspx_imports_packages;
  }

  public java.util.Set<String> 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 HttpServletRequest request, final HttpServletResponse response)
      throws java.io.IOException, ServletException {

    final String _jspx_method = request.getMethod();
    if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !DispatcherType.ERROR.equals(request.getDispatcherType())) {
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
      return;
    }

    final PageContext pageContext;
    HttpSession session = null;
    final ServletContext application;
    final ServletConfig config;
    JspWriter out = null;
    final Object page = this;
    JspWriter _jspx_out = null;
    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("\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("    <title>JSP基础语法之JSP声明</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("    <h3>JSP基础语法之JSP声明</h3>\r\n");
      out.write("    ");
      out.write("\r\n");
      out.write("\r\n");
      out.write("    ");

        // 使用定义的变量
        System.out.println("JSP基础语法之JSP声明的变量i=" + i);

        // 使用定义的方法
        demoMethod();
    
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>\r\n");
    } catch (Throwable t) {
      if (!(t instanceof 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声明中定义的代码,最终会被嵌入到类的最前面位置,如下所示:

到此,JSP声明的语法就介绍完啦。

今天就到这里,未完待续~~

最近发表
标签列表