JSP与Servlet
基本前提
JSP:它实际上是一个类。
Servlet:它实际上是一个接口,而我们日常所说的Servlet则是指实现了Servlet这个接口的类例如HTTPServlet。
用途
二者都是为了解决同一个问题而产生的:在B/S应用分为前后端的情况下,根据后端需要动态改变的内容,来展示前端的页面。
举例说明
微博需要将当前登录用户的昵称显示在用户详情页上。假设现有“建国”和“建国”两个用户,那么为了做到这一点,后端从数据库查找到了两条记录。
Servlet的做法是,在Servlet的实现类中,分别拿着“建国”和“翠兰”两个名称拼上同一个HTML页面后以流的形式写给浏览器。
JSP的做法是,我们已知用于展示的详情页面是格式相同的HTML页面,唯一需要改变的仅仅是页面中要选择显示“建国”还是“翠兰”。
那么将此HTML页面先定义好,但与静态的页面.html文件区分而采用.jsp结尾。此.jsp结尾的文件与需要输出的.html文件在展示的格式上无任何区别,仅仅是在页面中需要输出昵称的位置增加了一个可识别的变量形如${nickName}。
JSP引擎会在用户第一次访问此页面的时候将此.jsp结尾的文件编译成一个Java类(这个类很特殊,除了JSP标签标记外的部分都被作为将来要输出的一部分,而被标记了的则作为逻辑处理),那么我们就可以将后台得到的记录给到${nickName}变量中,而后做了两件事情,第一是将此编译后的文件保存在内存中,方便下次调用(即页面访问)。第二是将处理过后的页面以流的形式写给浏览器。
归纳
显然地,JSP与Servlet的做法是基本一致的,都是通过流的形式在Java类中将需要前端展示的部分写出。而他们实现这个目的的思路却恰恰相反,通俗地说(不严谨地说)是Servlet是在Java类中嵌套HTML页面,JSP则是在HTML页面中嵌入Java代码。
也就有了我们常说的JSP比Servlet优越的地方在于:
JSP归JSP引擎来执行编译,它在用户第一次访问页面的时候编译,也就是说前端更新过后的样式、标签会在刷新浏览器向服务器发送请求)的时候体现出来。而Servlet归Servlet容器也就是Tomcat执行编译,因此我们需要重启服务器,那么此时在Servlet中更新过的样式、标签才会体现出来。
而另一方面,在Java类中嵌套HTML是一种遭人唾弃的行为,尤其是前端的展示极为丰富的今天,他不仅令人觉得混乱,还容易出错难以修改。