java学习总结之JSP

1、JSP的一般运行原理

当浏览器发送一个请求给服务器,web服务器识别出这是一个对JSP网页的请求,并且将该请求传递给JSP引擎。JSP引擎从磁盘中载入JSP文件,然后将它们转为Servlet,这种转换只是简单的将所有模版文件改用pringln()语句,并且将所有的JSP元素转换为java代码。JSP引擎将servlet编译成可执行的类,并且将原始请求传递给servlet引擎。Web服务器的某组件将会调用servlet引擎,然后载入并执行servlet类。在执行过程中,servlet产生HTML格式的输出并将其内嵌于HTTP response中上交给Web服务器。Web服务器以静态HTML网页的形式将HTTP response返回到您的浏览器中。最终,Web浏览器处理HTTP response中动态产生的HTML网页,就好像在处理静态网页一样。

一般情况下,JSP引擎会检查JSP文件对应的servlet是否已经存在,并且检查JSP文件的修改日期是否早于servlet。如果JSP文件的修改日期早于对应的servlet,那么容器就可以确定JSP文件没有被修改过并且servlet有效。这使得整个流程与其他脚本语言(比如PHP)相比要高效快捷一些。JSP的实现实质上还是依靠Servlet,如果是tomcat服务器,可以去work\Catalina\目录下查看JSP编译好的对应的Servlet。

2、JSP语法

JSP脚本格式:<%   %>

JSP声明:<%!  int i=0;  %>

JSP表达式:<%=    %>

JSP注释:

<%--    --%>:JSP注释,注释内容不会被发送到浏览器,也不会被编译。

<!--   -->:HTML注释,通过浏览器查看网页源代码可以看见注释内容。

JSP指令:例如:<%page  %>

JSP行为:例如:<jsp:include >、<jsp:useBean >

JSP隐含对象:

JSP隐含对象

图1:JSP隐含对象

JSP流程控制:判断、循环等,很简单,不写了。

3、JSP指令

JSP中主要有include、page、taglib三个指令,用来设置整个JSP页面相关的属性。

(1)page指令

page指令的功能是提供当前页面的使用说明,一个jsp页面可以包含多个page指令。

下表列出与Page指令相关的一些属性:

属性描述
buffer
指定out对象使用缓冲区的大小
autoFlush
控制out对象的缓冲区
contentType
指定当前JSP页面的MIME类型和字符编码
errorPage
指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage
指定当前页面是否可以作为另一个JSP页面的错误处理页面
extends
指定servlet从哪一个类继承
import
导入要使用的java类
info
定义JSP页面的描述信息
isThreadSafe
指定对JSP页面的访问是否是线程安全
language
定义JSP页面所用的脚本语言,默认是java
session
指定JSP页面是否使用session
isELIgnored指定是否执行EL表达式
isScriptingEnabled确定脚本元素能否被使用

(2)include指令

JSP可以通过include指令来包含其他文件,被包含的文件可以是JSP文件、HTML文件或者文本文件,包含的文件就是该文件的一部分,也会同时被编译执行。这里需要注意下include指令和jsp:include动作元素的区别,<%@include%>是静态包含,它在jsp到servlet的编译期间,将jsp中的内容嵌入到目标jsp中,然后生成一个servlet文件,并且,静态包含还会将被包含页面的编译指令也包含进来,如果两个页面的编译指令冲突,那么页面就会报错;而对于<jsp:include>动作元素,称之为动态包含,jsp引擎会分别编译两个servlet文件,而且两个servlet是通过request和response进行通信。如果被包含的文件是静态的,那么这种情况和<%@include%>静态包含类似,只生成了一个servlet,但是它们之间还是没有简单的嵌入,依然是通过request和response进行通信。如果被嵌入的文件经常是需要改变的,那么建议使用<jsp:include>动态包含。

(3)taglib指令

JSP允许用户自定义标签,一个自定义标签库就是自定义标签的集合。taglib指令引入一个自定义标签集合的定义,包含库路径(uri)、自定义标签(prefix)。

4、JSP动作元素

JSP动作元素是用XML语法写成的,利用JSP动作可以动态的插入文件、重用javabean、把用户重定向到另外的页面等等。

JSP动作元素

图2:JSP动作元素

(1)jsp:forward

forward指令用于将页面响应转发到另外的页面,注意是转发不是重定向,既可以转发到静态的HTML页面,也可以转发到动态的JSP页面,或者转发到容器中的Servlet。如下:

<jsp:forward page="process.jsp">
	<jsp:param name="name" value="yedward"/>
</jsp:forward>

上述代码用以将页面响应转发到process.jsp,并且在转发的时候,传递了一个名为name,值为yedward的参数,在process.jsp页面可以通过request.getParameter("name")来获取该参数的值。jsp:forward完全采用了新页面来对用户生成相应,请求依然是一次请求,所以请求参数、请求属性都不会丢失和改变。

