JSP 中的指令有两种,一种是编译指令 ( Directive ) ,一种是动作指令 ( Action ) 。
编译指令有三种:page、include、taglib。格式是 <%@Directive attribute="value"%>
1、page
page 是用来指明页面属性和信息的,比如说要导入的包、页面内容类型、语言、Session 的开关等等。page 指令的属性有以下几种:
属性作用示例备注language指明当前页面所使用的语言language="java"默认 javaextends指明继承的父类extends=“HttpServletRequest” import指明需要导入的包import="java.util" buffer指明缓冲区大小buffer="none"默认 8KB,无需调整sessionSession 开关session="false"默认 trueautoFlush自动清除缓存开关autoFlush="false"默认 trueisThreadSafe线程安全开关isThreadSafe="true"默认 false,不建议设为trueinfo任何内容info="abcdefg" errorPage指明发生错误时指向的页面errorPage="error.jsp" isErrorPage指明此页面是否为错误页面isErrorPage="false"默认 falsecontentType指明页面内容类型contentType="text/html;charset=gb2312" pageEncording指明页面编码pageEncording="gb2312"
2、include
include 指令是用来指明引用的页面的地址的,JSP Engine 会在 JSP 程序的转换时期先把 file 属性设定的文件包含进来,然后开始执行转换及编译的工作,得到的是一个 JSP 页面。注意包含于被包含的页面要有共同的页面编码字符集,而且被包含的页面只能和包含页面共用参数。这种包含叫做静态包含。
另一种指令,动作指令的格式是: action attribute="value"/>,常用指令有:
1、include
格式为: ,和静态包含对应,这种包含叫做动态包含,JSP Engine 会在 JSP 程序转换时期分别编译包含和被包含文件,所以在 page 属性值中可以直接传入参数,如: 。不过动态包含和静态包含一样被包含页面可以使用包含页面的参数,即被包含页面的参数集合更大一些。当被包含页面与包含页面具有同名参数时,被包含页面只认定被包含页面的参数。
动态包含还可以使用标签的方式实现参数传递:
1: <jsp:include page="example.jsp"> 2: <jsp:param name="value1" value="<%=v1%>"/> 3: <jsp:param name="value2" value="<%=v2%>"/> 4: jsp:include> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .a { background-color: #eeeeee; width: 100%; margin: 0em; } .b { background-color: #cccccc; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }
上面的代码将 v1 重命名为 value1、v2 重命名为 value2 传入 example.jsp。
表:<%@include file="example.jsp"%>和 的区别:
<%@inlcude file="example.jsp"%> include编译指令是在JSP程序的转换时期就将file属性所指定的程序内容嵌入,然后再编译执行。 而include指令在转换时期是不会被编译的,只有在客户端请求时期如果被执行到才会被动态的编译载入。 只生成一个 class 文件生成多个 class 文件file 不可以带参数page 可以带参数被包含页面与包含页面同一个 request 对象被包含页面与包含页面不同的 request 对象,被包含页面的 request 对象可以访问包含页面的参数和自己页面的参数常用不常用
2、forward
forward 是用来对页面进行转向的, forward 转向是在服务器内部完成的,浏览器并不知道页面被转向了,所以浏览器的地址栏依然是原来页面的地址。
还有一种转向时用 response.sendRedirect() 方法实现的。关于两种方法的差异,列表如下:
<%response.sendRedirect("example.jsp");%>是不同的 request 对象,但是被转到的页面可以访问之前页面的参数。是不同的 request 对象,被转到的页面不能访问之前页面的参数。语句后面的代码不会被执行语句后面的代码依旧会被执行只可以转到 webapps 内部的页面,是服务器内部的转到可以转到任何页面,但是要服务器与浏览器之间多次连接,耗时地址栏无变化地址栏有变化,变为新的地址可以在 page 属性值里面传入参数可以在 URL 参数里面传入参数/ 代表的是 http://127.0.0.1/directory / 代表的是 http://127.0.0.1/ 常用,速度快常用,速度慢