2.3.4 JSP小脚本

2.3.4 JSP小脚本

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

scriptlet.jsp

看下面使用JSP小脚本的示例程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> 小脚本测试 </title>
<meta name="website" content="http://www.crazyit.org" />
</head>
<body>
<table bgcolor="#9999dd" border="1" width="300px">
<!-- JSP小脚本,这些脚本会对HTML的标签产生作用 -->
<%
for(int i = 0 ; i < 10 ; i++)
{
%>
<!-- 上面的循环将控制<tr>标签循环 -->
<tr>
<td>循环值:</td>
<td><%=i%></td>
</tr>
<%
}
%>
<table>
</body>
</html>

上面的页面中粗体字代码就是使用JSP小脚本的代码,这些代码可以控制页面中静态内容。上面例子程序将<tr>标签循环10次,即生成一个10行的表格,并在表格中输出表达式值。

生成的Servlet代码

接下来打开Tomcat生成的java文件,将看到如下代码片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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, "JSPs only permit GET POST or HEAD");
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=GBK");
pageContext = _jspxFactory.getPageContext(this, request, response, "", 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("\r\n");
out.write("\r\n");
out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\r\n");
out.write("\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n");
out.write("<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n");
out.write("<head>\r\n");
out.write("\t<title> 小脚本测试 </title>\r\n");
out.write("\t<meta name=\"website\" content=\"http://www.crazyit.org\" />\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("<!-- JSP小脚本,这些脚本会对HTML的标签产生作用 -->\r\n");

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

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

}

out.write("\r\n");
out.write("<table>\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);
}
}

上面的代码片段中的代码:

1
2
3
4
5
6
7
8
9
10
for (int i = 0; i < 10; i++) {
out.write("\r\n");
out.write("\t<!-- 上面的循环将控制<tr>标签循环 -->\r\n");
out.write("\t<tr>\r\n");
out.write("\t\t<td>循环值:</td>\r\n");
out.write("\t\t<td>");
out.print(i);
out.write("</td>\r\n");
out.write("\t</tr>\r\n");
}

JSP小脚本对应Servlet的_jspService方法的可执行性代码

完全对应于scriptlet.jsp页面中的小脚本部分。由上面代码片段可以看出,JSP小脚本将转换成Servlet_jspService方法的可执行性代码

JSP小脚本部分可以声明局部变量

这意味着,JSP小脚本部分也可以声明变量,但在JSP小脚本部分声明的变量是局部变量,但不能使用privatepublic等访问控制符修饰,也不可使用static修饰

JSP中所有的静态内容都由_jspService方法输出

实际上不仅JSP小脚本部分会转换成_jspService方法里的可执行性代码,JSP页面里的所有静态内容都将由_jspService方法里输出语句来输出,这就是JSP小脚本可以控制JSP页面中静态内容的原因。

JSP小脚本中可以定义局部变量 不能定义方法

由于JSP小脚本将转换成_jspService方法里的可执行性代码,而Java语法不允许在方法里定义方法,所以的JSP小脚本里不能定义方法JSP小脚本中定义的变量是局部变量

JSP小脚本中操作数据库

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

connDb.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@ page import="java.sql.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> 小脚本测试 </title>
<meta name="website" content="http://www.crazyit.org" />
</head>
<body>
<%
// 注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取数据库连接
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/javaee","root","32147");
// 创建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查询,并使用输出表达式语法来输出查询结果。在浏览器中浏览该页面,将看到如图2.6所示的效果。

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

data.sql

1
2
3
4
5
6
7
8
9
10
11
12
13
DROP DATABASE IF EXISTS javaee;
CREATE DATABASE javaee;
USE javaee;
CREATE TABLE news_inf
(
news_id INT AUTO_INCREMENT PRIMARY KEY,
news_title VARCHAR(255)
);

INSERT INTO news_inf
VALUES
(NULL, '疯狂Java联盟'),
(NULL, 'crazyit.org');