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
小脚本部分声明的变量是局部变量,但不能使用private
、public
等访问控制符修饰,也不可使用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 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
文件放在Tomcat
的lb
路径下(所有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_infVALUES (NULL , '疯狂Java联盟' ), (NULL , 'crazyit.org' );