JSP一般的运行方式为:当服务器启动后,当Web浏览器端发送过来一个页面请求时,Web服务器先判断是否是JSP页面请求。如果该页面只是一般的HTML/XML页面请求,则直接将HTML/XML页面代码传给Web浏览器端。如果请求的页面是JSP页面,则由JSP引擎检查该JSP页面,如果该页面是第一次被请求、或不是第一次被请求但已被修改,则JSP引擎将此JSP页面代码转换成Servlet代码,然后JSP引擎调用服务器端的Java编译器javac.exe对Servlet代码进行编译,把它变成字节码(.class)文件,然后再调用JAVA虚拟机执行该字节码文件,然后将执行结果传给Web浏览器端。如果该JSP页面不是第一次被请求,且没有被修改过,则直接由JSP引擎调用JAVA虚拟机执行已编译过的字节码.class文件,然后将结果传送Web浏览器端。下面是一张JSP运行的示意图:
从这里我们已经不难看出JSP和Servlet的关系,JSP引擎负责把JSP页面翻译成Servlet,因此JSP在底层完全就是Servlet(指原始概念上的Servlet,而不是HttpServlet)。前面我们提到JSP编程对应javax.servlet.jsp,更确切的讲,这个包是供JSP引擎使用的,它在做翻译的时候需要用到这个包,我们在编写JSP页面的时候是不需要涉及这个包的使用的。
为什么有了Servlet还要在高层实现一个JSP呢?这个问题跟Servlet本身编写的烦杂程度有关,如果用Servlet来控制页面外观的话,将是一件十分头疼的事情,使用JSP就把烦杂的打印任务交给了JSP引擎,程序员可以把精力集中到逻辑控制上面。
从这里我们已经不难看出JSP和Servlet的关系,JSP引擎负责把JSP页面翻译成Servlet,因此JSP在底层完全就是Servlet(指原始概念上的Servlet,而不是HttpServlet)。前面我们提到JSP编程对应javax.servlet.jsp,更确切的讲,这个包是供JSP引擎使用的,它在做翻译的时候需要用到这个包,我们在编写JSP页面的时候是不需要涉及这个包的使用的。
为什么有了Servlet还要在高层实现一个JSP呢?这个问题跟Servlet本身编写的烦杂程度有关,如果用Servlet来控制页面外观的话,将是一件十分头疼的事情,使用JSP就把烦杂的打印任务交给了JSP引擎,程序员可以把精力集中到逻辑控制上面。