JSP 的 4 种基本语法

小吴
2022-12-25 / 0 评论 / 9 阅读 / 正在检测是否收录...

  前面已经讲过,编写 JSP 页面非常简单:在静态 HTML 页面中“镶”动态 Java 脚本即可。现在开始学习的内容是:JSP 页面的 4 种基本语法——也就是 JSP 允许在静态 HTML 页面中“镶嵌”的成分。掌握这4种语法之后,读者即可按如下步骤开发JSP页面。
  ① 编写一个静态 HTML 页面。
  ② 用合适的语法向静态 HTML 页面中“镶嵌”4 种基本语法的一种或多种,这样即可为静态 HTML 页面增加动态内容。

JSP 注释

  JSP 注释用于标注在程序开发过程中的开发提示,它不会输出到客户端
  JSP注释的格式如下:

<%-- 注释内容 --%>

  与 JSP 注释形成对比的是 HTML 注释,HTML 注释的格式是:

<!-- 注释内容 -->

  看下面的 JSP 页面。

<%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %>
<html>
<head>
    <title> 注释示例 </title>
</head>
<body>
注释示例
<!-- 增加 JSP 注释 -->
<%-- JSP 注释部分 --%>
<!-- 增加 HTML 注释 -->
<!-- HTML 注释部分 -->
</body>
</html>

  上面的页面中第 9 行代码是 JSP 注释,其他注释都是 HTML 注释。在浏览器中浏览该页面,看页面源代码,页面的源代码如下:

<html>
<head>
    <title> 注释示例 </title>
</head>
<body>
注释示例
<!-- 增加 JSP 注释 -->

<!-- 增加 HTML 注释 -->
<!-- HTML 注释部分 -->
</body>
</html>

  在上面的源代码中可看到,HTML 的注释可以通过源代码查看到,但 JSP 的注释是无法通过源代码查看到的。这表明 JSP 注释不会被发送到客户端。

JSP 声明

  JSP 声明用于声明变量和方法。在 JSP 声明中声明方法看起来很特别,似乎不需要定义类就可以直接定义方法,方法似乎可以脱离类独立存在。实际上,JSP 声明将会转换成对应 Servlet 的成员变量或成员方法,因此 JSP 声明依然符合 Java 语法。
  JSP 声明的语法格式如下:

<%! 声明部分 %>

  看下面使用JSP声明的示例页面。

<%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %>
<!DOCTYPE html>
<html>
<head>
    <title>Document</title>
</head>
<!-- 下面是 JSP 声明部分 -->
<%!
// 声明一个整型变量
public int count;
// 声明一个方法
public String info(){
    return "hello";
}
%>
<body>
<%
out.println(count++);
%>
<br/>
<%
// 输出 info() 方法的返回值
out.println(info());
%>
</body>
</html>

  在浏览器中测试该页面时,可以看到正常输出了 count 值,每刷新一次,count 值将加 1,同时也可以看到正常输出了 info()方法的返回值。
  上面的代码中声明了一个整型变量和一个普通方法,表面上看起来这个变量和方法不属于任何类,似乎可以独立存在,但这只是一个假象。打开 Tomcat 的 work\Catalina\localhost\basicSyntax\org\apache\jsp 目录下的 declare_jsp.java 文件,看到如下代码片段:

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

 // 声明一个整型变量
 public int count;
 // 声明一个方法
 public String info(){
     return "hello";
 }
 ···
}

  上面的代码与 JSP 页面的声明部分完全对应,这表明 JSP 页面的声明部分将转换成对应Servlet的成员变量或成员方法。

  打开多个浏览器,甚至可以在不同的机器上打开浏览器来刷新该页面,将发现所有客户端访问的 count 值是连续的,即所有客户端共享了同一个 count 变量。这是因为:JSP 页面会编译成一个 Servlet 类,每个 Servlet 在容器中只有一个实例;在 JSP 中声明的变量是成员变量,成员变量只在创建实例时初始化,该变量的值将一直保存,直到实例销毁。
  值得注意的是,info()的值也可正常输出。因为 JSP 声明的方法其实是在 JSP 编译中生成的 Servlet 的实例方法——Java 里的方法是不能独立存在的,即使在 JSP 页面中也不行。

输出 JSP 表达式

  JSP 提供了一种输出表达式值的简单方法,输出表达式值的语法格式如下:

<%=表达式%>

  看下面的 JSP 页面,该页面使用输出表达式的方式输出变量和方法返回值。

<%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %>
<!DOCTYPE html>
<html>
<head>
    <title> 输出表达式 </title>
</head>
<%!
public int count;