(2)jsp:include

include是动态包含,它与forward命令也十分相似,区别在于,执行forward时,被forward的页面将完全代替原有页面;而执行include时,被include的页面只是插入原有页面。

(3)jsp:useBean、jsp:setProperty、jsp:getProperty

useBean、setProperty、getProperty这三个指令都是与JavaBean相关的指令,其中useBean是用于在jsp页面中初始化一个java实例,setProperty指令用于为JavaBean实例的属性设值,getProperty指令用于输出JavaBean实例的属性。

useBean的语法格式如下:

<jsp:useBean id="name" class="className" scope="page|request|session|application">

其中,id是JavaBean的实例名,class属性确定JavaBean的实现类,scope属性用于指定JavaBean实例的作用范围,该范围有如下四个值:

page:该JavaBean实例只在该页面有效。

request:该JavaBean实例在本次请求有效。

session:该JavaBean实例在本次session内有效。

application:该JavaBean实例在本应用中一直有效。

(4)jsp:plugin

plugin指令主要用于下载服务器端的JavaBean或Applet到客户端执行,由于程序在客户端执行,因此客户端必须安装虚拟机。实际中,由于现在很少使用Applet,而且就算使用Applet,也完全可以使用支持Applet的HTML标签,所以jsp:plugin的应用场景并不多。

(5)jsp:param

parma指令用于设置参数值,这个指令本身不能单独使用,因为单独的param指令没有实际意义。jsp:param指令可以与jsp:include、jsp:forward、jsp:plugin三个指令结合使用,当与jsp:include指令结合使用时,param指令用于将参数值传入被导入的页面;当与jsp:forward指令结合使用时,param指令用于将参数值传入被转向的页面;当与jsp:plugin指令结合使用时,则用于将参数传入页面中的JavaBean实例或者Applet实例。

5、隐含对象

JSP中的隐含对象如上图1所示,详细信息如下:
(1)application:javax.servlet.ServletContext的实例,该实例代表jsp所属的web应用本身,可用于jsp页面,或者在Servlet之间交换信息。常用的方法有getAttribute(String attName)、setAttribute(String attName, String attValue)和getInitParameter(String paramName)等。application不仅可以用于两个JSP页面之间共享数据,还可以用于Servlet和JSP之间共享数据。application还可以用于获得web.xml中用<context-param>配置的参数,比如配置了数据库连接的一些配置信息,则可以用application.getInitParameter()来获得。

(2)config:javax.servlet.ServletConfig的实例,该实例代表该JSP的配置信息。常用的方法有getInitParameter(String paramName)和getInitParameternames()等方法。事实上,JSP页面通常无需配置,也就不存在配置信息,因此,该对象更多的在Servlet中有效。当在web.xml中配置了servlet,那么可以使用config.getServletName()来获得servlet的名称,可以使用config.getInitParameter()来获得servlet中init-param配置的参数。

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

(4)out:javax.servleet.JspWriter的实例,该实例代表JSP页面的输出流,用于输出内容,形成HTML页面。

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

(6)pageContext:javax.servlet.jsp.PageContext的实例,该对象代表JSP页面的上下文,使用该对象能访问页面中的共享数据。常用的方法有getServletContext()和getServletConfig()等。它可以访问、设置page、request、session、application范围的变量。

(7)request:javax.servlet.http.HttpServletRequest的实例,该对象封装了一次请求,客户端的请求参数都被封装在该对象中,获取客户端请求必须使用该对象。常用的方法有getParameter(String paramName)、getPrameterValues(String paramName)、setAttribute(String attrName, Object attrValue)、getAttribute(String attrName)、setCharacterEncoding(String env)等。

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

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

final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;

随便打开tomcat下面一个jsp编译成servlet后的java文件,可以看到在service中有如上这段代码,表明这些都是service方法的局部变量,也是由于jsp编译成servlet的时候,会自己创建这些对象,所以我们可以直接在jsp中使用。由于JSP内置对象都是在_jspService()方法中完成初始化的,因此只能在JSP脚本、JSP输出表达式中使用这些内置对象,不能在JSP声明中使用,否则,系统会提示找不到这些变量。另外,可以发现一共有9个隐含对象,但是上面的代码中只实例化了8个,还有一个就是exception对象,只有当页面的page指令的isErrorPage属性为true时,才可以使用exception对象。也就是说,只有异常处理页面对应Servlet时,才会初始化exception对象。

JSP中很多用法都利用到了Servlet,或者说跟Servlet非常相似,可以参考《学习总结之Servlet》这篇文章。

本文标题:java学习总结之JSP

本文链接:http://yedward.net/?id=269

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章