JSP——JavaServer Pages
1、JSP介绍
- 在传统的网页HTML文件(*.htm,*.html)中加入传统java程序片段(scriptlet)和JSP标签,就构成了JSP网页
- Java程序片段可以操纵数据库、重新定向网页以及发送E-mail等,实现建立动态网站所需要的功能。
- 所有程序操作都是在服务器端执行,网络上传送给客户端的仅是得到的结果,这样大大降低了对客户浏览器的要求,即使客户浏览器端不支持Java,也可以访问JSP网页。(结果是静态的html页面)
2、JSP执行过程:
更详细的过程分析:
3、验证jsp编译生成servlet:在Tomcat的安装目录里,有一个work子目录,在其下还有这样的目录:Catalina\localhost\webp1\org\apache\jsp,在这个目录下,我们可以看到很多.java和.class文件,文件名都是我们编写的jsp文件的名字+下划线+jsp+.java,例如我们写的result.jsp,转换成为了result_jsp.java和编译后的result_jsp.class。
jsp最终都会转换为servlet去执行。
4、JSP原始代码中包含了JSP元素和Template(模板)data两类;Template data指的是JSP引擎不处理的部分,即标记<% %>以外的部分,例如代码中的HTML的内容等,这些数据会直接传送到客户端的浏览器;JSP元素则是指将由JSP引擎直接处理的部分,这一部分必须符合JAVA语法,否则就导致编译错误。
5、JSP语法分为三种不同的类型:
- 编译器指令(DIRECTIVE)例如:<%@ page import="java.io.*" %>
- 脚本语法(SCRIPTING)
- 动作语法(ACTION)例如:<jsp:forward>,<jsp:getProperty>,<jsp:include>
脚本语法包括:HTML注释:<!-- -->——在客户端查看源代码能看到;隐藏注释(也叫JSP注释):<%-- --%>——源代码中看不见,即不会发送到客户端;
编译指令包括“包含指令”,“页指令”和“taglib指令”,它们包含在<%@ %>卷标里,两个主要的指令是page与include。
声明:<%! %>,<%! int a = 3; %>与脚本段<% int a = 3; %>,举例:
<body>
<%! int a = 3; %>
<% int b = 3; %>
<br>
<%= a-- %>
<%= b-- %>
</body>
这样的例子,每刷新一次,页面上a的值都将减1,而b的值始终不变,究其原因,声明的变量在jsp转换为servlet后成为成员变量,而脚本段的变量成为_jspService这个方法里的局部变量,而且,对于servlet来说,是单例的,即服务器中只存在此servlet的一个实例(对象),所以成员变量也一份,每个用户都会访问到它,而脚本段中的值则是局部变量,每个用户访问时各有一份,互不影响。
表达式:<%= %>
包含指令:include指令:<%@ include file="relativeURL" %>
page指令用于定义JSP文件中的全局属性,import用于导入java包,以下包不需要导入:java.lang.*;javax.servlet.*;javax.servlet.jsp.*;javax.servlet.http.*
6、page指令详解
- "<%@ page %>"指令作用于整个JSP页面,同样包括静态的包含文件。但是"<%@ page %>"指令不能作用于动态的包含文件,比如“<jsp:include>”
- 可以在一个页面中用上多个"<%@ page %>"指令,但是其中的属性只能用一次,不过也有例外,那就是import属性。因为import属性和JAva中的import语句类似,所以此属性就能用多次。
- 无论把"<%@ page %>"指令放在JSP的文件的哪个地方,它的作用范围都是整个JSP页面。不过,为了JSP程序的可读性,以及好的编程习惯,最好还是把它放在JSP文件的顶部。
7、taglib指令:
<%@ tablib uri="URIToTaglib" prefix="tagOrefix" %>,用于引入定制标签库
8、<jsp:forward page= />指令用于转向页面,在该指令后面的所有代码都没有机会执行了,因为页面流程已经转向了另一个页面了。
<jsp:include page=>
<jsp:param name=”username” value=”rasion” />
<jsp:param name=”password” value=”12345” />
</jsp:include>
9、一个页面输入行列数,另一个页面动态生成对应行列表格:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'input.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="output.jsp">
row:<input type="text" name="row"><br>
col:<input type="text" name="col">
<input type="submit" value="submit">
</form>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'output.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
int row = 0;
int col = 0;
try
{
row = Integer.parseInt(request.getParameter("row"));
col = Integer.parseInt(request.getParameter("col"));
}
catch(Exception e)
{
out.println("input digit");
return;
}
int value = 0;
%>
<table width="80%" align="center" border=1>
<%
for(int i = 0;i < row; i++)
{
%>
<tr>
<%
for(int j = 0; j < col; j++)
{
%>
<td><%= ++value %></td>
<% } %>
</tr>
<% } %>
</table>
</body>
</html>