JSP页面的基本结构:HTML元素;注释(JSP注释,HTML注释);脚本元素(声明,表达式,脚本片段);指令(page指令,taglib指令,include指令);动作(<jsp:useBean>,<jsp:forward>,<jsp:include>)。
1、注释:
1)HTML注释:<!-- HTML注释--> 客户端查看源代码时可以看到
2)JSP注释:<%-- JSP注释--%> 又称隐藏注释,客户端看不到
| servlet源文件 | 客户端页面源文件 | 浏览器显示 |
HTML注释 | 出现 | 出现 | 不显示 |
隐藏注释 | 不出现 | 不出现 | 不显示 |
脚本注释 | 出现 | 不出现 | 不显示 |
2、脚本元素:JSP页面中的java代码段
1)声明变量:<%! 声明语句;%>
2)声明方法:<%! 声明方法%>
声明变量和声明方法时页面级的,即它们在声明语句所在的页面时有效的。Tomcat将JSP页面转换为java类,则声明变量是该类的成员变量,声明方法时该类的的方法。成员变量在执行过程中是被所用用户共享的,用户改变成员变量时会影响其他用户使用此成员变量
3)表达式:<%= 表达式%> 服务器将运算结果转换为字符串输出到JSP页面
注:表达式后不需加“;”,“<%=”是一个整体不可有空格。
4)java程序段:<% java程序段 %> 当JSP页面被客户请求时,java程序段就被执行,且是按先后顺序执行的;JSP页面被编译成一个java类,java程序段则放置在java类的service()方法中;java程序段中声明的是局部变量,在JSP页面的后继的所有程序段及表达式中均有效,且不同用户在访问JSP页面中相同名称的局部变量时,局部变量互不影响。
<%!
private int a=1;
public String print(){
return "this is function";
}
%>
<%int b=1; %>
a:<%=a++%><br><!--全局的在整个中只有一个 -->
b:<%=b++%><!--在service方法中,每次调用都是一个新的 -->
3、JSP指令:负责提供JSP页面的相关信息,以及设置JSP页面的属性。
1)page指令:用来设置JSP页面的属性。
<%@ page language = “java”
contentType=“MIMEType; charset=characterSet” //声明MIME类型和字符编码集,默认为
“text/html;charset=iso-8859-1”
pageEncoding=“characterSet” //设定,默认为iso-8859-1, 优先级不如
contentType("text/html;charset=utf-8");
import=“package.class” //导入JSP页面所使用的java API,以逗号隔开
extends=“package.class” //定义产生的servlet是继承哪个父类,默认为HttpJspBase
buffer=“none|size kb|8kb” //输出流缓存的大小,默认8kb
errorPage=“URL” //发生错误时页面被重定向指向的错误处理页面
autoFlus=“false|true” //缓存区的内容是否自动清除,默认true
session=“false|true” //页面是否需要一个HTTP会话,默认true,如果值为false,则对应的servlet代码 当中不会生成声明和创建session的代码。也就是说,不能够使用session隐含对象了。
isThreadSafe=“false|true” //是否支持多线程同步请求,默认true
isErrorPage=“false|true” //该页面是否为错误处理页面,默认false
isELPage=“false|true” //是否忽略EL表达式,默认false
info=“***” //可以为任意字符串,可通过Servlet.getServletInfo()来获取所设置字符串
%>
page指令出现次数没有限制,但属性最多出现一次,import属性除外。
2)include指令:页面包含指令,可以在JSP页面中包含另一个文件。
<%@ include file = “文件名”%>
注:若包含的文件与JSP页面不在同一目录下,需要指出相对路径;两个JSP页面的page指令的contentType值必须完全一致。
3)taglib指令:可以使JSP页面中使用自定义的标签。
<%@ taglib uri = “tagURI” prefix = “prefix”%>
uri:指定自定义标签文件的路径
prefix:指定标签的前缀,不可为保留字
使用taglib指令时,应先定义标签文件,然后在JSP页面中使用taglib指令引用该标签文件,就可在JSP文件中使用该标签文件了。
4、JSP动作:
1)<jsp:include>:将指定的页面包含到使用此动作标记的JSP页面中
方法一:<jsp:include page=“文件的URL|<%=表达式%>” flush=“true”/>
方法二:<jsp:include page=“文件的URL|<%=表达式%>” flush=“true”>嵌套子标记</jsp:include> //flush缓存是否被清空
注:需要传递参数时使用<jsp:param>动作标记作为嵌套子标记。
<jsp:include>和include指令的区别:
n include指令是静态包含,在JSP页面编译时执行,引入的内容为静态文件,在JSP页面编译时被包含文件与主文件已经融合在一起。
n <jsp:include>是动态包含,在请求处理阶段执行,引入的内容在执行页面被请求时动态生成后再包含到页面中。
2)<jsp:param>:用来传递参数
<jsp:param name=”参数名” value=”参数值”/>
使用request对象的getParameter()方法获取<jsp:param>的参数值。
3)<jsp:forward>:重定向至其page属性指定的页面。
方法一:<jsp:forward page=”跳转页面的URL|<%=表达式%>”/>
方法二:<jsp:forward page=”跳转页面的URL|<%=表达式%>”>
<jsp:param value=”参数值” name=”参数名”></jsp:forward>
注:跳转页面时,URL不会改变;一旦执行<jsp:forward>标记,那么当前页面的后续代码就会停止。
SendRedirect外部跳转 | Forward内部跳转 |
是不同的request | 虽然是不同的对象,但是,可以取到上一个页面的内容 |
send后的语句会继续执行,除非return | forward后的语句不会继续发送给客户端 |
速度慢 | 速度快 |
需要到客户端的往返,可以转到任何页面 | 服务器内部转换 |
地址栏有变化 | 地址栏没有变化 |
可以传参数,直接写在url后面 | 可以传参数 |
4)<jsp:useBean>:
方法一:<jsp:useBean id=”bean的名字” class=”引用bean的类” scope=”bean的作用域”/>
方法二:<jsp:useBean id=”bean的名字” class=”引用bean的类” scope=”bean的作用域”>
</jsp:useBean>
id:引用的javaBean在所定义的作用域的名称,区分大小写,且不同名。
class:引用的javaBean的完整包路径,一般“package.class”.
scope:指定javaBean和id的有效范围,page,request,session,application。
page:当前页面有效,用户间互不影响。
request:请求期间有效,用户间互不影响。
session:会话期间有效,用户影响。
application:整个Web应用,用户影响。
5)<jsp:setProperty>:与<jsp:useBean>一起使用,设置JavaBean属性值。
<jsp:setProperty name=”useBean标记中的id值” property=”*|javaBean的属性名” value=”javaBean属性值|<%=表达式%>”/>
6)<jsp:getProperty>:与<jsp:useBean>一起使用,获取javaBean属性值。
<jsp:setProperty name=”useBean标记中的id值” property=”*|javaBean的属性名” />
5、补充:JSP页面中的异常处理:
n <%=exception.toString()%> 打印异常名称;
n <%exception.printStackTrace()%> 打印当前错误流中所有错误的列表;
n <%=exception.getMessage()%> 打印错误的详细描述信息;