因为这次写的抓取项目跟Gary讨论过后,还是要用到J2EE. Gary 和我以前都写过J2EE,所以我们有空还要写个详细的实践教程给大家。
为了让大家少走弯路,不必要的气馁和无从下手。让我一步一步来把这些名词解释出来。
大家在看这篇文章之前和之后都应该看看2本书,书的前面几章都说的很好,很详细。
很长时间来这些名词和技术把我搞的晕头转向。
经过一开始只知道用不知道原理的J2EE开发(MQ 300LVL)
和后来php的开发经验。
还有最近做的个C++项目。
我会把自己所领悟到的东西陆陆续续写出来。
CGI:
最早的web server只能支持静态的内容,为了能够支持动态内容的显示比如每访问一个网页的时候能够显示物品的当前价格。
就有了最初的CGI,CGI的地址一般是 www.xxx.com/abc.cgi  cgi其实是用c/c++写的一个程序,每次访问它就可以去读取数据库什么的,然后生成网页,交给webserver然后webserver传回给用户,这样就有了动态页面。
但是CGI有很大的缺点就是占资源,每个用户访问一次CGI,操作系统就要开一个进程来接受这个用户,如果有1万个用户,那么再好的系统也会受不了。
JAVA?
所有的JAVA程序都是运行在java虚拟机上,java虚拟机在操作系统里也只是个用c/c++写的可执行文件,这个可执行文件在哪里呢,就在JAVA安装目录的bin文件夹下。
java虚拟机可以动态的读取编译好的类(我们写好的JAVA程序被编译成xxx.class)然后执行起来。
既然java虚拟机是个可执行文件,所以运行起来后在操作系统里它只占一个进程。
那么CGI的缺点如果用JAVA来做的话就可以解决,只要开启一个JAVA虚拟机, 只占用一个进程。 如果有用户请求,虚拟机就根据请求读取相应的类来处理用户的请求,没有更多的进程产生,一切都在一个虚拟机里运行。
servlet:
我们来想想看被虚拟机加载去处理用户请求的这些类应该有什么特点是一般的JAVA类没有的,可以想到的有
1: 应该可以在虚拟机内缓存一段时间,因为很可能下个请求也要用上,如果release掉,然后再读取进来很浪费时间
2: 应该有很多跟 http 相关的属性和操作。
SUN就定义了一个接口类 javax.servlet ,只要一个java class继承它就可以有以上说的2点,那它就是个 servlet 当然还有很多熟悉,那么这样的类就叫做 servlet.
所以servlet其实只是一个 java class跟我们平常写的类没什么区别,只是它继承了javax.servlet 接口,有了很多SUN预定义的功能而已。
Apache, Tomcat
我们有了处理用户请求的类 servlet, 但是谁负责这些servlet的运行周期,什么时候被加载进虚拟机,什么时候被卸载出去, 加载进来后要运行servlet的哪个方法?
所以我们需要一个 servlet容器,这个容器获得到用户的请求之后,根据请求把相应的类读取进虚拟机,把请求的参数传给这些类,更重要的是接受类运行完后的结果,传给用户。
以前我总是认为Tomcat就是个网页服务器了,实际上不是。 Tomcat 只接受servlet的请求,用户的请求实际上是先到apache的。 大家看下面这个图。
Clinet —->Apache—–>Tomcat
用户的请求总是先到apache
apache才是个纯正的网页服务器,说它是纯正因为它只能接受和发送静态的html。
但是你会说不对啊,php不是也运行在apache上吗,怎么说Apache只能处理静态的html.
那是因为apache的可扩展性,Apache是个最基本只能处理静态内容的网页服务器, 但是你只要在apache 的http.conf 文件里加上  php5.so 。
那 么当你访问  xxx.com/abc.php 时候,apache 没有办法处理它,它只能处理 .html 这样的,所以它看看自己有没有加载 php5的扩展,有的话它就交给php5.so去处理,php5处理完后也是静态的hmtl元素返回给apache然后apache传回给用户。
同样的当用户访问  xxx.com/abc.jsp 的时候,apache也处理不了,所以apache把请求转给了 servlet 容器Tomcat(jsp其实是sevlet).
Tomcat根据来自apache 的请求吧相应的servlet 执行起来,servlet处理完后也是返回静态的html元素给tomcat, tomcat再吧结果转给apche, apche再返回给用户
JSP:
servlet有了,执行和管理servlet的容器tomcat也有了,但是开发起来并不方便。
我们说了servlet其实是个java class那么servlet 处理完后应该把动态的数据组装成静态的html返回给 tomcat –> apache—>client
所以servlet就必须要有这样的代码。
public class HelloWorldExample extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
String msg = “Hello, world!”;
response.setContentType(“text/html”);
PrintWriter out = response.getWriter();
out.println(“<html>”);
out.println(“<head>”);
out.println(“<title>JSP 2.0 Hello World</title>”);
out.println(“</head>”);
out.println(“<body>”);
out.println(msg);
out.println(“</body>”);
out.println(“</html>”);
}
}
如 果你要把<title>JSP 2.0 Hello World</title> 改为 <title>abc</title>, 你必须打开这个源代码,修改->保存->编译->再部署进 tomcat. 即使是个小小的改动也要这样做,
而且java代码中有 out.println(“</html>”) 这样的语句让JAVA 源代码看起来太乱。
所以我们需要个网页模式的servlet, 只要象HTML那样编辑修改后,自动会重新编译成servlet,自动重新部署进 servlet 容器。 这就是 JSP. 大家看这个JSP代码
<%@ taglib prefix=”tags” tagdir=”/WEB-INF/tags” %>
<html>
<head>
<title>JSP 2.0 Hello World</title>
</head>
<body>
<tags:helloWorld/>
</body>
</html>
效果和上面是一样的servlet 是一样的,修改的时候你可以直接把 title修改掉。 不用你手动编译,手动部署。
tomcat会自动帮你把jsp 编译成 servlet.
所以 JSP 实际上就是 servlet. 只不过是 servlet 的HTML 版本, 简化开发。
J2EE:
J2EE是一组API标准。 J2EE标准说任何一个服务器只有都实现了这些API才能叫做 J2EE服务器。
那 Tomcat算不算呢, Tomcat只能说是半个不到的 J2EE服务器,因为它只实现了J2EE一组API里的一个 Servlet/Jsp API. 其他的API比如 EJB, JMS, JMX … 它都没有实现。
实现了所有这些API的J2EE服务器有 IBM 的Websphere , BEA 的 WEGLOGIC。
但 是实践证明SUN定义的J2EE API并不是都很好用,比如EJB, 开源的SPRING更好用, 所以我们只需要一个只实现了servlet API 的TOMCAT + 轻量开源的SPRING和Hibernate,同样可以做到EJB等其他J2EE API能做到的事,而且更容易开发。
但 是为什么特别大的项目和重要的项目还是要用 Websphere 这样的全J2EE服务器呢,道理很明显,spring hibernate 可能会随着 j2ee标准的改进而消亡,所以重要的项目要紧跟着标准走。而且EJB只是比较难用,但是功能很强大,能很好的整合进整个 J2EE 标准。
但是中小项目还是跟着 开源社区走的好, 免费支持,文档多。等等。
Struts + Spring + Hibernae 是什么???

