Java Servlet&JSP Web开发

最近几周读了《Head First Servlets&JSP》一书,有一些想法,所以想记录下来。
因为自己主要擅长PHP开发,所以会与PHP做对比。

其实Servlet的doPost和doGet等方法非常符合REST这种设计理念,这点不得不佩服Servlet当初的设计者。
Servlet应该叫做应用控制器(application controller),因此没有前端控制器(front controller)。
对比PHP,PHP在非框架开发也是通过应用控制器这种模式进行开发的,与Servlet颇为类似。
但是与PHP不同的是,PHP根本没有REST思想,想怎么命名应用控制器都可以。
Servlet如果设计得当,就会得到符合REST风格的应用控制器。
但是可能性比较小,估计至少90%的项目都和PHP差不多,命名乱成一团。

然后再来看路由,相比于非框架的PHP,访问的地址就是文件名,Servlet的路由和现代框架风格比较相似。
Servlet用了路由来决定URL地址对应的Servlet,在当时确实是一种很现代的思想。
路由只是Servlet配置的一部分,除了路由以外,Servlet的还有很多配置项也都是配置在web.xml文件里面的。
因为毕竟编译语言,写在xml文件里面就免除了重新编译的麻烦。
书中还介绍了一种使用配置文件的数据生成全局对象的方法,但是这种方法产生的对象因为多线程共享,所以可能会有线程安全问题,值得注意。

再来说一下Servlet的官方视图JSP。请牢记,JSP就是一个Servlet,它会执行时编译成Servlet。
本质上来说Servlet采用的这种JSP的方式是这样的:
本来Servlet有一个函数比如叫做render(HttpServletReqeust req, HttpServletResponse res){}。
这个函数里面写了各种out.println("")之类的输出语句,用来构成一个网页。
但是大家有没有发现,这个render函数无法被多个Servlet重用,那么为了视图的重用,怎么办呢?
于是这个函数就被分离出来,形成一个单独的视图Servlet,这个函数内有一个函数类似render函数。
然后控制器Servlet在执行完了之后会把数据添加到req的属性中去,并把req和res传递给视图Servlet。
视图Servlet收到req和res后,就会从req获取数据渲染并传递给res,就是我们看到的网页。
但是视图Servlet写起来太麻烦了,写一个网页相比单纯的HTML要花费太多功夫,怎么办呢?
jSP的设计中想到的方法很简单,那就是先写HTML风格的页面脚本,然后把这个页面脚本编译成Servlet。
一次请求Servlet的处理过程是这样的:
系统会根据你的请求的URL通过路由找到对应的控制器Servlet;
控制器Servlet处理完成后,会把数据设置为Request的属性,然后把请求转发给视图Servlet;
如果视图Servlet没有找到,只有JSP文件,那么就会把JSP编译成视图Servlet;
视图Servlet会根据请求信息和控制器保存的属性信息渲染页面,形成我们看到的网页。

除此以外,Servlet还有一个非常特殊的特性叫做监听器,它会监听系统中的多种事件,满足我们在事件前后执行的需求。
当然,监听器用的比较少,不过有机会还是会用得上的。

标签: none

添加新评论