初识Servlet

  Servlet是一门专门用于开发动态web资源的技术,Sun公司在其API中提供了一个Servlet接口(当然,我们不会去直接实现这个接口,而是去继承其实现类会更好),因此,狭义的Servlet是指这个接口,广义的Servlet是指任何实现了这个Servlet接口的类。 使用Servlet开发一个动态web资源,其实就是开发一个Java程序向浏览器输出数据。

  Servlet其实就是一个运行在服务器上得Java程序,Servlet是J2EE十三门技术中的一种,因此我们不能去看J2SE的API文档,如果是初学者,最好能看专门Servlet的API文档。我们来看Servlet的文档介绍:

  从这个对Servlet接口的介绍就可以看出,如果要实现Servlet接口,就要实现其所有的方法,Servlet程序是运行在web服务器上得,用来接收和响应从客户端发来的请求。当然就像我之前说的,如果自己写一个类来实现Servlet接口,那么就要复写Servlet所有的方法,但是我们可以继承其实现类,例如GenericServlet类或者HttpServlet类,这样只需要复写我们想复写的方法即可。

  Servlet中的方法包括了其生命周期方法和非生命周期的方法。在Servlet中,生命周期方法包括:init(ServletConfig config)、destroy()、service(ServletRequest req , ServletResponse res),也就是Servlet初始化、对请求进行响应服务,和Servlet的销毁。

  除了Servlet的生命周期方法,还有非生命周期方法,如getServletConfig()和getServletInfo()方法,这两个方法可以获得有关该Servlet的一些信息。

  Servlet生命周期是指Servlet实例从创建到响应客户端请求,最后销毁的过程。具体过程如下:

  1,  Server创建一个Servlet的实例,也就是调用了init()方法;

  2,  一个客户端的请求(对象)到达Server;

  3,  Server将请求发送给Servlet;

  4,  Servlet生成对请求的响应(对象);

  5,  Server激活Servlet的service()方法,传递请求对象和响应对象作为参数;

  6,  Service()方法获得请求对象的信息,处理请求,访问资源,获得所需的信息;

  7,  Service()方法使用响应对象的方法,将响应传回Server,最终到达客户端。Service方法还可能激活其他方法处理请求,如doGet()或者doPost()方法;

  8,  对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此Servlet的service方法,将这两个对象作为参数传递给它,无需再调用init()方法。一般Servlet只初始化一次。当Server不在需要Servlet时(一般是Server关闭),Server调用Servlet的destroy()方法销毁Servlet。

  从以上可以看出,Servlet生命周期上得三个方法是由服务器调用,可以说是在Servlet存在开始到销毁这个过程中的某个时刻(如果有事件触发)则必定会被执行的方法称为生命周期方法。

  因此,在Servlet中最重要的就是service()方法,要想从服务器端将资源传回客户端或者向客户端发送数据,都将在service()方法中进行。

  从service(ServletTequest req , ServletResponse res)方法来看,不仅service()方法是由服务器调用执行,连ServletTequest请求对象和ServletResponse响应对象也是由服务器提供,如果我们要写一个简单的数据给客户端,就可以在service()方法中操作ServletResponse响应对象:

  作为入门,那么我们先不用开发工具IDE来写Servlet,而是先手工编写,这样有助于理解Servlet的底层原理。在Tomcat的【webapps】目录下建立我的web应用,web应用所在目录为【myservlet】,并且根据《Tomcat详细学习方法(三)》中所讲的web应用的组织结构,我们先在【myservlet】目录下创建【WEB-INF】,并且再在【WEB-INF】中创建【classes】目录,【lib目录】和web.xml文件,在【classes】目录中,建立我的Java程序:FirstServlet.java

   

  因为自己编写的Servlet是由服务器调用,因此我们所创建的Servlet实现类一定要是公共的,开始说了,我们没必要实现Servlet的全部方法,因此我们向客户端传数据只需要复写service()方法即可,那么我们只需要继承Servlet的实现类,接着取得相应对象ServletResponse的输出流ServletOutputStream就可以向客户端输出数据了,同时因为输出是字节流,所以需要将字符转换成字节数组,再手动写入自定义包名和要导入的Java包:

package fjdingsd.web;

import java.io.*;
import javax.servlet.*; public class FirstServlet extends GenericServlet{
public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException
{
OutputStream out = res.getOutputStream();
out.write("Hello Servlet".getBytes());
}
}

  使用cmd对这个Java程序进行编译,但要注意,“javac”这个只是默认导入了J2SE的包,而没有J2EE的包。那么我们去哪里找J2EE的Servlet包呢?其实,因为Tomcat支持Servlet所以Tomcat的【lib】目录包含了Servlet的JAR包:

  

  所以我们在cmd中应该先进行这一步设置环境变量:set classpath = %classpath% ; 路径/servlet-api.jar

  

  接着就可以对刚才的Java程序进行编译了:javac  –d  .   程序名.java

  (“-d”代表后面一个命令为.class文件存放目录,“.”代表当前目录)

  编译成功后可以再看web应用所在目录中已经有了字节码文件和包名了:

  

  当然,现在已经有了Servlet的程序,但是浏览器还不能来访问,因为这个Servlet程序还没设置对外访问路径。那么从哪里将我们刚刚创建好的Servlet字节码文件配置成浏览器能访问到的路径呢?

  答案就是在这个web应用中的web.xml文件中,现在我们只取最简洁的格式,如 《Tomcat详细学习方法(三)》中所说,将Tomcat的web.xml这个“模板”中的头和尾复制进自己的web.xml文档中,还要复制一些,见下图:

  

  这里就有比较重要的知识点了,<servlet>和<servlet-mapping>中的<servlet-name>必须保持一致,<servlet>中的<servlet-class>必须有完整包名和类名,而<servlet-mapping>中的<url-pattern>就是我们可以设置的对外访问路径了,可以自定义路径。这个路径的设置可以不写,则为缺省值,那么浏览器中的输入地址只要有web应用名即可,但是即使设为缺省值,在<url-pattern>中,内容也一定要有斜线:“/”。

  

  这时候,将Tomcat服务器开启,就能在浏览器中访问刚才写好的Servlet程序了,输入的格式为:主机名:端口(80不需要)/web应用名/对外访问路径

  

  如果是对于Servlet的访问,那么只需要写到对外访问路径即可,如果写了Servlet的名称也是无法访问的,如下图:

  

  还有一个问题,如果对于多个Servlet在xml文件中的对外访问路径都配置一样的话,同样不能访问,如下图:

  

  

  因此,不同的Servlet请在自定义web.xml中配置不同的对外访问路径。

