标题: servlet入门Z
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2003-9-27 21:18  资料  个人空间  主页 短消息  加为好友 
1.进入Servlets

第一章回答“什么是Servlet?”,显示Servlet的有代表性的用法,比较Servlets和CGI程序,Servlet的基本结构和生命周期。它也给出对HTTP的快速介绍和它的实现在HttpServlet类中。

1.1Servlet是什么?

Servlet是运行在服务器端,用来响应客户端请求的java代码模块。Servlets并没有跟客户端的特定协议绑定,但是通常使用的是HTTP,通常所用的Servlet指的就是“HTTP Servlet”。

Servlet在javax.servlet(基本的Servlet框架)和javax.servlet.http(为Servlet响应HTTP请求的Servlet框架的扩展)包中作为Java的标准扩展类使用。

HTTP Servlets的典型应用包括:

处理 and/or 存取被HTML form提交的数据
提供动态的内容,例如,给客户端返回数据库的查询结果。
管理无状态HTTP的状态信息,例如,在线购物卡管理系统中,管理同时访问的顾客的购物卡使它能够正确标识每个请求。
1.2 Servlets VS CGI

传统的给Web服务器添加功能的方式是用CGI(Common Gateway Interface),独立的接口语言允许启用一个外部服务通过环境变量取得请求信息,命令行和标准的输入流把答复的数据写到标准的输出流中。每个请求被CGI程序或CGI脚本(通常用Perl这样的解释语言写的CGI)的不同实例的不同进程响应.

Servlets比CGI有几个优势:

一个Servlet并不运行在一个独立的进程,而是会为每个请求产生新的进程。
Servlet被请求过后就驻留在内存中了,CGI程序对于每个CGI请求都要被装载运行一次。
仅用一个实例响应所有同时发生的请求,这不仅节省了内存也使得Servlet容易管理持续不断的数据。
Servlet能够被有约束的Sandbox中的Servlet 引擎运行。
1.3 基本的Servlet结构

最普遍形式的Servlet是执行javax.servlet.Servlet接口类的实例。然而,许多Servlet都是扩展标准的接口,命名为,javax.servlet.GenericServlet和javax.servlet.http.HttpServlet。在该教程中我们将讨论javax.servlet.http.HttpServlet的扩展类HTTP Servlets。

为了初始化一个Servlet,服务器应用装载Servlet类,并为调用产生一个实例。然后,调用Servlet的init(ServletConfig config)方法,在这个方法中Servlet将预执行一次设置过程并存储ServletConfig对象,这样在以后调用Servlet的getSErvletConfig()方法时就可以检索到,这是被GenericServlet处理的。GenericServlet(或其子类HttpSErvlet)扩展的Servlet为了使用这个特征,在开始的init方法中调用 super.init(config)。ServletConfig对象含有Servlet参数和Servlet的ServletContext。init方法保证在Servlet的生命周期中仅被调用一次。它不需要是线性安全的因为在调用init还没有返回之前service方法不能够被调用。

Servlet被初始化后,service(ServletRequest req,ServletResponse res)方法被Servlet的每个请求所调用。这个方法是同时被调用的所以它应该是在线性安全的方式下被执行。保证service方法不被同时调用的技巧在第四节有所描述,但这是不太可能的情况。

当Servlet需要被卸载的时候调用destroy()方法,在调用destroy()之前,线程一直是在执行service()方法,所以destroy()是线性安全的。在init()方法中分配的资源在destroy()中被释放。destroy()方法在Servlet的生命周期中仅被调用一次。

1.4 HTTP

在开始写第一个Servlet之前,我们有必要知道一下HTTP("HyperText Transfer Protocol")的基础,这个协议是被WWW客户端用来传送请求到Web服务器的。

HTTP is a request-response oriented protocol. An HTTP request consists of a request method, a URI, header fields and a body (which can be empty). An HTTP response contains a result code and again header fields and a body.

HttpServlet的service方法根据不同的HTTP请求,发送请求给不同的Java的方法。它可以识别标准的HTTP1.1的方法。该方法有: GET, HEAD, PUT, POST, DELETE, OPTIONS and TRACE。其他方法用来响应HTTP的错误请求,一个HTTP方法XXX在java中则为doXxx,例如 GET->doGet。所有的方法预置参数"(HttpServletRequest req,HttpServletResponse res)"。doOptions和doTrace 方法在适当的时候被缺省执行但通常情况下是不被理会的。HEAD方法被doGet调用执行并忽略这方法的任何输出。

