传送门


【测一测】
学习完前面的内容,下面来动手测一测吧,请思考以下问题:

1、请简述JSP的运行原理。

1、请简述JSP中的9个隐式对象。

2、请使用include标签编写两个JSP页面,要求:访问b.jsp页面时先输出b.jsp页面的内容,等待5秒,再输出a.jsp页面中的内容。

3、请在web.xml文件中使用元素为整个Web应用程序设置错误处理页面。已知:处理状态码为404的页面为404.jsp, 处理状态码为500的页面为500.jsp


【答案】
1、JSP的运行原理如下:
1)客户端发出请求,请求访问JSP文件。
2)JSP容器先将JSP文件转换成一个Java源文件(Java Servlet源程序),在转换过程中,如果发现JSP文件中存在任何语法错误,则中断转换过程,并向服务端和客户端返回出错信息。
3)如果转换成功,则JSP容器将生成的Java源文件编译成相应的字节码文件*.class。该class文件就是一个Servlet,Servlet容器会像处理其他Servlet一样来处理它。
4)由Servlet容器加载转换后的Servlet类(.class文件)创建一个该Servlet(JSP页面的转换结果)实例,并执行Servlet的jspInit()方法。jspInit()方法在Servlet的整个生命周期中只会执行一次。
5)执行jspService()方法来处理客户端的请求。对于每一个请求,JSP容器都会创建一个新的线程来处理它。如果多个客户端同时请求该JSP文件,则JSP容器也会创建多个线程,使得每一个客户端请求都对应一个线程。JSP运行过程中采用的这种多线程的执行方式可以极大地降低对系统资源的需求,提高系统的并发量并缩短响应时间。需要注意的是,由于第(4)步生成的Servlet是常驻内存的,所以响应速度非常快。
6)如果JSP文件被修改了,则服务器将根据设置决定是否对该文件重新编译,如果需要重新编译,则使用重新编译后的结果取代内存中常驻的Servlet,并继续上述处理过程。
7)虽然JSP效率很高,但在第一次调用的时候往往由于需要转换和编译,所以会产生一些轻微的延迟。此外,由于系统资源不足等原因,JSP容器可能会以某种不确定的方式将Servlet从内存中移除,发生这种情况时首先会调用jspDestroy()方法,然后Servlet实例会被加入“垃圾收集”处理。
8)当请求处理完成后,响应对象由JSP容器接收,并将HTML格式的响应信息发送回客户端。

2、JSP2.0规范中提供了9个隐式(内置)对象,它们是JSP默认创建的,可以直接在JSP页面中使用。这9个隐式对象的名称和作用如下:
1)out:主要用于页面输出;
2)request:用于得到用户请求信息;
3)response:表示服务器向客户端的回应信息;
4)config:包含服务器的配置信息,可以使用该对象获得Servlet初始化参数;
5)session:主要用来保存用户信息;
6)application:包含所有用户的共享信息;
7)page:指当前页面转换后的Servlet类的实例;
8)pageContext:表示JSP页面容器,它提供了对JSP页面内所有的对象及名字空间的访问;
9)exception::表示JSP页面所发生的异常,在错误页中才起作用。

3、该功能的实现代码如下:
(1)a.jsp文件如下:

<%@ page contentType="text/html;charset=UTF-8"%>
<%Thread.sleep(5000);%>
这个是a.jsp页面<br />

(2)b. jsp文件如下:

<%@ page contentType="text/html;charset=UTF-8"%>
这个是b.jsp页面<br />
<jsp:include page="a.jsp" flush="true" />

4、web.xml文件代码如下:

<error-page>
		<error-code>404</error-code>
		<location>/404.jsp</location>
	</error-page>
	<error-page>
		<error-code>500</error-code>
		<location>/500.jsp</location>
	</error-page>

整理不易, 如果喜欢的话,还请给博主一个赞哦,让更多的人看到这篇文章