jsp的3个编译指令,7个动作指令,9个内置对象

时间:2021-08-11 21:03:41

jsp的3个编译指令:

page:该指令是针对当前页面的指令

include: 用于指定包含另一个页面

taglib:用于定义和访问自定义标签

使用格式

<%@ 编译指令名 属性名=“属性值”...%>

JSP页面中的三大指令:
page include taglib
一、Page指令的介绍:
对整个页面的配置信息的指令。全部都是当前页面的配置信息。去掉JSP的Page指令就是一个HTML文件。
page指令怎么加:
<%@ page ... %>
里面的属性:
autoFlush是否清除缓存,默认True,不用修改。
ContentType页面的类型,utf-8、GBK、GB2312、GB18030、ISO-8859-1注意:他们之间不可以混用。mime类型。把报头信息改了就会发生改变。
errorPage错误页面,输入一个另外页面的路径。还是比较常用。请求转发的方式。
isErrorPage为True当前页面就是错误处理页面。此页面有exception对象。报异常的时候链接不到页面的位置,因为找的是转换的Servlet中的信息,所以在显示的JSP页面中定位不到。无论页面中是否有isErrorPage,只要是errorPage属性指定跳转的页面就可以跳转和错误页面中是否设置isErrorPage属性无关。
import导入类,导入包。
isElIgnored是否屏蔽EL表达式,默认为False,不用管。
isThreadSafe是否允许同步,何谓同步,和线程有关,
开启一条应用是一个进程,一个进程是由多条线程组成的。True 允许多条线程的同步访问,线程不安全。由功能和环境来判断。页面允许是线程不安全的。数据是怎么来的是线程安全的。
数据的表现可以是线程不安全,数据的来源必须是线程安全。
language脚本应用语言(默认为java)。
pageEncoding设置当前页面的字符编码集。
session当前页面是否允许使用session(True、False)
extends继承,更换JSP的继承类,默认JSP继承JspBase类。改继承类对于开发一般用不到。

二、include指令
作用:包含,把另一个页面包含在当前页面中。
在本页面中怎么写:
<%@ include file="被包含的页面"%>
一个页面包含另一个页面,将两个页面合二为一,在什么时间合二为一的?页面进行转换Servlet的时候将两者合二为一的。
这种方式有长处也有短处,第一点:虽然访问两个资源文件,但是只会生成一个Servlet,称作静态包含(只会生成一个Servlet,因为转换的时候把其他网页的信息加载进来了)。第二点:如果是Tomcat5.0,被包含页面发生改变,包含页面体现不出来。JavaEE的版本是随着jsp版本和Servlet版本变化的,Tomcat版本越高,支持的Jsp和Servlet版本越高。Tomcat5.0以前被包含页面发生改变,包含页面体现不出来。//理解
所以在以前include指令一般不用,但是现在Tomcat6.0用,Tomcat6.0支持include指令。第三点:包含页面可以访问被包含页面中的变量。在被包含页面中声明的变量在包含中页面中是可以使用的。第四点:包含页面无法向被包含页面传参。需要大量复用的东西需要专门生成一个页面进行处理。

7个动作指令

JSP动作指令主要有如下7个:  

    jsp:forward:执行页面转向,将请求的处理转发到下一个页面。  

    jsp:param:用于传递参数,必须与其他支持参数的标签一起使用。  

    jsp:include:用于动态引入一个JSP页面。  

    jsp:plugin:用于下载JavaBeanApplet到客户端执行。  

    jsp:useBean:创建一个JavaBean的实例。  

    jsp:setProperty:设置JavaBean实例的属性值。  

    jsp:getProperty:输出JavaBean实例的属性值。  

  

forward指令  

forward指令用于将页面响应转发给另外的页面。既可以转发给静态的HTML页面,也可以转发到动态的JSP页面,或者转发到容器中的Servlet。  

JSPforward指令的格式如下。  

对于JSP 1.0,使用如下语法:  

<jsp:forward page="{relativeURL|<%=expression%>}"/>   


对于JSP 1.1以上,可使用如下语法:  

<jsp:forward page="{relativeURL|<%=expression%>}">  
{<jsp:param.../>}
</jsp:forward>

 