public String info(){
    return "hello";
}
%>
<body>
<!-- 使用表达式输出变量值 -->
<%=count++%>
<br/>
<!-- 使用表达式输出方法返回值 -->
<%=info()%>
</body>
</html>

  上面的页面中 body 标签内的代码使用输出表达式的语法代替了原来的 out.println 输出语句,该页面的执行效果与前一个页面的执行效果没有区别。由此可见,输出表达式将转换成 Servlet 里的输出语句。

JSP 脚本

  以前 JSP 脚本的应用非常广泛,因此 JSP 脚本里可以包含任何可执行的的 Java 代码。通常来说,所有可执行性 Java 代码都可通过 JSP 脚本嵌入 HTML 页面。看下面使用 JSP 脚本的示例程序。

<%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %>
<!DOCTYPE html>
<html>
<head>
  <title> 小脚本测试 </title>
</head>
<body>
<table bgcolor="#9999dd" border="1" width="300px">
<!-- Java脚本,这些脚本会对HTML的标签产生作用 -->
<%
for(int i = 0; i < 10; i++){
%>
  <!-- 上面的循环将控制<tr>标签循环 -->
  <tr>
    <td>循环值:</td>
    <td><%=i%></td>
  </tr>
<%
}
%>
</table>
</body>
</html>

  上面的页面中 for 循环语句就是使用 JSP 脚本的代码,这些代码可以控制页面中静态内容。上面例子程序将<tr.../>标签循环 10 次,即生成一个 10 行的表格,并在表格中输出表达式值。
  在浏览器中浏览该页面,将看到如下图所示的效果。

使用脚本动态生成10行

  接下来打开 Tomcat 的 work\Catalina\localhost\basicSyntax\org\apache\jsp 路径下的 scriptlet_jsp.java 文件,将看到如下代码片段:

public final class scriptlet_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {
 ···
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {
   ···
      out.write("\r\n");
      out.write("<!DOCTYPE html>\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("  <title> 小脚本测试 </title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("<table bgcolor=\"#9999dd\" border=\"1\" width=\"300px\">\r\n");
      out.write("<!-- Java脚本,这些脚本会对HTML的标签产生作用 -->\r\n");

for(int i = 0; i < 10; i++){

      out.write("\r\n");
      out.write("  <!-- 上面的循环将控制<tr>标签循环 -->\r\n");
      out.write("  <tr>\r\n");
      out.write("    <td>循环值:</td>\r\n");
      out.write("    <td>");
      out.print(i);
      out.write("</td>\r\n");
      out.write("  </tr>\r\n");

}

      out.write("\r\n");
      out.write("</table>\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
      ···
  }
}

  上面的代码片段中 for 循环完全对应于 scriptlet.jsp 页面中的小脚本部分。由上面代码片段可以看,JSP脚本将转换成 Servlet 里_jspService 方法的可执行性代码。这意味着在 JSP 小脚本部分也可以声变量,但在 JSP 脚本部分声明的变量是局部变量,但不能使用 private、public 等访问控制符修饰,也不可使用 static 修饰。

  因为 JSP 脚本中可以放置任何可执行性语句,所以可以充分利用 Java 语言的功能,例如连接数据库和执行数据库操作。看下面的 JSP 页面执行数据库查询。

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title> 小脚本测试 </title>
</head>
<body>
<%
// 注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3308/javaee","root","root");
// 创建Statement
Statement stmt = conn.createStatement();
// 执行查询
ResultSet rs = stmt.executeQuery("select * from news_inf");
%>
<table bgcolor="#9999dd" border="1" width="300">
<%
// 遍历结果集
while(rs.next())
{%>
    <tr>
        <!-- 输出结果集 -->
        <td><%=rs.getString(1)%></td>
        <td><%=rs.getString(2)%></td>
    </tr>
<%}%>
<table>
</body>
</html>

  上面程序中的脚本执行了连接数据库,执行 SQL 查询,并使用输出表达式语法来输出查询结果。在浏览器中浏览该页面,将看到如下图所示的效果。

JSP脚本查询数据库

  上面的页面执行 SQL 查询需要使用 MySQL 驱动程序,所以读者应该将 MySQL 驱动的 JAR 文件放在 Tomcat 的 lib 路径下(所有 Web 应用都可使用 MySQL 驱动),或者将 MySQL 驱动复制到该 Web 应用的 WEB-INF/lib 路径下(只有该 Web 应用可使用 MySOL 驱动)。除此之外,由于本 JSP 需要查询 javaee 数据库下的 news_inf 数据表,所以不要忘记了将 data.sql 导入数据库。

2

评论

博主关闭了当前页面的评论