不灭的焱

革命尚未成功,同志仍须努力

作者:php-note.com  发布于:2013-04-19 11:52  分类:Java基础 

我们将建立一个名为 com.idv2.learnjsp 的包,用于容纳所有的示例程序。下面我们就看看最基本的Servlet的创建方法。

创建项目

启动eclipse,然后选择菜单File->New->Project…,在新建项目向导中选择 Web->Dynamic Web Project。该项目即为使用Servlet、JSP等技术开发动态网站的项目。


新建一个Dynamic Web Project


下一步,输入项目名 LearnJSP。下面的Target Runtime指定运行这个项目的服务器。 如果选择框中只有<none>,说明你还没有配置服务器,可以单击右侧的New…按钮新建。

Configurations项选择<none>即可。


项目名和配置


下一步选择项目所需的特性,默认的Dynamic Web ModuleJava就足够了。


选择项目特性


下一步是输入相关的目录,这里也直接使用默认值即可。图略。

最后单击 Finish,完成项目创建。创建途中可能会有一个用户使用协议需要你同意, 单击I Agree即可。创建完成后会询问是否要切换到J2EE视图(下图),选择Yes, 完成项目创建。


是否要切换到J2EE视图


项目建立完成后,请在左侧的 Project Explorer 中打开 LearnJSP 项目, 看看它各个部分的构成。


项目视图的各个组成部分

基础知识一节中 我们知道,应用程序由三部分组成,即Servlet、JSP及静态内容、配置文件web.xml。 项目视图中的 src 目录用来保存 Servlet 源代码,WebContent 目录用来保存JSP及静态内容, web.xml则位于 WebContent/WEB-INF/web.xml。但手工编辑 web.xml 比较麻烦, 因此 Eclipse 提供了一套可视化工具用于编辑 web.xml,即最上方的Depolyment Descriptor, 里面包含的内容以后会陆续讲解。

理解Servlet

在Project Explorer中打开Java Resources: src -> Libraries -> Apache Tomcat 5.5 -> servlet-api.jar 文件,可以看到其中包含两个包:javax.servletjavax.servlet.http, 与Servlet有关的类和接口都位于这两个包里面。


Servlet API所在的包


Servlet是一个接口,位于 javax.servlet.Servlet,它规定了每个Servlet所必须实现的方法。 实际应用时我们需要从 javax.servlet.GenericServlet javax.servlet.http.HttpServlet 两个抽象类 继承出自己的Servlet类,并实现所需的功能。这几个类的关系如下(绿色斜体字为抽象类):


Servlet相关类的关系


上图中,Servlet依赖于ServletRequestServletResponse接口,这两个接口负责为Servlet接受和发送信息。 HttpServlet也类似。

Servlet接口

javax.servlet.Servlet接口包含以下的方法:
init()
void init(ServletConfig config) throws ServletException
init方法用于初始化,在Servlet启动时调用。
service()
void service(ServletRequest request, ServiceResponse response) throws ServletException, IOException
Servlet通过这个方法,从request获得客户端请求,处理并生成结果,再通过response发送给客户端。
destroy()
void destroy()
Servlet销毁时执行的方法。
getServletInfo()
String getServletInfo()
将Servlet的信息通过字符串返回。
getServletConfig()
ServletConfig getServletConfig()

获取包含Servlet各种信息的ServletConfig对象。


当某个Servlet第一次被请求时,服务器(Servlet容器)会生成该Servlet并调用它的init()方法, 再调用其service()方法处理请求。处理结束后该Servlet会常驻于容器中,下一个请求则不再 重新生成Servlet,而是直接调用常驻的Servlet对象的service()方法。 服务器停止时,会调用该Servlet的destroy()方法。


因此,在Servlet的一个生命周期中,init()destroy()仅会被调用一次, 而service()则会被调用多次。


GenericServlet抽象类

javax.servlet.GenericServlet为我们实现了Servlet接口的大部分方法,除了service()方法之外。 因此,我们在制作自己的Servlet时,只需要继承GenericServlet并重载service()方法即可。


