学习Servlet,我们应该懂的

最近一直在看《java与模式》这本书,虽然只是看了几个相对简单的模式,但是已经感受到设计模式在JAVA EE开发中应用的必要性。现在还不敢发表自己对设计模式的学习心得和看法,一年后吧,相信我经过一年的技术洗礼,我会对设计模式有更深入的了解。之前我写的《学习Tomcat,我们应该懂的》和《学习JSP,我们应该懂的》相信对一些学习JAVA EE的朋友有一定的帮助,现在继续写下这篇《学习Servlet,我们应该懂的》。还是那句,我主要目的是为了自己知识的沉淀,所以文章中知识是不连贯的,如有跳跃的地方你(“你”当然指的是初学者啦)看不懂还请见谅。如有写错,还请指正。

     我认为,学技术,首先看最原始的说明文档,那怕你现在是看不明白。搁在这,你学习JAVA EE,你手头必须有两个API,一个是JAVA API,另一个是JAVA EE API。也许你会说,英文的,看不懂。看不懂英文的看中文的,网上有。我就是英文实在是对不起乡亲父老啦,JAVA API也是看中文的,惭愧,不过我JAVA EE API我是看英文的,(需要打开金山词霸,呵,自嘲的笑)。如果你碰到了问题,首先查找一下API,兴许就能解决问题了。

     在正式说Servlet之前,先说点JAVA EE的:JAVA EE是一些技术企业(主要是SUN和IBM)联合提出一套技术规范与指南,是一个标准,换言之,SUN公司只是设计了JAVA EE体系中的各种接口和类标准,各个平台开发商按照JAVA EE标准分别开发了不同的JAVA EE应用服务器,也就是说,JAVA EE中的技术规范具体实现是在JAVA EE应用服务器上的。Tomcat就是一个符合JAVA EE标准的应用服务器,我们可以在Tomcat安装根目录下common/lib中找到相关的jar文件。Servlet是在JAVA EE标准之中的,你会在common/lib中找到servlet-api.jar这个文件,它就是Servlet在Tomcat服务器中的实现。虽然你不了解这个也能学好Servlet,但是我觉得知道了对你学习JAVA EE会有帮助,毕竟Servlet不是孤立的,它和很多技术有关联,譬如说和Tomcat容器就有关系,懂了他们你会更容易将各种知识点串起来。读到这里,你是否觉到JAVA EE扩展性很好啊,如果你将来有能力了,你也可以开发一个自己专用的JAVA EE服务器,呵呵。但同时这也给JAVA EE的学习带来一定的困惑,凡事有利必有弊,都需要权衡得失,做出选择。我觉得JAVA这样挺好的,而不像微软:你只需学习我Microsoft给你提供的知识足够了,我是老大我做主,我的地盘听我的,但.net体系的确相对好学很多(没学过,网上的朋友都这么说)。

     Servlet是什么?它的有哪些特点?“Servlet是Java平台上的CGI技术。Servlet在服务器端运行,动态地生成Web页面。与传统的CGI和许多其它类似CGI的技术相比,Java Servlet具有更高的效率并更容易使用。对于Servlet,重复的请求不会导致同一程序的多次转载,它是依靠线程的方式来支持并发访问的。”这是网上查找的一个答案,如需更详细的答案,百度一下,你就知道。本来打算按照一定的顺序说的,想想看,还是按知识点来说比较好点。