请求的数据通过HttpServletRequest(ServletRequest的之类)类型的参数传给所有的方法,响应被第二个参数HttpServletResponse产生。

在Web浏览器中请求一个URL时,用GET方法来请求。GET请求没有一个主体,响应应该有一个包含响应数据和描述主题的主体。当你发送一个HTML表单时,GET或POST 都能被使用。随着GET请求参数被编码进URL中,用POST请求他们在主体中被传送。HTML编辑和上载工具用PUT请求去上载资源到Web服务器和用DELETE请求去删除资源。





不要问我结果 我只研究过程与思路
无双客栈
顶部
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2003-9-27 21:20  资料  个人空间  主页 短消息  加为好友 
[COLOR=blue]第二章(第1节) 一步一步学Servlets[COLOR=blue]
http://jspzone.myrice.com/beginner/tech.htm

这章作为Servlet教程,通过写一些有代表性的Servlets,从简单到复杂的例子,来学习Servlet开发的关键技术。这章中的所有例子都已经成功编译和运行过的,完全是Servlet的程序。

2.1 Hello World!

这节将教你:

用框架去建一个简单的Servlet

写一个Servlet提供静态的内容

我们用众所周知的"Hello World"例子来,开始我们的Servlet编程:
CODE

HelloClientServlet.java
     1: import java.io.*;
       2: import javax.servlet.*;

       3: import javax.servlet.http.*;

       4:

       5: public class HelloClientServlet extends HttpServlet

       6: {

       7: protected void doGet(HttpServletRequest req,

       8: HttpServletResponse res)

       9: throws ServletException, IOException

      10: {

      11: res.setContentType("text/html");

      12: PrintWriter out = res.getWriter();

      13: out.println("<HTML><HEAD><TITLE>Hello Client!</TITLE>"+

      14: "</HEAD><BODY>Hello Client!</BODY></HTML>");

      15: out.close();

      16: }

      17:

      18: public String getServletInfo()

      19: {

      20: return "HelloClientServlet 1.0 by Stefan Zeiger";

      21: }

      22: }


编译这个Servlet在浏览器中打入它的URL就可以看到输出了。

下面我们来看看Servlet是如何工作的。

1到3行中引入了一些含有Servlet使用类的包(几乎所有的Servlet都要使用这些包中的类)
CODE

            1: import java.io.*;
           2: import javax.servlet.*;

           3: import javax.servlet.http.*;
 

这个Servlet是在第5行被声明的,它是扩展javax.servlet.http.HttpServlet,它的标准基类是HTTP Servlets。
CODE

            5: public class HelloClientServlet extends HttpServlet  

  7到16行是HttpServlet的doGet方法

            7: protected void doGet(HttpServletRequest req,
           8: HttpServletResponse res)

           9: throws ServletException, IOException

          10: {

                    ...

           16: }
 

在11行我们用HttpServletResponse对象的方法去设置我们要发送的响应对象的适当类型。在用PrintWriter或ServletOutputStream前要先定义response header。

CODE

                   11: res.setContentType("text/html");  

在第12行我们请求一个PrintWriter对象去写文本到响应信息。
CODE

                   12: PrintWriter out = res.getWriter();  

ServletResponse.getWrite()是JSDK 2.0版本的一个新特征,如果你的Servlet引擎不支持JSDK 2.0,你可以用“ServletOutputStream out=res.getOutputStream();”代替这一行。在该教程中的大部分例子都用到了这个新的特征。使用ServletResponse.getWriter()的好处在4.4节讨论。

在13、14行,我们使用PrintWriter去输出text/html类型的文本。
CODE

                  13: out.println("<HTML><HEAD><TITLE>Hello Client!</TITLE>"+
                 14: "</HEAD><BODY>Hello Client!</BODY></HTML>");
 


当我们输出完成后,在15行,把PrintWriter关闭。
CODE

                 15: out.close();  

