6.2.2 在JSP中嵌入Java代码

优质
小牛编辑
131浏览
2023-12-01

除了通过JSP表达式在JSP页面中嵌入Java代码外,还可以通过<% ... %>在JSP页面中直接嵌入Java代码。所有写在<% ... %>之间的内容JSP编译器都会将其认为是Java代码,并直接将其插入由JSP页面生成的Servlet类的_jspService方法中,如下面的JSP代码:

<%
    int n = (3 + 4) * 5;
%>

上面的代码在JSP页面中嵌入了一行非常简单的Java代码,这行Java代码会被直接放到_jspService方法的相应位置。因此,<% ... %>之间的内容必须是合法的Java代码,例如,每条Java语句后面必须加分号(;),否则,访问该JSP页时会抛出异常。

在JSP页面中嵌入Java代码时有如下两点需要注意。

l 可以在JSP页面的任何位置使用<% ... %>插入Java代码。<% ... %>可以有任意多个。

2 每一个<% ... %>中的代码可以不完整,但是该<% ... %>中的内容和JSP页面中的一个或多个<% ... %>中的内容组合起来必须完整。

下面的代码将一条Java语句分拆到多个<% ... %>中,并在<% ... %>之间包含静态的内容:

<!--  javacode.jsp  -->

<%@ page language="java" pageEncoding="UTF-8"%>
<html>
    <head>
        <title>在JSP中嵌入多段不完整的Java代码,但整个JSP页面的Java代码必须完整</title>
    </head>
    <body>
        <!--  第一段Java代码  -->
        <%
            java.util.Random rand = new java.util.Random();
            int gradeList[] = new int[5];
            for(int i = 0; i < 5; i++)
                gradeList[i] = rand.nextInt(100);
            for(int i = 0; i < 5; i++)
            {
                out.println(gradeList[i]);
                out.println("&nbsp;&nbsp;");
                if(gradeList[i] >= 90)
                {
        %>
        优秀
        <!--  第二段Java代码  -->
        <%
                }
                else if(gradeList[i] >= 80 && gradeList[i] < 90)
                {
        %>
        良好
        <!--  第三段Java代码  -->
        <%
                }
                else if(gradeList[i] >= 60 && gradeList[i] < 80)
                {
        %>
        及格
        <!--  第四段Java代码  -->
        <%
                }
                else
                {
        %>
        不及格
       <!--  第五段Java代码  -->
       <%
                }
                out.println("<br>");
            }
       %>
    </body>
</html>

在上面的代码中通过五对<%...%>,将嵌入的Java代码分成了五部分,这五部分中的Java代码的每一部分都不完整,但如果将它们合起来就是完成的Java代码。在这五对<%...%>之间是JSP页面中的静态部分,这部分在JSP页面被翻译成Servlet类时使用write方法直接输出到客户端。

在浏览器地址栏中输入如下的URL:

http://localhost:8080/demo/chapter6/javacode.jsp

浏览器显示的信息如图6.3所示。

03图6.3 多对<%...%>中的内容组合成完整的Java代码

上面的JSP页面将被翻译成如下的Java代码,这些代码都被放在了_jspService方法的相应位置。

out.write("\r\n");
out.write("<html>\r\n");
out.write("\t<head>\r\n");
out.write("\t\t<title>在JSP中嵌入多段不完整的Java代码,但整个JSP页面的Java代码必须完整</title>\r\n");
out.write("\t</head>\r\n");
out.write("\t<body>\r\n");
out.write("\t\t<!--  第一段Java代码  -->\r\n");
out.write("\t\t");
java.util.Random rand = new java.util.Random();
int gradeList[] = new int[5];
for(int i = 0; i < 5; i++)
    gradeList[i] = rand.nextInt(100);
for(int i = 0; i < 5; i++)
{
    out.println(gradeList[i]);
     out.println("&nbsp;&nbsp;");
     if(gradeList[i] >= 90)
     {
out.write("\r\n");
out.write("                    优秀\r\n");
out.write("\t    <!--  第二段Java代码  -->\r\n");
out.write("        ");
     }
     else if(gradeList[i] >= 80 && gradeList[i] < 90)
     {
out.write("\r\n");
out.write("                    良好\r\n");
out.write("\t    <!--  第三段Java代码  -->\r\n");
out.write("        ");
     }
     else if(gradeList[i] >= 60 && gradeList[i] < 80)
     {
out.write("\r\n");
out.write("                    及格\r\n");
out.write("\t    <!--  第四段Java代码  -->\r\n");
out.write("        ");
     }

     else
     {
out.write("\r\n");
out.write("                   不及格\r\n");
out.write("       ");
      }
      out.println("<br>");
  }
out.write(" \r\n");
out.write("        \r\n");
out.write("    </body>\r\n");
out.write("</html>\r\n");

从上面的代码可以看出,JSP页面中的五对<%...%>中的Java合成了一个完整的for和if语句,并将<%...%>之间的静态内容也以out.write(...)的形式插入到了if语句体中。但要注意,在JSP页面中的非可视字符(如\r\n),也会被翻译成out.write(...)形式输出的客户端,因此,当for、if、while等语句的语句体中只有一条语句时,最好也使用{...}将这条语句括起来。这是因为虽然在JSP页面中看着是一条语句,但在翻译时,如果在该语句前后有一些非可视字符(如\r\n),那么翻译成Java代码时就未必是一条语句了,因此,可能会造成逻辑错误。如下面的JSP代码所示:

<%        
    int x = 3;
    if(x == 4)
%>

<%
    out.println("ok");
%>

上面的JSP代码将被翻译成如下的Java代码:

int x = 3;
if(x == 4)       
out.write("\r\n");
out.write("        ");
out.println("ok");

从上面的Java代码可以看出,out.println("ok")语句被放在了if语句之外,因此,这就需要使用{...}将if语句中的子语句括起来才可以保证这些子语句一定在if语句体内。