一、 Servlet的生命周期


     这个是Servlet必说的知识点,我也不能免俗,也试着用自己的语言讲讲。当然,这方面的内容你上网找也很多,你大可不必看我的。
     假如你已经安装好了Eclipse或者其他IDE,现在就建一个Servlet文件试试看,你会发现建立的Servlet会默认继承javax.servlet.http.HttpServlet类,就算你没有安装Eclipse也无所谓,知道我们编写的Servlet是需要继承javax.servlet.http.HttpServlet类就可以啦。
     现在打开这个类看看,看看Servlet的老爸长得如何,public abstract class HttpServlet extends GenericServlet implements Serializable; 从这看得出,Servlet还有一个爷爷,它是javax.servlet.GenericServlet,还实现了一个序列化的功能(java.io.Serializable),序列化的就不说啦,老实说,我也没用过序列化这功能,仅处于知道有这个地球上有这么一个东西而已。再接着看看Servlet爷爷长得是啥样,public abstract class GenericServlet extends Object implements Servlet, ServletConfig, Serializable; 我们这需要留意的是Servlet的爷爷是实现了Servlet的接口的,你打开Servlet接口,里面有这样一句话:Defines methods that all servlets must implement. 换一句话,它是Servlet的老祖宗,所有的Servlet必须要实现这个接口,要不就不能称之为Servlet。我们Web用的HTTP协议所以就是HttpServlet,同样的道理,如果将来出现XTTP协议,也许你会看到一个XttpServlet,它必定也是实现了Servlet接口(当然啦,技术出现了大变革除外)。Servlet的爸爸,爷爷的方法这么多,不可能每一个都说。就挑一些常用的(也就是Servlet生命周期的几个函数)说说:
          void init(); Servlet初始化
          void service (ServletRequest req, ServletResponse res);
           void doGet (ServletRequest req, ServletResponse res);
           void doPost (ServletRequest req, ServletResponse res);
           …………
           Servlet各种服务
          void destroy(); Servlet的销毁
看一张图片先:

这是网上找来的图片,不过我个人觉得还是李兴华老师(一个我很喜欢的老师)说的好。

 

     记得李老师当时是这样说的:Servlet的生命周期其实就是人一生的写照,Tomcat就是这个社会。人的经历首先是从出生开始的,对Servlet而言就是调用init()方法,想想看,人的一生能出生多少次啊?就一次,Servlet中init()的方法也只能调用一次,一般都是在Servlet第一次运行时加载init()方法,你也可以设置为服务器启动的时候加载。人出生后,随着年纪的增长,你就必须得投入到工作去,身体有缺陷的例外,而且工作不是说你只做一次,只要有需要,你就必须得做,重复的做。BOOS的命令,谁敢不服从,要不立刻吵你鱿鱼。对Servlet而言也是一样,只是它没有抵触情绪而已,哈。它也是不断的运行doGet(), doPost()等方法,当中有可能出现异常。人总有一天是会死亡的,死亡的确定有两种,一种是的的确确死了,他的尸体就躺在你面前,另外一种是他失踪了多少年,从法律的角度上判断,他是死亡了,他的老婆拥有了合法改嫁的权利。对Servlet而言,它的死亡方式也有两种:一种是服务器关闭,也就是的的确确死了,另外一种是该Servlet长时间不使用,Tomcat判断其死亡,Servlet的生命周期到此结束。


PS: get和post的方法联系与区别
Get的方式是指请求是通过地址栏和表单传过来的,而post只能通过表单传过来。Get可以传的信息的大小有限定,不适合传体积较大的文件,如图片,视频等。

生命周期说完,接着说Servlet在web.xml的配置