第二种语法用于在转发时增加额外的请求参数。增加的请求参数的值可以通过HttpServletRequest类的getParameter()方法获取。  

下面示例页面使用了forward动作指令来转发用户请求。  

程序清单:codes\02\2.2\jspPrinciple\jsp-forward.jsp  

<%@ page contentType="text/html; charset=gb2312" language="java" %>  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>forward的原始页</TITLE>
</HEAD>
<BODY>
<h3>forward的原始页</h3>
<jsp:forward page="forward-result.jsp">
<jsp:param name="age" value="29"/>
</jsp:forward>
</BODY>
</HTML>


这个JSP页面非常简单,它包含了简单的title信息,页面中也包含了简单的文本内容,页面的粗体字代码则将客户端请求转发到forward-result.jsp页面,转发请求时增加了一个请求参数:参数名为age,参数值为29。  

forward-result.jsp页面中,使用request内置对象(request内置对象是HttpServletRequest的实例,关于request的详细信息参看下一节)来获取增加的请求参数值。  

程序清单:codes\02\2.2\jspPrinciple\forward-result.jsp  

<%@ page contentType="text/html; charset=gb2312" language="java" %>  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>forward结果页</TITLE>
</HEAD>
<BODY>
<!-- 使用request内置对象获取age参数的值 -->
<%=request.getParameter("age")%>
</BODY>
</HTML>


执行forward指令转发请求时,客户端的请求参数不会丢失。看下面表单提交页面的例子,该页面没有任何动态的内容,只是一个静态的表单页,作用是将请求参数提交到jsp-forward.jsp页。  

程序清单:codes\02\2.2\jspPrinciple\form.jsp  

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  
<HTML>
<HEAD>
<TITLE>提交</TITLE>
</HEAD>
<BODY>
<!-- 表单提交页面 -->
<form id="login" method="post" action="jsp-forward.jsp">
<INPUT TYPE="text" NAME="username">
<INPUT TYPE="submit" value="login">
</FORM>
</BODY>
</HTML>
 

修改forward-result.jsp页,增加输出表单参数的代码,修改后forward-result.jsp页面的代码如下:  

程序清单:codes\02\2.2\jspPrinciple\forward-result.jsp  

<%@ page contentType="text/html; charset=gb2312" language="java" %>  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>forward结果页</TITLE>
</HEAD>
<BODY>
<!-- 使用request内置对象获取age参数的值 -->
<%=request.getParameter("age")%>
<!-- 输出username请求参数的值 -->
<%=request.getParameter("username")%>
</BODY>
</HTML>


forward-result.jsp页面中不仅可以输出forward指令增加的请求参数,还可以看到表单里username表单域对应的请求参数,这表明执行forward时不会丢失请求参数。  

include指令  

include指令是一个动态include指令,也用于导入某个页面,它不会导入被include页面的编译指令,仅仅将被导入页面的body内容插入本页面。  

下面是include动作指令的语法格式:  

<jsp:include page="{relativeURL<%=expression%>}" flush="true"/>   

或者  

<jsp:include page="{relativeURL<%=expression%>}" flush="true">   

<jsp:param name="parameterName" value="patameterValue"/>   

</jsp:include>  

flush属性用于指定输出缓存是否转移到被导入文件中。如果指定为true,则包含在被导入文件中;如果指定为false,则包含在原文件中。对于JSP 1.1旧版本,只能设置为false。  

对于第二种语法格式,则可在被导入页面中加入额外的请求参数。  

下面页面使用了动态导入语法来导入指定JSP页面。  

程序清单:codes\02\2.2\jspPrinciple\jsp-include.jsp  

<%@ page contentType="text/html; charset=gb2312" language="java" %>  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>jsp-include测试</TITLE>
</HEAD>
<BODY>
<!-- 使用动态include指令导入页面 -->
<jsp:include page="scriptlet.jsp" />
</BODY>
</HTML>

  

上面页面中粗体字代码使用了动态导入语法来导入了scriptlet.jsp。表面上看,该页面的执行效果与使用静态include导入的页面并没有什么不同。但查看jsp-include.jsp页面生成Servlet的源代码,可以看到如下片段:  