典型的Servlet示例

下面我们来做一个典型的Servlet。

在eclipse左侧的Project Explorer中,右键单击Java Resources: src目录(以后简称src目录), 选择New->Class,建立如下所示的类。


建立Servlet类


包名输入我们要建立的 com.idv2.learnjsp,类名为 HelloServlet,父类为 javax.servlet.http.GenericServlet。 在输入父类名时,你会看到输入框左侧有个小灯泡的图标,这说明可以通过 Alt-/键自动补齐, 因此你只需输入 GenericSer 几个字母,然后按 Alt-/ 组合键,系统会自动查找开头为 GenericSer 的类 并补齐剩余部分。


Finish之后eclipse会为我们生成代码框架,我们只需填入实际的处理代码即可。 代码可以从这里下载。

 

示例下载:helloservlet.zip

 

上述代码是UTF-8编码,如果你直接放到src目录中有可能出现乱码, 这时请选择Windows->Preferences…菜单,选择左侧的General->Workspace, 然后将Text file encoding设置为UTF-8即可。


代码写好后,从Project Explorer中打开项目的 build 目录,可以看到eclipse自动编译了 HelloServlet.java并生成了 com/idv2/learnjsp/HelloServlet.class 文件。


那么如何在服务器上运行它呢?首先必须要做的就是在配置文件 web.xml 中登记这个Servlet。 刚才我们在建立 HelloServlet 类时,并没有声明它是一个Servlet,这样服务器就无法将它 作为Servlet执行,因此必须先登记,并为它指定一个URL(即Servlet Mapping)。


右键单击Depolyment Descriptor中的Servlets,选择New->Servlet,出现下面的画面。


登记Servlet


因为我们已经写好了HelloServlet类,因此选中Use existing Servlet class, 然后单击右侧的Browse…按钮,选择HelloServlet类。下一步。


设置Servlet名称和URL映射


URL映射是指,浏览器通过哪个URL能访问到这个Servlet。 默认与Servlet名称相同,为了演示,我们这里将他修改为小写的 /helloservlet

实际的URL格式为 http://主机名/应用程序名/Servlet的URL映射, 我们这个Servlet的URL就应当是 http://localhost:8080/LearnJSP/helloservlet。

单击Finish完成添加Servlet。如果你有兴趣可以打开 WebContent/WEB-INF/web.xml, 可以看到刚才的修改在web.xml中是怎样的结果。

下一步我们需要将它部署到服务器上。打开eclipse下方的Servet栏, 可以看到系统中的服务器列表。


Server栏


如果你找不到Server栏,请通过主菜单Window->Show View->Others添加Server栏; 如果你的Server栏中什么都没有,请在Server栏中单击

右键然后 New->Server

右键单击服务器,选择Add and Remove Projects…,将 LearnJSP项目添加到服务器上。 添加之后的结果如下:


Server栏


最后右键单击服务器,选择Start,片刻即可看到在Console栏中输出大量的信息,服务器启动了。 打开浏览器,访问 http://localhost:8080/LearnJSP/helloservlet。 如果能看到“Hello Servlet”的输出,则恭喜你,第一个Servlet成功运行了!

刷新浏览器页面几次,然后回到eclipse下侧的Console栏,可以看到下面的字样:

init() was called. service() was called. service() was called. service() was called.
这是我们加入的调试信息。这些信息说明了Servlet的一个生命周期中 initservicedestroy函数的执行过程。 如果在Server栏中停止服务器,那么你可以在Console栏中的信息中找到 destroy() 函数的执行。
 
 

延伸阅读:

Servlet/JSP学习笔记(1)-基础知识

Servlet/JSP学习笔记(2)-Servlet入门

Servlet/JSP学习笔记(3)-HttpServlet

Servlet/JSP学习笔记(4)-从配置文件获取参数

Servlet/JSP学习笔记(5)-Session和作用域

Servlet/JSP学习笔记(6)-Filter的应用