二、 Servlet在web.xml中的配置


     Servlet在MVC模式中主要是负责C-control的,既然如此,服务器是需要知道在什么时候具体调用那一个Servlet。JSP就直接可以通过在地址栏输入其名字就可以找到了,Servlet还需要在你的项目中WEB-INF中找到web.xml文件,将Servlet映射到里面去。如何映射?假如你编了个com.xibianyu.servlet.LoginServlet的Servlet,而你希望通过在地址栏中输入login便可以找到该Servlet。你可以如此设置,在<web – app />中加入下面代码:
     <servlet>
        <servlet-name>loginServlet</servlet-name>
        <servlet-class>com.xibianyu.servlet.LoginServlet</servlet-class>
     </servlet>
     <servlet-mapping>
        <servlet-name> loginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
     </servlet-mapping>
     其实<servlet/>中的<servlet-name>和<servlet-mapping>中的<servlet-name>要求一致。至于<servlet-name>、<servlet-class>、<servlet-mapping>、<url-pattern>等分别是什么意思,相信聪明如你,看名字就能猜出个大概,再加上百度一下,什么问题都没啦。在说生命周期的时候说过可以设置Servlet在容器启动时初始化,将刚才的代码改为如下:
     <servlet>
        <servlet-name>loginServlet</servlet-name>
        <servlet-class>com.xibianyu.servlet.LoginServlet</servlet-class>
        <load-on-startup>0</load-on-startup>
        <init-param>
         <param-name>param1</param-name>
         <param-value>xhzilie</param-value>
        </init-param>
     </servlet>
     <servlet-mapping>
        <servlet-name> loginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
     </servlet-mapping>
     “<load-on-startup>0</load-on-startup>”中的0是一个优先级来的,数值越大优先级越低。当中红色的那部分是设置初始化参数的。

如果应用Servlet,还有个地方需要注意的:Servlet编译后 的class文件必须得放在WEB-INF/classes中。

三、 Servlet中两种跳转的区别


     这其实和JSP中两种跳转是一样的,也分一种是服务器跳转,其表现为:request.getRequestDispatcher().forward();另外一种是客户端跳转,其表现为:HttpServletResponse.sendRedirect()。前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址,他是不会改变Request的值,如果你需要在下一个页面中能从中获取新的信息的话,你可以Request.setAttribute()来放置一些标志,这样从下一个页面中获取;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用 HttpServletResponse.sendRequest()方法。(PS:这是从网下copy,我觉得已经说的很清楚了,所以就没有自己再写了)。

四、 其他


Servlet中,我们还需要懂的有
     1. 过滤器的使用
     主要用处如:屏蔽非法文字,统一编码等
     2. 监听器的使用
     统计在线人数
       …………………
      因为在之前项目中都没怎么用到过滤器和监听器,不是很熟悉。大家如想了解就查看API文档或者查阅相关资料吧,大家一起进步。

五、 题外话:初学者使用IDE之我见


     之前在《学习JSP,我们应该懂的》里面提到“我是赞同初学者一开始就用Eclipse等IDE的”,今天就这个问题说说自己的看法,个人推荐Eclipse。听说NetBeans现在也做得很好了,找个时间也试用一下。我之所以赞同初学者用IDE有以下原因:
     1、 使用IDE能吸引初学者学习的兴趣,可以很快的将一些小程序跑起来。曾经听过这样的表达:人从来都是这样,是在一个又一个成功中前进,成功对于鼓励人的士气肯定大过失败。使用IDE,初学者看到自己的程序跑起来,会鼓励着自己继续学习。就拿Servlet为例:要使的Servlet能在JDK中编译,你还需要把Servlet的包servlet-api.jar 复制到JDK的jre/lib/ext中。初学者还需要阅读一定的资料(在这过程中有人会放弃学习java的)才能明白个中道理。但是如果你使用了IDE,这些就不用自己设置啦,你可以立刻让Servlet跑起来。
     2、 反对初学者使用IDE的一个典型理由是:使用了IDE使得学习者不能深入了解程序的运行。这就得见人见智,我相信随着初学者学习的深入,很多技术相对低层的知识也会碰到,并且可以掌握好,并不会因为IDE的存在而使得了解更困难。无可否认的是,有的人是因为IDE都帮他弄好,他也懒得理会其他的了,我想这部分人中如果不用IDE,他也一样不会很深入学习相对低层的java知识的。
     3、 一开始就使用IDE,我们可以很快就找相对简单的项目来做,技术是在做项目中前进的。如果不使用IDE,不知道要学到猴年马月才能做项目,这就要看修行的慧根啦。

     综合权衡得失,我赞同初学者使用IDE。

 

完成于2008年3月22日中午

***************************************************************************
* 不是我说的深奥,只是听的人有觉悟了 ,自然觉得深奥。*
***************************************************************************

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值