Servlet简介

来源:互联网 发布:1hhhh新域名网站 编辑:程序博客网 时间:2024/06/05 01:05

Servlet,是一种服务器端的java应用程序,它处于B/S模式下客户端请求和服务器响应的中间层,由服务器加载。它的工作模式大概是,客户端发送一个请求至服务器(可以是从一个html文件提交表单,通常以get或者post的方式,也可以是put或者delete),服务器收到请求后将其分发到部署在其中的Servlet(实现了GenericServlet的service()方法),Servlet根据客户端请求,调用service()方法,生成相应的响应内容,并将其传给服务器,然后服务器再将响应内容返回给客户端。

Tomcat是最常用的服务器。它的一个文件夹名字叫做Catalina,其实最新的Tomcat正式使用的Catalina内核,它是用来装servlet的容器,Tomcat还有一部分,就是将JSP转换为servlet然后最终装进Catalina容器。

而JSP (Java Server Page) 其实就是一个Servlet,可以这样说,Servlet是被嵌入页面的Java,而JSP是嵌入了Java的HTML页面。也就是说,从服务器返回的页面其实是java代码的执行结果,只不过打印了HTML标签,所以成了一个HTML页面。JSP相当于在HTML中嵌入了Java,通过服务器转换成了Servlet(也就是java文件),然后再执行它,把内容打印出来。这样很方便,就不用程序员自己将各种标签挨个通过print的方式打印出来了,那样实在是太不人性化了,使用JSP,Tomcat自己就帮你转换好了。

其实用这2个东西就能做出一个简单的动态网站,而它们必须放在一个容器里面才能运行。这个容器就是一个Web服务器,最常用的是Tomcat,Apache不兼容(它主要是用来处理静态页面),IIS要收费。Tomcat其实就是一个JSP/Servlet容器,一个服务器代表一个容器,Service负责将一个或者多个端口(port)和一个Engine连接起来,一个Engine可以有一个或者多个Host,Host可以理解为域名,也就是一个Tomcat实例可以管理多个域名,否则你需要多个Tomcat服务器。说实话,应该不用同时管理那么多域名。

作为一个Web App,必须有一个WEB-INF ( 注意中间是减号 ) 这么一个文件夹,里面装着web.xml文件 ( 该应用程序的配置文件 ,配置servlet和参数),一个classes文件夹(用于存放编译好的Servlet的class文件,首先必须要编译好以后的class文件放进去(这种方法肯定比较死板,实际开发的过程中未必需要这样做),然后再去修改web.xml文件里面响应的部分(这个通常在大型的开发里面是非常简单的配置,有可能就配置一个东西就好),一个lib文件夹(自己做的一个项目貌似没有这个,有待进一步研究)。没有为什么,这个就是Sun公司规定的J2EE的规范。

Sun公司提供了一个专门用于J2EE开发的api,对于Servlet来说,最重要的就是HttpServlet(毕竟大多数的Web应用是基于Http的),里面有2个方法,一个叫doGet,一个叫doPost,具体实现我们暂时不用去管,其它的方法貌似暂时也用不着管,暂时知道这两个方法怎么用就行。HttpServlet本身是GenericServlet的实现类,而服务器响应请求的方法是service()方法。但是,在HttpServlet的service()方法实现中,它充当的作用只是分发请求,根据请求的方式,比如get还是post还是put,将其分发至doGet,doPost,或者doPut。如果你要处理某种类型的请求,就要在HttpServlet的实现类重写doXXX方法。

注意,正因为这样,所以通常不更改service()方法,另外,doTrace和doOptions几乎都够用,所以一般也不要碰。

那么,要写一个类似于HelloWorld的程序,首先需要在Eclipse新建一个工程(当然,你可以选择在其它地方写),在建工程的时候需要将Tomcat的lib文件夹里面的servlet_api.jar这个类库给添加进去(实际的开发过程中,往往是借助了自动工具帮助添加需要的类库,创建所需的文件夹等等,比如ant和ivy)。然后呢,主类要继承HttpServlet这个抽象类,然后实现doGet或者doPost

@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// super.doGet(req, resp);PrintWriter out = resp.getWriter();out.print("<html><head><title></title></head><body>Hello World !!!</body></html>");//out.flush();//out.close();}
注意上面被注释掉的第一行代码,如果不注释掉的话会报错
注释掉的第二和第三行代码,对于PrintWriter来说,如果是在Servlet里面进行操作的话,是不需要flush()和close()的,因为app容器会自动帮助执行这2个操作
实现完了以后,要将class文件copy到Tomcat相应Web应用的classes文件夹中。
然后修改web.xml文件,主要是向其中添加如下内容:

    <servlet>      <servlet-name>aaa</servlet-name>      <servlet-class>HelloWorld</servlet-class>    </servlet>

注意

1.首先servlet的名字随便取,但是上下要一致,个人认为最好使用和类名一样的名字

2.然后是class的名称是包括包名在内的类名,假如用到的类是在某一个包内,那么第一件事情就是先在web应用的目录下面创建一样的文件夹,使得其和包的路径一致,然后修改web.xml文件,比如com.test.HelloWorld

mapping就是映射,那么你用户按照mapping的url-pattern来访问,得出的就是servlet-class的response

    <servlet-mapping>        <servlet-name>aaa</servlet-name>        <url-pattern>/HelloWorldServlet</url-pattern>    </servlet-mapping>

url那个东西是用户访问时输入的东西,比如用户要访问xxx:80/mp3/HelloWorldServlet,这样就会将doGet方法中返回的response显示出来。注意区分大小写!!!还是建议和servlet一样,都使用类名

因为所有的Http请求本身就有get头,那么默认的应该调用servlet的doGet方法。如果有表单(form),那么取决于form的action后面的method,如果是post就调用servlet的doPost,如果是get就调用servlet的doGet方法。有一种很好的方法就是在doPost里面调用doGet,然后在doGet里面写具体的操作,这样就能实现统一的响应。(应该还可以使用service来操作,需要时再进行学习)