Servlet简介
Servlet技术规范是JavaEE技术规范中的一个重要组成部分,Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面(实际上,Servlet不仅仅是用于返回HTML的页面的,比如,Servlet还可以返回Xml,JSON等格式的字符串,当然了,也可以返回视频流,等等)。
Servlet要运行于Servlet容器上,目前,IBM的WebSphere,BEA的WebLogic,Apache的tomcat,SUN的GlassFish,这些JavaEE的服务器,都含有Servlet容器,我想这么说,Servlet的容器和JavaEE的服务器之间的关系就区别开了吧? 其中以tomcat为例,它是一个著名的开源的JavaEE服务器,它包含有一个Servlet容器,(但是并不包含EJB的容器),也就是说,tomcat是一个不能完整支持JavaEE技术规范的容器(不支持EJB),但是这对构建一个Web Site是够用了。如果想使用tomcat,并使用EJB,通常是采用JBoss作为服务器的,因为JBoss本身是一个EJB的容器,并且把tomcat集成进来,来完成Servlet容器的角色。tomcat除了要提供Servlet容器外,显然还要承担起HTTP Server的角色,但是也有人用Apache服务器+Tomcat的Servlet容器,来构成一个完整的服务器,也就是说,不使用tomcat所提供HTTP服务,而是用Apache的。
Sun的GlassFish,是一个比较完整支持JavaEE规范的Server。刚才看到了一条新闻,Oracle完成收购SUN后,依然会支持GlassFish。原文如下:
(GlassFish
甲骨文表示将会调整Oracle WebLogic server和GlassFish的投资组合,他们计划继续让GlassFish Enterprise Server作为遵循Java EE规范的开源RI。同时,甲骨文表示也会继续支持GlassFish社区。
编者注:除了以上开发者们关注的两个产品之外(是的,还有Java FX。对于Java,Oracle自从收购开始之日就一直态度明确;然而Java FX,在这份FAQ中仍然没有提及),下面还提到了Sun的虚拟化产品和Open Office的处理策略。)
我觉得Servlet技术,和CGI技术有着相当的相似度。如果把Servlet放到传统的CGI程序,和当下的JSP,JSF,ASP.net中间,我觉得它更加地接近前者,没有一个本质的跃迁。
详解servlet实例
上面这个链接,写得不错,OK:
假设我写了一个HelloServlet,它返回一个欢迎页面。
HelloServlet是如何被创建的呢? 首先可以肯定的说,不是new出来的,容器根本不知道我们会写出叫什么名字的Servlet classes。这就像MFC,谁知道我们的Document class叫什么名字,于是动态创建就有用武之地了。当然了,在Java里面,反射是更加强大的武器。(而且记住,容器不会new HelloServlet,而就是我们企图调用这个Servlet,也不要new!)
服务器会侦听某一个端口,比如说8080,现在浏览器要访问我们的Server了,http://127.0.0.1:8080/hello。
OK,Server会accept浏览器的链接,当然了,这是个TCP层的问题,而在HTTP层面上,我们会看到Request的HTTP请求信息,里面就含有URL,于是我们自然就得到了hello这个字符串。这个时候,HTTP Server就要把处理逻辑转到Servlet容器上了。
根据JavaEE的规范,Servlet容器会读一个web.xml。里面大致有这样的配置内容:
<servlet> <servlet-name>Hello</servlet-name> <servlet-class>org.bizcuit.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
注意那关键的四行,其中servlet-name是Hello,成为上面和下面两个部分的桥梁,上面的部分说明了调用这个名字的Servlet,会实例化哪个Java class。而下面的部分则说明了,URL的pattern如果是/hello,那么就会调用名为Hello的Servlet。其中,还要注意url-pattern项,这里可是有些名目的。
OK,这样,Servlet容器就知道要加载哪个Servlet的class了,那么这个加载是通过反射来完成的。
Class cls = Class.forName(servletClassName); Object servlet = cls.newInstance();
当然了,这个比伪码还简单了,因为一个Servlet class,通常只在容器内产生一个实例(也有办法生成多个实例,但是可能会产生效率的问题,后面讲),因此,要注意线程安全的问题(后面讲)。
但是现在,我们有了Servlet的实例了,于是,我们可以调用它的方法了,根据Servlet规范,容器根据浏览器的请求(GET/POST/...),会调用service,或者是doGet,doPost方法。以doGet方法为例:
public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("text/html"); resp.getWriter().println("<div>Hello</div>"); } }
注意doGet方法的两个参数,很重要,这里就不赘述了,还是要在具体的实践中掌握的。
关于Session,可以通过这个方法得到。req.getSession();
JSP简介
我个人认为JSP是一种比PHP更加灵活,强大的服务器端脚本,无奈PHP确实简单很多啊。
JSP(Java Server Pages)是由Sun公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP,PHP等技术,它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*.jsp)。
运行JSP,也是需要Servlet容器的,原因就是JSP在第一次被访问的时候,会被翻译为一个Servlet,当然了,这个Servlet最终也是要被编译为.class文件的,所以,JSP是在Servlet的技术上构建出来的,而且JSP的运行速度很快,毕竟是被编译成字节码在运行,相比传统的ASP脚本的解释方式,快了许多。
关于JSP,还有JSP的tag可以作为单独的课题来研究一下。
<JSP试验部分>
1. DOWNLOAD tomcat first: tomcat 6.x zip format
下载后,解压缩。
2. 启动tomcat
找到目录$TOMCAT_INSTALL_PATH\apache-tomcat-6.0.20\bin,Windows上,双击startup.bat即可。
http://localhost:8080/
好歹试一试tomcat是不是真的起来了。GO~
3. 创建一个JSP文件。
目录,$TOMCAT_INSTALL_PATH\apache-tomcat-6.0.20\webapps\ROOT
创建一个文件,hello.jsp。里面输入下列内容。
<%@page language="java" %> <%@page import="java.util.*" %> <html> <head> <title>Hello World!</title> </head> <body bgcolor="#FFFFFF"> <% String msg= new Date().toString(); out.println("Hello World!<br>"); %> <div style="color:red"> <%=msg%> </div> </body> </html>
保存,然后启动服务器(当然了,服务器起来后,再创建、修改JSP也可以,不需要重启服务器。),试一试,http://127.0.0.1:8080/hello.jsp
4. 随便再改改,体验一下JSP,<%%>内,可以接受Java code(当然了,不是全部)。
<Servlet试验部分>
写简单的JSP,我觉得不用IDE也OK,但是Servlet,我们还是借助IDE吧,大段的Java代码,我喜欢用Eclipse。
1. 下载eclipse-jee-galileo-SR1-win32,Click here to download
2. 启动Eclipse。注意,Eclipse一定要指定一个workspace才行的。
3. 从菜单里面找File->New->Project,选择后弹出一个可以创建工程的对话框。在里面找到Web |_ Dynamic Web Project。
不负责任的说,自己一路Next下去吧。应该没有什么问题。工程的名字可以选择为Hello。
4. 再创建一个服务器。
不负责任的说,找到对话框,自己一路Next下去吧。应该没有什么问题。
5. 这样就差不多了,可以写代码了,也可以调试了。具体的问题应该不难解决。在Hello工程里面创建一个Servlet。
在左侧的Package Explorer中,展开Hello,在src目录那里,右键,准备创建一个Servlet,找到对话框,
在Class Name那里写HelloServlet即可,Java Package那里写org.bizcuit。其他的不用修改。OK,这样,IDE就帮我们创建好一个Servlet的java文件了。
在doGet方法内,可以试着写入这样的code:
PrintWriter pw = response.getWriter();
pw.print("<html><body><div style=‘color:red‘>Hello</div></body></html>");
当然了,Servlet里面返回HTML往往属于比较土的做法,因为还不如写JSP呢(当然了,Servlet返回HTML也可能有更好的理由。)
6. 开始调试了。
在Project Hello上右键,找到Debug As菜单项,选择Debug on server。
选择一个已有的Server这一项(Choose an exsiting server.)。因为我们已经建立过一个Server tomcat了。
然后一路Next到Finish~。试一下 http://127.0.0.1:8080/Hello/HelloServlet
URL中,第一个Hello是由于你创建的工程名是Hello,接下来HelloServlet,是你的servlet class的名字。
7. 试一下改写你的Servlet,是不需要重启服务器的。