用一个只实现了 servlet api 的TOMCAT 服务器 怎么开发出 一个功能全的 J2EE程序?
比如J2EE里 EJB API 可以实现数据库表到 JAVA class 的映射。
我们只有TOMCAT没有EJB可以用,但是我们有 hibernate ,一个开源的实现了跟EJB 数据表映射一样的功能,而且更轻量,更好用。
Spring 的概念是类与类之间的解耦合,用XML文件定义类的实例化。 所有的类包括 hibernate 从数据库映射出来的类也全都在 spring的管理之下。
Struts 负着请求的转发。 我们前面提到过 apache 会把请求发给 tomcat, 一般情况下 tomcat 就根据 web.xml文件配置把请求转给一个 servlet 去执行,
Struts 就执行在 tomcat 收到请求和调用相应的 servlet 之间, struts 会截获这些请求, 根据自己的配置 更加灵活的调用 servlet. 还在调用servlet 之前进行用户验证等,
同 时 sevlet 执行完后要输出结果给 tomcat 的时候。 struts 也会在tomcat 获得结果之前截取结果, 把结果进行相应的处理再转给 tomcat. 比如本来servlet 处理后结果是个 txt文件, 那么struts 可以把 这个结果转成PDF 然后转给TOMCAT->apache->client.
一个网站如果能够动态的生产页面(servlet), 有效的处理数据库(hibernate), 灵活的请求和结果处理(struts) , 降低耦合度的 (spring), 和一个强大的 servlet 容器 TOMCAT. 对于大多数的项目都够了,
除非是象银行那样的大系统才需要用到全J2EE服务器来开发。
总而言之 struts+spring+hibernate+tomcat+apache 是一个很好的组合,不包含不必要的 J2EE API 去做出一个以 JAVA 为基础的网站。
如果觉得功能不够,我们总是可以找到一个开源或者官方的模块加载进来。 比如要做 webservice 的时候就可以加上 axis.