这行是为了完整性,并不是严格要求的,当service调用返回时,Web服务器自动关闭PintWriter或ServletOutputStream。对客户端的响应完全被输出以后,你想做一些Post处理,那么明确调用close()是很有用的。调用close()告诉Web服务器响应已经完成,对客户端的连接可以关闭了。

18到20行getServletInfo()方法的目的是返回Servlet的相关信息,例如Servlet的名字、版本、作者、版权。这不是HelloClientServlet的功能所必须的,但是可以给Servlet用户提供有价值的信息。
CODE

                  18: public String getServletInfo()
                 19: {

                  20: return "HelloClientServlet 1.0 by Stefan Zeiger";

                  21: }
 

 





不要问我结果 我只研究过程与思路
无双客栈
顶部
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2003-9-27 21:23  资料  个人空间  主页 短消息  加为好友 
第二章(第2节) 一个处理表单的Servlet
我们将要写的下一个Servlet是通过HTML表单提供一个邮件列表的用户接口。用户可以在文本框中输入邮件地址然后按提交按钮或者取消按钮。

Servlet由两个主要部分组成:数据管理和客户交互作用。

数据管理

数据管理对于有经验的java程序员来说是相当直观的。我们用一个包含邮件地址的java.lang.Vector对象作为一个字符串,当Servlet被预置以后,Servlet可以保持曾经请求过的数据,这样可以节省每次被请求改变所花的时间。有两种途径可供你选择,可以在Servlet被激活的时候把列表保持在内存中或者在destroy方法中把它写到硬盘。这个虽然节约了每次变化发生后保留地址列表的开支,但是它没有自动防止故障危害。如果由于某些原因地址文件不能被写到硬盘或者服务器崩溃servlet不能被destroy,所有信息即使用户请求已经得到肯定答复的信息也将丢失。

下面是Servlet中数据管理相关的部分:

CODE

 8:    private Vector addresses;
 9:    private String filename;
10:
11:    public void init(ServletConfig config) throws ServletException
12:    {
13:      super.init(config);
14:      filename = config.getInitParameter("addressfile");
15:      if(filename == null)
16:        throw new UnavailableException(this,
17:                                       "The \"addressfile\" property "+
18:                                       "must be set to a file name");
19:      try
20:      {
21:        ObjectInputStream in =
22:          new ObjectInputStream(new FileInputStream(filename));
23:        addresses = (Vector)in.readObject();
24:        in.close();
25:      }
26:      catch(FileNotFoundException e) { addresses = new Vector(); }
27:      catch(Exception e)
28:      {
29:        throw new UnavailableException(this,
30:                                       "Error reading address file: "+e);
31:      }
32:    }

104:    private synchronized boolean subscribe(String email) throws IOException
105:    {
106:      if(addresses.contains(email)) return false;
107:      addresses.addElement(email);
108:      save();
109:      return true;
110:    }
111:
112:    private synchronized boolean unsubscribe(String email) throws IOException
113:    {
114:      if(!addresses.removeElement(email)) return false;
115:      save();
116:      return true;
117:    }
118:
119:    private void save() throws IOException
120:    {
121:      ObjectOutputStream out =
122:        new ObjectOutputStream(new FileOutputStream(filename));
123:      out.writeObject(addresses);
124:      out.close();
125:    }



  在init中我们首先调用super.init(config)把ServletConfig的管理留给superclass(HttpServlet),然后从一个初始化参数中得到地址文件名。如果参数无效那么Servlet抛出一个javax.servlet.UnavailableException(javax.servlet.ServletException的子类)指示Servlet是暂时或者永久性无效的。最后,init方法重载这个地址文件或者如果地址文件不存在的话就产生一个空的Vector。所有重载期间发生的例外改成UnavailableExceptions。

  Servlet API的2.1版本提供了无参init方法被GenericServlet的init(ServletConfig)方法调用。用这种新方法你不用自己担心传送ServletConfig对象给superclass。





不要问我结果 我只研究过程与思路
无双客栈
顶部
 



当前时区 GMT+8, 现在时间是 2008-12-4 13:51
乐悠LoveUnix论坛-京ICP备05005823号

Thanks to Discuz!  © 2001-2007    Power by LoveUnix.net
Processed in 0.083463 second(s), 6 queries , Gzip enabled

清除 Cookies - 联系我们 - 乐悠LoveUnix - Archiver