1. JSP的基本原理
JSP的本质是Servlet,JSP的出现弥补了Servlet所有的表现逻辑都必须耦合在Java代码中的不足,JSP通过在标准的HTML页面中嵌入Java代码,其静态部分不需要Java程序控制,只有那些需要从数据库读取或需要动态生成的页面内容,才使用Java脚本控制。
JSP主要由两部分组成:
- 静态部分:标准的HTML标签、静态的页面内容,这些内容与静态HTML页面相同。
- 动态部分:收Java程序控制的内容,这些内容由Java脚本动态生成。
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<html>
<head>
<title>欢迎</title>
</head>
<body>
欢迎学习Java Web知识,现在时间是:
<%out.println(new java.util.Date());%>
</body>
</html>
在上面的JSP代码中,<%和%>之间的是Java脚本,通过这种方式把Java代码嵌入到HTML页面中,就成了动态的JSP页面。
因为JSP本质上是一个Servlet,因此JSP必须放在Web项目中并且部署到Web容器中才能被客户端浏览器访问。JSP看似脱离了Java类,但是其实JSP只是一个简化了的Servlet,JSP页面都会由Web容器生成相应的Servlet。
总结:
- JSP文件必须在JSP服务器内运行。
- JSP文件必须生成Servlet才能执行。
- 每个JSP页面的第一个访问着速度很慢,因为必须等待JSP编译成Servlet。
- JSP页面的访问者无须安装任何客户端,甚至不需要可以运行Java的环境,因为JSP页面输送到客户端的是标准的HTML页面。
2. JSP的四种基本语法
既然JSP是HTML中嵌入Java代码,那么JSP的编写也大致分两步走:
- 编写一个静态HTML页面;
- 在页面合适的位置嵌入Java代码。
2.1 JSP基础语法一 —– JSP注释
跟其他语言的注释一样,JSP注释只是提供给开发人员参考的开发提示,不会输出到客户端。
JSP注释格式:
<%-- 注释内容 --%>
与之形成对比的是HTML的注释:
<!-- 注释内容 -->
JSP和HTML注释的区别除了写法不同外还有:JSP注释不会输出到客户端,但HTML注释虽然不会显示到界面,但是在客户端浏览器的源代码中看到。
2.2 JSP基本语法二 —– JSP声明
JSP声明用于声明变量和方法,JSP声明将会转换成Servlet的成员变量或成员方法。
JSP声明的语法格式如下:
<%! 声明部分 %>
下面看个实例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<%! public int count;
public String info() {
return "hello";
}
%>
<body>
<%out.println(count++);%>
<%out.println(info()); %>
</body>
</html>
在上面的JSP页面中声明了一个成员变量和一个成员方法,并输出了成员变了的值和成员方法的返回结果。也面每刷新一次,成员变量的值增加一次,这是因为:JSP页面会被编译成一个Servlet类,每个Servlet在容器中只有一个实例;在JSP中声明的变量是成员变量,成员变量只是在创建实例时初始化,该变量的值将一直保存,直到实例销毁。
info()方法实际上是Servlet实例中的方法,Java里的方法是不能独立存在的,即使实在JSP中也不行。
2.3 JSP基础语法三 —– 输出JSP表达式
JSP提供了一种输出表达式值的简单方法,输出表达式值的语法格式如下:
<%=表达式%>
表达式实例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<%! public int count;
public String info() {
return "hello";
}
%>
<body>
<%=count++ %>
<%=info() %>
</body>
</html>
由此可见可以直接使用表达式输出,输出表达式结果。
2.4 JSP基础语法四 —– JSP脚本
JSP脚本里可以包含任何可执行的Java代码,通常来说,所以可执行的Java代码都可以通过JSP脚本嵌入到HTML页面。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<table bgcolor="#cccccc" border="1">
<% for(int i = 0;i < 10;i++) {%>
<tr>
<td>循环值</td>
<td><%=i %></td>
</tr>
<%} %>
</table>
</body>
</html>
上面的代码实例,使用JSP脚本控制HTML静态内容,循环生成了10行的表格,并在表格中输出表达式的值。
在JSP小脚本处也能声明变量,但是在JSP小脚本出声明的变量是局部变量,不能使用访问控制符:public、private等修饰,也不能使用static修饰。
JSP脚本中的内容会被编译到_jspServer方法中,由于Java中不允许方法中定义方法,所以JSP脚本中不能定义方法。
JSP脚本中可包含任何可执行Java语句,比如连接数据库和数据库操作:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
// 注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee","root","123456");
// 创建Statement
Statement stmt = conn.creatStatement();
// 执行查询
ResultSet rs = stmt.executeQuery("select * from news_inf");
%>
<%
while(rs.next()) {
%>
<%
<tr>
<td><%=rs.getString(1) %></td>
<td><%=rs.getString(2) %></td>
</tr>
}
%>
</body>
</html>
使用上面的代码必须要将MySql驱动程序的Jar复制到lib下,并且创建news_inf表。