整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

《JSP》第05节:JSP基础语法之JSP声明(定义

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

面几个小节,已经把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声明的语法就介绍完啦。

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

JavaBean是特殊的Java类,使用J ava语言书写,并且遵守JavaBean API规范。

接下来给出的是JavaBean与其它Java类相比而言独一无二的特征:

  • 提供一个默认的无参构造函数。

  • 需要被序列化并且实现了Serializable接口。

  • 可能有一系列可读写属性。

  • 可能有一系列的"getter"或"setter"方法。

JavaBean属性

一个JavaBean对象的属性应该是可访问的。这个属性可以是任意合法的Java数据类型,包括自定义Java类。

一个JavaBean对象的属性可以是可读写,或只读,或只写。JavaBean对象的属性通过JavaBean实现类中提供的两个方法来访问:

方法描述
getPropertyName()举例来说,如果属性的名称为myName,那么这个方法的名字就要写成getMyName()来读取这个属性。这个方法也称为访问器。
setPropertyName()举例来说,如果属性的名称为myName,那么这个方法的名字就要写成setMyName()来写入这个属性。这个方法也称为写入器。

一个只读的属性只提供getPropertyName()方法,一个只写的属性只提供setPropertyName()方法。

JavaBean 程序示例

这是StudentBean.java文件:

package com.runoob;

public class StudentsBean implements java.io.Serializable

{

private String firstName=null;

private String lastName=null;

private int age=0;

public StudentsBean() {

}

public String getFirstName(){

return firstName;

}

public String getLastName(){

return lastName;

}

public int getAge(){

return age;

}

public void setFirstName(String firstName){

this.firstName=firstName;

}

public void setLastName(String lastName){

this.lastName=lastName;

}

public void setAge(int age) {

this.age=age;

}

}

编译 StudentBean.java 文件(最后一个实例会用到):

$ javac StudentsBean.java

编译后获得 StudentBean.class 文件,将其拷贝到 <JSP 项目>/WebContent/WEB-INF/classes/com/runoob,如下图所示:

访问JavaBean

<jsp:useBean> 标签可以在JSP中声明一个JavaBean,然后使用。声明后,JavaBean对象就成了脚本变量,可以通过脚本元素或其他自定义标签来访问。<jsp:useBean>标签的语法格式如下:

<jsp:useBean id="bean 的名字" scope="bean 的作用域" typeSpec/>

其中,根据具体情况,scope的值可以是page,request,session或application。id值可任意只要不和同一JSP文件中其它<jsp:useBean>中id值一样就行了。

接下来给出的是 <jsp:useBean> 标签的一个简单的用法:

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

pageEncoding="UTF-8"%>

<html>

<head>

<title>useBean 实例</title>

</head>

<body>

<jsp:useBean id="date" class="java.util.Date" />

<p>日期为:<%=date %>

</body>

</html>

它将会产生如下结果:

日期为:Tue Jun 28 15:22:24 CST 2016

访问 JavaBean 对象的属性

<jsp:useBean> 标签主体中使用 <jsp:getProperty/> 标签来调用 getter 方法,使用 <jsp:setProperty/> 标签来调用 setter 方法,语法格式如下:

<jsp:useBean id="id" class="bean 编译的类" scope="bean 作用域">

<jsp:setProperty name="bean 的 id" property="属性名"

value="value"/>

<jsp:getProperty name="bean 的 id" property="属性名"/>

...........

</jsp:useBean>

name属性指的是Bean的id属性。property属性指的是想要调用的getter或setter方法。

接下来给出使用以上语法进行属性访问的一个简单例子:

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

pageEncoding="UTF-8"%>

<html>

<head>

<title>get 和 set 属性实例</title>

</head>

<body>

<jsp:useBean id="students"

class="com.runoob.StudentsBean">

<jsp:setProperty name="students" property="firstName"

value="小强"/>

<jsp:setProperty name="students" property="lastName"

value="王"/>

<jsp:setProperty name="students" property="age"

value="10"/>

</jsp:useBean>

<p>学生名字:

<jsp:getProperty name="students" property="firstName"/>

</p>

<p>学生姓氏:

<jsp:getProperty name="students" property="lastName"/>

</p>

<p>学生年龄:

<jsp:getProperty name="students" property="age"/>

</p>

</body>

</html>

访问以上 JSP,运行结果如下:

学生名字: 小强

学生姓氏: 王

学生年龄: 10

如您还有不明白的可以在下面与我留言或是与我探讨QQ群308855039,我们一起飞!

SP指令是指:用于设置JSP页面相关属性的一个语法命令,例如:设置页面编码字符集、导入其他包等等。JSP中提供了三个指令,分别是:page指令、include指令、taglib指令。其中page指令用于设置JSP页面属性,include指令用于引入其他的JSP文件,taglib指令用于引入标签库。这一小节内容介绍include指令的使用。

1.1、include指令作用

include指令作用:将指定的文件引入到当前JSP页面里面。include指令会将引入的文件内容嵌入到当前JSP页面中的对应位置。

<%@ include file="文件的相对路径" %>

案例代码:

  • 创建一个header.jsp文件。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>这是HTML头部</title>
</head>
  • 创建一个include.jsp文件。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入头部文件 --%>
<%@ include file="header.jsp" %>
<body>

<div style="background-color: cadetblue">
    这是正文内容区域
</div>

<%-- 引入底部文件 --%>
<%@ include file="footer.html" %>
</body>
</html>
  • 创建一个footer.jsp文件。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<div style="background-color: antiquewhite;">
  这是footer底部内容区域
</div>

启动Tomcat容器,浏览器访问http://localhost:8080/servlet/include.jsp,结果如下:

1.2、include指令的本质

include指令的本质是什么呢???我们来查看下编译之后的Java源代码,找到上面include.jsp文件编译之后的源文件,如下所示:

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/8.5.98
 * Generated at: 2024-02-25 05:06:41 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 include_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.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  static {
    _jspx_dependants=new java.util.HashMap<java.lang.String,java.lang.Long>(2);
    _jspx_dependants.put("/footer.jsp", Long.valueOf(1708837593266L));
    _jspx_dependants.put("/header.jsp", Long.valueOf(1708837593271L));
  }

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

  private static final java.util.Set<java.lang.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<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

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

  public java.util.Set<java.lang.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 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) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
      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('\r');
      out.write('\n');
      out.write('\r');
      out.write('\n');
      out.write("\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("    <title>这是HTML头部</title>\r\n");
      out.write("</head>");
      out.write("\r\n");
      out.write("<body>\r\n");
      out.write("\r\n");
      out.write("<div style=\"background-color: cadetblue\">\r\n");
      out.write("    这是正文内容区域\r\n");
      out.write("</div>\r\n");
      out.write("\r\n");
      out.write('\r');
      out.write('\n');
      out.write("\r\n");
      out.write("<div style=\"background-color: antiquewhite;\">\r\n");
      out.write("  这是footer底部内容区域\r\n");
      out.write("</div>");
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } 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);
    }
  }
}

通过上面源代码,可以看到,使用include指令引入的两个文件,最终都会将两个文件中的内容直接嵌入到当前include.jsp文件里面,如下所示:

所以include指令的本质就是将引入文件中的内容,直接拼接到当前JSP页面的对应位置。这里也就会存在一个问题,引入的JSP文件中,不能存在和当前JSP页面相同的变量名称,因为变量名称相同会导致编译失败。另外,使用include指令引入其他的JSP文件时候,只会生成访问的那个JSP文件的源代码,被引入的JSP文件不会生成对应的源代码。

以上,就是include指令的使用及其本质。

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