Servlet的学习(一)的更多相关文章

  1. Servlet的学习之Filter过滤器技术(1)

    本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...

  2. Servlet的学习(四)

    在本篇的Servlet的学习中,主要来学习由使用MyEclipse来开发Servlet的一些小细节. 细节一:在web.xml中可以对同一个Servlet配置多个对外访问路径,并如果在web.xml中 ...

  3. Servlet的学习之Session(3)

    在上一篇<Servlet的学习之Session(2)>我们知道了Session能实现一个会话过程中保存数据或者多个会话中实现同一个Session的关键因素就是Cookie,只是Cookie ...

  4. Servlet的学习之Session(2)

    在上一篇中我们学习了Session对象默认在一个会话过程中,由服务器创建,能保存在这个会话过程中用户访问多个web资源时产生的需要保存的数据,并在访问服务器中其他web资源时可以将这些数据从Sessi ...

  5. Servlet的学习之Session(1)

    在学习完了Servlet中的Cookie技术后,我们再来学习另一个能保存会话数据的技术——Session. Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其 ...

  6. Servlet的学习之Cookie

    从本篇开始学习Servlet技术中的Cookie专题. 首先来了解什么是“会话”.会话是web技术中的一个术语,可以简单的理解为:用户打开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭 ...

  7. Servlet的学习之Request请求对象(3)

    本篇接上一篇,将Servlet中的HttpServletRequest对象获取RequestDispatcher对象后能进行的[转发]forward功能和[包含]include功能介绍完. 首先来看R ...

  8. Servlet的学习之Request请求对象(2)

    在上一篇<Servlet的学习(十)>中介绍了HttpServletRequest请求对象的一些常用方法,而从这篇起开始介绍和学习HttpServletRequest的常用功能. 使用Ht ...

  9. Servlet的学习之Response响应对象(3)

    本篇来说明响应对象HttpServletResponse对象的最后一点内容. 首先来看响应对象控制浏览器定时刷新,在我的web应用[myservlet]中创建Servlet,在该Servlet中设置响 ...

  10. Servlet的学习之Response响应对象(2)

    本篇接上一篇<Servlet的学习之Response响应对象(1)>,继续从HttpServletResponse响应对象来介绍其方法和功能. 使用setHeader方法结合HTTP协议的 ...

随机推荐

  1. Python之路Day8

    摘要: Socket编程 异常处理 线程.进程 1.socket编程 1.1 socket 三次握手,注意阻塞的应用. 1.2 socketserver(2.x写作:SocketServer) 实现多 ...

  2. python成长之路——第六天

    定义 Python 的 Class 比较特别,和我们习惯的静态语言类型定义有很大区别. 1. 使用一个名为 __init__ 的方法来完成初始化.2. 使用一个名为 __del__ 的方法来完成类似析 ...

  3. FreePascal的VMT与Delphi不一致,没有负方向

    因为不需要与C++兼容嘛:http://www.freepascal.org/docs-html/prog/progsu168.html 如果要想取得它真正的VMT,可以Pointer强行转换+100 ...

  4. Flask web开发 处理POST请求(登录案例)

    本文我们以一个登录例子来说明Flask对 post请求的处理机制. 1.创建应用目录,如 mkdir   example cd example 2.在应用目录下创建  run.py文件,内容如下 fr ...

  5. gradle项目与maven项目相互转化(转)

    根据build.gradle和setting.gradle文件生成idea项目: gradle idea gradle这几年发展迅猛,github越来越多的项目都开始采用gradle来构建了,但是并不 ...

  6. 带符号的char类型取值范围为什么是-128——127

    以前经常看到带符号的char类型取值范围是-128——127,今天突然想为什么不是-127——127,-128是怎么来的? 127好理解,char类型是8位,最高位是符号位,0正1负,所以011111 ...

  7. cocos2dx 3.0 飞机大战

    因为课程须要.然后又水平有限.所以写了个飞机大战.加上不会画画.所以图片资源也是从微信apk解压出来的,设计思路參考的偶尔e网事. 闲话不说.先讲一下设计.大体上一共分为3个场景.场景以下是Layer ...

  8. PyDev下PyQt 的尝试

    刚刚装完PyDev ,试了下之前写的调用PyQt的下代码,发现运行出错:搜索只还需在System PYHONPATH下 添加PyQt的路径,步骤如下: eclipse--window--Prefere ...

  9. JSP中使用cookie存储中文

    今天看J2EE的时候,看见书上讲到使用cookie保存信息的时,看到书上举得例子都是英文的键值对,我就想中文是不是一样呢?试了一下果然不一样.废话不多说,直接上代码: 比如说有addCookie.js ...

  10. Qt学习之路:自定义Model三篇,自定义委托等等

    http://devbean.blog.51cto.com/448512/d-8/p-2