//使用页面输出流,生成HTML标签内容  
out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\ ">\r\n");
out.write("<HTML>\r\n");
out.write("<HEAD>\r\n");
out.write("<TITLE>jsp-include测试</TITLE>\r\n");
out.write("</HEAD>\r\n");
out.write("<BODY>\r\n");
//动态导入,直接引入scriptlet.jsp页面
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response,
"scriptlet.jsp", out);
out.write("\r\n");
out.write("</BODY>\r\n");
out.write("</HTML>\r\n");
out.write("\r\n");


上面代码片段中粗体字代码显示了动态导入的关键:动态导入只是使用一个include方法来插入目标页面的内容,而不是将目标页面完全融入本页面中。  

归纳起来,静态导入和动态导入有如下两点区别:  

Ø   静态导入是将被导入页面的代码完全融入,两个页面融合成一个整体Servlet;而动态导入则在Servlet中使用include方法来引入被导入页面的内容。  

Ø   静态导入时被导入页面的编译指令会起作用;而动态导入时被导入页面的编译指令则失去作用,只是插入被导入页面的body内容。  

除此之外,执行include动态指令时,还可增加额外的请求参数,如下面JSP页面所示。  

程序清单:codes\02\2.2\jspPrinciple\jsp-include2.jsp  

<%@ page contentType="text/html; charset=gb2312" language="java" %>  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>jsp-include测试</TITLE>
</HEAD>
<BODY>
<jsp:include page="forward-result.jsp" >
<jsp:param name="age" value="32"/>
</jsp:include>
</BODY>
</HTML>


在上面的JSP页面中的粗体字代码同样使用jsp:include指令导入页面,而且在jsp:include指令中还使用param指令传入参数,该参数可以在forward-result.jsp页面中使用request对象获取。


9个内置对象

JSP脚本中包含9个内置对象,这9个内置对象都是Servlet API接口的实例,只是JSP规范将它们完成了默认初始化(由JSP页面对应Servlet_jspService()方法来创建这些实例)。也就是说,它们已经是对象,可以直接使用。9个内置对象依次如下:  

    applicationjavax.servlet.ServletContext的实例,该实例代表JSP所属的Web应用本身,可用于JSP页面,或者Servlet之间交换信息。常用的方法有getAttribute(String attName)setAttribute(String attName , String attValue)getInitParameter(String paramName)等。  

    configjavax.servlet.ServletConfig的实例,该实例代表该JSP的配置信息。常用的方法有getInitParameter(String paramName)getInitParameternames()等方法。事实上,JSP页面通常无须配置,也就不存在配置信息。因此,该对象更多地在Servlet中有效。  

    exceptionjava.lang.Throwable的实例,该实例代表其他页面中的异常和错误。只有当页面是错误处理页面,即编译指令pageisErrorPage属性为true时,该对象才可以使用。常用的方法有getMessage()printStackTrace()等。  

    outjavax.servlet.jsp.JspWriter的实例,该实例代表JSP页面的输出流,用于输出内容,形成HTML页面。  

    page:代表该页面本身,通常没有太大用处。也就是Servlet中的this,其类型就是生成的Servlet类,能用page的地方就可用this。  

    pageContextjavax.servlet.jsp.PageContext的实例,该对象代表该JSP页面上下文,使用该对象可以访问页面中的共享数据。常用的方法有getServletContext()getServletConfig()等。  

    requestjavax.servlet.http:HttpServletRequest的实例,该对象封装了一次请求,客户端的请求参数都被封装在该对象里。这是一个常用的对象,获取客户端请求参数必须使用该对象。常用的方法有getParameter(String paramName)getParameterValues(String paramName)setAttribute(String atttName,Object attrValue)getAttribute(String attrName)setCharacterEncoding(String env)等。  

    responsejavax.servlet.http.HttpServletResponse的实例,代表服务器对客户端的响应。通常很少使用该对象直接响应,而是使用out对象,除非需要生成非字符响应。而response对象常用于重定向,常用的方法有getOutputStream()sendRedirect(java.lang.String location)等。  

    sessionjavax.servlet.http.HttpSession的实例,该对象代表一次会话。当客户端浏览器与站点建立连接时,会话开始;当客户端关闭浏览器时,会话结束。常用的方法有:getAttribute(String attrName)setAttribute(String attrName, Object attrValue)等。